TI中文支持网
TI专业的中文技术问题搜集分享网站

ZigBee EndDevice休眠设备重启后不能恢复网络

各位大虾们

        最近发现  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

赞(0)
未经允许不得转载:TI中文支持网 » ZigBee EndDevice休眠设备重启后不能恢复网络
分享到: 更多 (0)