ZigBee EndDevice休眠设备重启后不能恢复网络
各位大虾们
最近发现 EndDevice休眠设备重启后不能恢复网络,已经打开了 NV_RESTORE 和 NV_INIT 编译选项,反复的复位实现 发现有回复不了网络的情况,而且还很频繁,
在上电复位后看Log打印发现 如果能够调用一次AF_DataRequest函数(暂时不知道是哪里调用),则能够正常恢复,反之如果系统没有调用则又重新扫描网络,不能恢复加入原有网络,谁能帮忙解答一下,谢谢
不太明白你提到的不能恢复网络是什么意思?
设备在重新上电以后,首先应该会发送Orphan Notification,协调器有回复Coordinator Realignment吗?
首先谢谢回答:
不能恢复网络的意思是 已经成功加入到A协调器网络(可以上报数据,并相互通讯),然后重启EndDevice设备,重启后EndDevice不能恢复网络,又开始进入待组网状态(协调器修改为默认是不允许加入),并且如果有B协调器存在并允许加入,EndDevice设备又会加入到B协调器,就是没有能够恢复原来网络。
你说的上电发送Orphan Notification,如果没发送,程序里面在哪里判断?
Do you erase flash before you program 2530 image?
如果使能了NV_RESTORE的话,节点原先加过网,复位以后还是保存了原先网络参数,肯定不会加到其他协调器里面去的。
你自己在协议栈里面有没有在复位开始的地方修改 startoption过。 另外协议栈中有一个按键的nv bypass功能,在你的硬件上面是不是这个按键生效了。
uint8 ZDOInitDevice( uint16 startDelay ) { uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; uint16 extendedDelay = 0; if ( devState == DEV_HOLD ) { // Initialize the RAM items table, in case an NV item has been updated. zgInitItems( FALSE ); } ZDConfig_InitDescriptors(); //devtag.071807.todo - fix this temporary solution _NIB.CapabilityFlags = ZDO_Config_Node_Descriptor.CapabilityFlags; #if defined ( NV_RESTORE ) // Get Keypad directly to see if a reset nv is needed. // Hold down the SW_BYPASS_NV key (defined in OnBoard.h) // while booting to skip past NV Restore. if ( HalKeyRead() == SW_BYPASS_NV ) networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; else { // Determine if NV should be restored networkStateNV = ZDApp_ReadNetworkRestoreState(); } if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) { networkStateNV = ZDApp_RestoreNetworkState(); } else { // Wipe out the network state in NV NLME_InitNV(); NLME_SetDefaultNV(); // clear NWK key values ZDSecMgrClearNVKeyValues(); } #endif
没有擦除Flash,不是一直不能恢复,也没有什么规律,有时候重启10次的话 大约有两次不能恢复,有时候可能10次有五六次不能恢复
我之前注意过这里,我程序里面已经关闭了按键操作 #define HAL_KEY FALSE 屏蔽了按键,这个地方应该不会擦除了吧?我先屏蔽掉试试吧!
我现在是在一个工程文件里面实现的Coordinate 和 Router 和 EndDevice,只是我自己的应用层不一样,后两者的硬件也是差不多,并且Router复位后恢复网络没有问题,我先屏蔽掉ZDOInitDevice 里面判断的代码试试
这样吧,先不要使用有你自己应用程序的软件了。直接拿TI的官方协议栈例程,没有做过任何改动的情况下做下测试,在使能NV_RESTORE的情况下。
首先排除下到底是软件的问题,还是硬件的问题。
按照你说的 用TI的官方协议栈例程测试,从上午开始测,到现在还未发现不能恢复网络的情况,看来是我后期修改的有问题了。
我先说一下我改的地方吧,我现在协调器上电设置为禁止加入网络NLME_PermitJoiningRequest(0),通过按键允许NLME_PermitJoiningRequest(10),
EndDevice上电后调用 devState = DEV_INIT; ZDOInitDevice(0);
1、增加了预编译NV_RESTORE和NV_INIT
2、打开了数据加密SECURE=1、ZG_SECURE_DYNAMIC=1
3、开启了ZDO_MGMT_LEAVE_REQUEST、ZDO_MGMT_LEAVE_RESPONSE、ZDO_MGMT_PERMIT_JOIN_RESPONSE实现
4、指定ZDO_UseExtendedPANID(与协调器zgApsUseExtendedPANID对应)
5、按照官网配置方法配置过MTO
不知道上述这些对不能恢复网络有没有影响?
我在休眠之前调用
NLME_SetPollRate( 0 );
NLME_SetQueuedPollRate( 0 );
NLME_SetResponseRate( 0 );
唤醒后调用
NLME_SetPollRate( 1000 ); // 60 000ms = 1 min
NLME_SetQueuedPollRate( 100 );
NLME_SetResponseRate( 100 );
是不是这个影响的?
你要改的话就改NLME_SetPollRate( 1000 ); 就可以了,其他的不要改。
另外你测试不能入网,你看到的空中数据包是什么,有什么异常吗
ZG_SECURE_DYNAMIC=0
只改这一个的话 NLME_SetPollRate( 1000 ); 程序会100毫秒左右就唤醒一次,不能进入我先要的15S唤醒一次。
现在还有一个问题, 测试过程是这样的:EndDevice设备加入A协调器网络,通讯正常,然后关闭(断电)协调器和终端设备,
打开B协调器电源,打开EndDevice设备电源,这时EndDevice设备会重新加入B协调器网络,(协调器默认是关闭了允许加入的),
不知道为什么会组到B协调器?而没有恢复原来的A网络?
就是 简单的 断电上电吗?
请问 你用的时候什么版本的zstack ?
我用HA1.2.2A 的 发现了 终端设备 在发出rejoin request 的时候, 如果长时间没有收到response的话,它就会自己删掉自己的NWK KEY ,然后把自己的NV flash 里面的信息删掉,
接着 无论任何协调器 一开permit join 它就加进去了!
情况和你有点类似, 但是复现 的方法和你不一样!
你可以在ZDAPP.C 里面看一下是不是 复位了!
对 就是 简单 断电上电
我用的版本是Z-Stack Mesh 1.0.0
我现在协调器不开permit join 他都能加入 所以比较郁闷