现象
- ZNP作为协调器,负责OTA server,其他Router给协调器发送Query Next Image Request(COMMAND_QUERY_NEXT_IMAGE_REQ),结果协调器一直收不到任何消息,也就是进不到zclOTA_HdlIncoming消息循环,所以后面什么block request下载固件更是无从谈起了。
描述
- 使用Ubiqua 抓包工具,可以看到Router的确是发出了Query Next Image Request,但是在ZNP端打断点就是收不到任何消息
在Router 端打断点,发送给ZNP地址和数据都没有错误,地址是0x0000
原因
- 原因是在Z-Stack 3.0协议栈中,由于没有定义ZCL_STANDALONE宏,所以在zclOTA_Init函数里面注册的cluster endpoint,会注册给zcl_TaskID,也就是zcl_TaskID这个任务消息循环会收到AF层发来的AF_INCOMING_MSG_CMD消息,在ZNP工程中,这个变量被默认赋值为znpTaskId,见如下代码:
#if defined TC_LINKKEY_JOIN
zcl_TaskID = znpTaskId;
#endif
- 在ZNP的消息循环znpEventLoop中,处理AF_INCOMING_MSG_CMD消息并没有调用zcl_ProcessMessageMSG,而是把消息丢给了MT_AfIncomingMsg,所以Router发过来的Query Next Image Request,在ZNP工程里面,是根本不可能调用zcl_registerPlugin注册的回调函数zclOTA_HdlIncoming的,只会调用MT_AfIncomingMsg,这也就是为什么在zclOTA_HdlIncoming回调函数里面打断点,程序一直运行不到这里。
// Endpoint for OTA Cluster
static endPointDesc_t zclOTA_Ep =
{
ZCL_OTA_ENDPOINT,
0,
#ifndef ZCL_STANDALONE
&zcl_TaskID,
#else
&zclOTA_TaskID,
#endif
( SimpleDescriptionFormat_t * ) &zclOTA_SimpleDesc,
( afNetworkLatencyReq_t ) 0
};
// Register for the cluster endpoint
afRegister ( &zclOTA_Ep );
// Register as a ZCL Plugin
zcl_registerPlugin ( ZCL_CLUSTER_ID_OTA,
ZCL_CLUSTER_ID_OTA,
zclOTA_HdlIncoming );
- 似乎这个TI设计协议栈znp示例代码中的一个bug,改进方法如下,在znpEventLoop函数中代码做如下修改:
case AF_INCOMING_MSG_CMD:
#if defined ZCL_KEY_ESTABLISH
if (ZCL_KE_ENDPOINT == (((afIncomingMSGPacket_t *)pMsg)->endPoint))
{
zcl_ProcessMessageMSG((afIncomingMSGPacket_t *)pMsg);
}
else
#endif
{
//MT_AfIncomingMsg((afIncomingMSGPacket_t *)pMsg);
zcl_ProcessMessageMSG((afIncomingMSGPacket_t *)pMsg);
}
break;