各位大虾们
最近发现 EndDevice休眠设备重启后不能恢复网络,已经打开了 NV_RESTORE 和 NV_INIT 编译选项,反复的复位实现 发现有回复不了网络的情况,而且还很频繁,
在上电复位后看Log打印发现 如果能够调用一次AF_DataRequest函数(暂时不知道是哪里调用),则能够正常恢复,反之如果系统没有调用则又重新扫描网络,不能恢复加入原有网络,谁能帮忙解答一下,谢谢
VV:
不太明白你提到的不能恢复网络是什么意思??
设备在重新上电以后,首先应该会发送Orphan Notification,协调器有回复Coordinator Realignment吗?
biao zhang5:
回复 VV:
首先谢谢回答:
不能恢复网络的意思是 已经成功加入到A协调器网络(可以上报数据,并相互通讯),然后重启EndDevice设备,重启后EndDevice不能恢复网络,又开始进入待组网状态(协调器修改为默认是不允许加入),并且如果有B协调器存在并允许加入,EndDevice设备又会加入到B协调器,就是没有能够恢复原来网络。
你说的上电发送Orphan Notification,如果没发送,程序里面在哪里判断?
James Chu:
回复 biao zhang5:
Do you erase flash before you program 2530 image?
VV:
回复 biao zhang5:
如果使能了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 restorednetworkStateNV = ZDApp_ReadNetworkRestoreState();}if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ){networkStateNV = ZDApp_RestoreNetworkState();}else{// Wipe out the network state in NVNLME_InitNV();NLME_SetDefaultNV();// clear NWK key valuesZDSecMgrClearNVKeyValues();} #endif
biao zhang5:
回复 James Chu:
没有擦除Flash,不是一直不能恢复,也没有什么规律,有时候重启10次的话 大约有两次不能恢复,有时候可能10次有五六次不能恢复
biao zhang5:
回复 VV:
我之前注意过这里,我程序里面已经关闭了按键操作 #define HAL_KEY FALSE 屏蔽了按键,这个地方应该不会擦除了吧?我先屏蔽掉试试吧!
我现在是在一个工程文件里面实现的Coordinate 和 Router 和 EndDevice,只是我自己的应用层不一样,后两者的硬件也是差不多,并且Router复位后恢复网络没有问题,我先屏蔽掉ZDOInitDevice 里面判断的代码试试
VV:
回复 biao zhang5:
这样吧,先不要使用有你自己应用程序的软件了。直接拿TI的官方协议栈例程,没有做过任何改动的情况下做下测试,在使能NV_RESTORE的情况下。
首先排除下到底是软件的问题,还是硬件的问题。
biao zhang5:
回复 VV:
按照你说的 用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
不知道上述这些对不能恢复网络有没有影响?
biao zhang5:
回复 biao zhang5:
我在休眠之前调用
NLME_SetPollRate( 0 ); NLME_SetQueuedPollRate( 0 ); NLME_SetResponseRate( 0 );
唤醒后调用
NLME_SetPollRate( 1000 ); // 60 000ms = 1 min NLME_SetQueuedPollRate( 100 ); NLME_SetResponseRate( 100 );
是不是这个影响的?
VV:
回复 biao zhang5:
你要改的话就改NLME_SetPollRate( 1000 ); 就可以了,其他的不要改。
另外你测试不能入网,你看到的空中数据包是什么,有什么异常吗
ZG_SECURE_DYNAMIC=0