协调器重启,终端Rejoin失败
非常奇怪的问题,调了两天,真的没辙了。
之前我都是用网上买的zigbee模块调试,网络很简单,一个终端和一个协调器组网连接,协调器断电,终端变为Orphan状态,然后协调器重新上电,终端能够自动和协调器重新连接(Rejoin)。(抓包Rejoin过程:发送信标请求 - 收到信标 - 发送Rejoin请求 - 收到Rejoin响应 - 广播Announce )
之后我将同样的程序,烧录到我自己PCB上的zigbee模块上面,发现协调器重新上电后,终端无法和协调器重新连接。(抓包:发送信标请求 - 收到信标 - 不会发送Rejoin请求,而是继续发送信标请求。)软件跟踪发现,第一次收到协调器的Beacon后,实际是有执行NLME_ReJoinRequest()的,但在sniffer中发现ReJoin Req没有发送出去。更底层的代码都没有开源,无法跟踪。
虽然我猜测是否是硬件电路原因造成,但除了Rejoin异常,其他功能都是正常的,实在想不出什么样的硬件原因会产生这种现象。
check your XDATA size, it may be the cause.
201 136 bytes of CODE memory
32 bytes of DATA memory (+ 74 absolute )
7 235 bytes of XDATA memory
192 bytes of IDATA memory
8 bits of BIT memory
730 bytes of CONST memory
协调器重启以后建立的网络是否和之前那个一样,PANID是否一样。
另外检查是否有运行到下面的代码处
if ( zdappHoldKeys == SW_BYPASS_NV )
{
zdappHoldKeys = 0; // Only once
networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
}
else
{
// Determine if NV should be restored
networkStateNV = ZDApp_ReadNetworkRestoreState();
}