CC2530 CC2538 ZNP 作为OTA server 出现收不到COMMAND_QUERY_NEXT_IMAGE_REQ消息是什么原因

现象

  • 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值