但是最严重的时候设备的flash都被改变了(比如ZCD_NV_STARTUP_OPTION),导致我就算重新上电,也无法恢复原有的网络,变成了重新加入网络。
Susan Yang:
请问是否预编译了NV_RESTORE?
jian li20:
回复 Susan Yang:
所有设备都开启的NV_RESTORE,我今天继续运行发现,好像是设备被复位了,但是为什么会被复位呢(频繁插拔路由器)
jian li20:
回复 jian li20:
另外我定义了xWDT_IN_PM1,所以应该不是看门狗
jian li20:
回复 jian li20:
if ( events & ZDO_DEVICE_RESET ) {#ifdef ZBA_FALLBACK_NWKKEY if ( devState == DEV_END_DEVICE_UNAUTH ) { ZDSecMgrFallbackNwkKey(); } else#endif { // Set the NV startup option to force a "new" join. zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE ); // The device has been in the UNAUTH state, so reset // Note: there will be no return from this call SystemResetSoft(); }
继续追踪发现,设备运行到这里了。强制恢复成一个新设备了。
这是什么原因导致的呢?我是否可以把zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
jian li20:
回复 jian li20:
继续追踪,发现设备给路由发送了很多的NWK REJOIN REQUEST,然后路由给设备发送了一个NWK LEAVE,设备收到NWK LEAVE之后,复位了设备。
我在路由上开启了CHILD_AGING功能,这会导致路由发送NWK LEAVE命令吗?
jian li20:
回复 jian li20:
求解答,各位大神。
jian li20:
回复 jian li20:
继续追踪发现,
我断开路由器之后,设备显示恢复成孤儿设备,没有其他路由和协调器接收该孤儿设备,
然后设备会去寻找可加入的网络,如果找到可以加入的网络,设备会发送rejoin命令,
此时协调器只能加入6台终端设备,但是有8台设备搜索到可以加入网络,并且都发送了nwk rejoin request,
前6台设备都收到了nwk rejoin response,后2台设备因为AssociatedDevList已满,所以协调器发送了nwk leave
而终端设备收到leave命令后改写了ZCD_NV_STARTUP_OPTION,然后执行了复位。
所以之后设备就按一个新的设备去加入网络了。而不是恢复网络了。
不知道理解是否正确,这是分析包看到的结果。
暂时的改善方法是:
// Set the NV startup option to force a "new" join. //zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE ); //屏蔽了这两句话 // The device has been in the UNAUTH state, so reset // Note: there will be no return from this call //SystemResetSoft(); //屏蔽了这两句话
暂时测试还没有问题。