Z-stact 3.0.1 安装包没有透传的例程,试图自己用GenericApp修改实现。测试方式是首先每个节点把自己的短地址通过串口打印出来,然后通过串口给节点发送一个16位数据(另一节点打印出的地址值),节点将这个数据作为目的地址做一次发送数据包操作。每个节点发生GenericApp的SYS_EVENT_MSG事件或者ZDApp的SYS_EVENT_MSG事件时都会打印相关信息。
但目前不是很顺利,Sniffer观察到每个数据包都发出去了,对应的目的节点似乎也有回应的数据包发出,但是目的节点并没有发生ZCL_INCOMING_MSG之类的事件,即应用层没有收到数据(出现过几次CO能接收到数据但所有节点重启之后又收不到了,代码几乎没动),网络层因为没有开放代码就没法观察到发生了什么。
主要处理过程(增加的部分)如下:
1,zclGenericApp_Init()中创建一个endpoint,CO、RO、ED的代码相同,即endpoint相同;创建endpoint的代码如下:
endPointDesc_t * create_GenericApp_endpoint(void)
{
endPointDesc_t *epDesc;
static cId_t cluster_id = 1234;//随便定一个值
epDesc = (endPointDesc_t*)osal_mem_alloc(sizeof(endPointDesc_t));
if(epDesc)
{
epDesc->endPoint = 1;//随便定一个值
epDesc->task_id = &zclGenericApp_TaskID;
epDesc->latencyReq = noLatencyReqs;//Ignore
epDesc->simpleDesc = (SimpleDescriptionFormat_t*) osal_mem_alloc( sizeof(SimpleDescriptionFormat_t) );
if( epDesc->simpleDesc )
{
epDesc->simpleDesc->EndPoint = 1;//随便定一个值
epDesc->simpleDesc->AppProfId = 114;//随便定一个值
epDesc->simpleDesc->AppDeviceId = 114;//随便定一个值
epDesc->simpleDesc->AppDevVer = 0;
epDesc->simpleDesc->AppNumInClusters = 1;
epDesc->simpleDesc->pAppInClusterList = &cluster_id;
epDesc->simpleDesc->AppNumOutClusters = 1;
epDesc->simpleDesc->pAppOutClusterList = &cluster_id;
}
}
return(epDesc);
}
2,节点上电后一段时间调用bdb_StartCommissioning()进行组网。这部分观察到组网之后每个节点的devState的值都与节点本身对应,组网应该是成功了。
3,串口收到一个16位数据之后在zclGenericApp_event_loop()处理GENERICAPP_EVT_1事件时调用AF_DataRequest()发送一个数据包给指定地址的节点,CO、RO、ED的代码相同(实际发送的目的地址不同),代码如下:
…
if(app_send_flg)
{
char *str="This is a massage!\n";
app_send_flg = 0;
if( (ndAddr.addr.shortAddr==0xFFFC) || (ndAddr.addr.shortAddr==0xFFFD) || (ndAddr.addr.shortAddr==0xFFFF) )
{
ndAddr.addrMode = afAddrBroadcast; //广播
}
else
{
ndAddr.addrMode = afAddr16Bit;
}
if( AF_DataRequest( &ndAddr, epDesc, 1234, strlen(str), str, 0, AF_ACK_REQUEST, AF_DEFAULT_RADIUS ) == ZSuccess)
{
uart_print_str("Send a Data to: ");
uart_print_uint16(ndAddr.addr.shortAddr);
uart_print_str("\n");
}
else
{
uart_print_str("Send failt!\n");
}
}
…
这一步AF_DataRequest()返回都是成功,并且随后都会发生一个0xFD(AF_DATA_CONFIRM_CMD)事件,但是对应的目的节点就是没有任何反应。试过广播模式也没有任何节点有反应。
附件为ED和CO互相发数据过程的sniffer抓包记录,ED给CO发数据使用地址0x0,CO给ED发数据用ED实际打印出的地址: CO与ED传数据不成功180306.psd
CO的编译配置:
SECURE=1
TC_LINKKEY_JOIN
NV_INIT
xNV_RESTORE
xZTOOL_P2
ZAPP_P1
MT_TASK
MT_APP_FUNC
xMT_SYS_FUNC
xMT_ZDO_FUNC
xMT_ZDO_MGMT
xMT_APP_CNF_FUNC
xLEGACY_LCD_DEBUG
xLCD_SUPPORTED=DEBUG
MULTICAST_ENABLED=FALSE
ZCL_READ
ZCL_WRITE
ZCL_BASIC
ZCL_IDENTIFY
ZCL_SCENES
ZCL_GROUPS
ED的编译配置:
SECURE=1
TC_LINKKEY_JOIN
NV_INIT
xNV_RESTORE
xPOWER_SAVING
NWK_AUTO_POLL
xZTOOL_P1
ZAPP_P1
MT_TASK
MT_APP_FUNC
xMT_SYS_FUNC
xMT_ZDO_FUNC
xMT_ZDO_MGMT
xMT_APP_CNF_FUNC
LEGACY_LCD_DEBUG
LCD_SUPPORTED=DEBUG
MULTICAST_ENABLED=FALSE
ZCL_READ
ZCL_WRITE
ZCL_BASIC
ZCL_IDENTIFY
ZCL_SCENES
ZCL_GROUPS
user4975928:
已刪除貼
miffy:
1、你可能就没组网成功,建议你用ubiqua抓包分析一下,看到Device announce了才算成功了
2、AF_DataRequest能返回成功并不代表发送成功,只是放入队列成功
3、EndPoint不是随便定一个值就可以的,你看看coordinator示例和end-device示例为何两边注册的EndPoint都是一样的,为什么这么做你都没搞清楚,当然你不看zcl代码是不行的
user4975928:
回复 miffy:
1.组网应该是成功了的,在CO开启状态下ED节点上电后的devState值会经历 DEV_HOL 》 DEV_NWK_DISC 》DEV_NWK_JOINING 》DEV_END_DEVICE_UNAUTH 》DEV_END_DEVICE 的变化过程, 而咋没有CO的状态下ED节点上电后的devState值是DEV_HOL 》 DEV_NWK_DISC 》DEV_HOL。 ED节点状态成为DEV_END_DEVICE后应该是与CO组网成功了。
2.我调用AF_DataRequest操作后Sniffer抓包能看到有对应的包发出(源地址与目的地址与代码发出的相符),并且目的节点也有对应的“响应”包发出。发送节点也会产生一个0xFD消息事件,在某个帖子里看到说是0xFD是数据包实际发出后硬件中断程序返回的一个消息标志!?
下图是ED(0x0764)发给CO(0x0000)的数据包过程,可以看到随后有CO给ED的一个“响应”的包,说明ED的MAC层是收到了数据包的:
下图是CO(0x0000)发给ED(0x0764)的过程,可以看到随后也有ED的一个“响应”包,
3,EndPoint值在ED和CO两边相同,都是1,两边在这部分用的是一样的代码,其它簇ID什么的也是相同值。 还是这些值不仅要两边相同而且还必须是什么特定的取值吗?
miffy:
回复 user4975928:
现在都不用sniffer抓包,都用ubiqua抓包,然后分析,建议用
user4975928:
回复 user4975928:
@VV
上面帖子里有抓包文件,能否帮忙分析下原因或者指导一下方向 !