1. 终端ZE使用了NV_RESTORE,加入了协调器ZR,协调器也开了NV_RESTORE;
2. 若协调器掉电,重新上电协调器,协调器可以正常与ZE通信;
3. 若ZE掉电,然后重新上电,协调器可以正常与ZE通信;
4.若ZE掉电,协调器断电,ZE重新上电,抓包狗捕捉到ZE发出 orphan notification ,然后就开始发出 Beacon Request信号;然后开启另一个协调器,ZE无法加入新的协调器;
请问有前辈可以指教吗? 终端使用了NV_RESTORE要如何才能加入新网络?
felix shih:
你需要加入 reset 功能
你看一下 ZDApp.c 的 ZDOInitDevice()
去執行這段
#if defined ( NV_RESTORE ) // Hold down the SW_BYPASS_NV key (defined in OnBoard.h) // while booting to skip past NV Restore. 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(); }
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
Aries Lord:
orphan节点顾名思义,要记录原先的父节点,以PANID为判断依据,你新开的协调器PANID与orphan节点的PANID不一致,就不能加。
一个最简单的方法,把NV区擦除
for(n = HAL_NV_PAGE_BEG; n <= HAL_NV_PAGE_END; n++){EA = 0;HalFlashErase(n);while(FCTL & 0x80);EA = 1;}
Jiancan Chen:
回复 felix shih:
hi felix shih,
感谢回复,我使用的是Version 2.5.1a 版本,这一段代码有点区别,ZDOInitDevice()原来的代码是这样的:
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();/*读取NV网络状态的状态*/}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这段代码是通过按键来绕过NV数据恢复,功能与你贴出的版本应该无异。
请问您说的 reset功能是?
zhongwei xu1:
回复 felix shih:
楼上的正解,VV大神曾经也是这么建议的,Aries Lord的方法要求对NV比较了解,都可以尝试下!
zhongwei xu1:
回复 felix shih:
felix shih的办法是可以的,V大神在其他帖子里也是这么建议的,Aries Lord的办法也可行,要求对NV比较了解。
Jiancan Chen:
回复 felix shih:
hi felix shih ,
谢谢你的建议。不过如果是产品的话,按键有时不太合理。
不知道zigbee终端节点能不能在尝试加入原来的网络失败(协调器掉电后),自动扫描其他网络 ?
Kairan Wang:
回复 Jiancan Chen:
您好,请问你的问题解决了么?可以实现自动扫描新网络了吗?