TI论坛
直播中

张喆

7年用户 162经验值
私信 关注
[问答]

请问orphan节点无法加入协调器网络怎么解决

1. 终端ZE使用了NV_RESTORE,加入了协调器ZR,协调器也开了NV_RESTORE;

2. 若协调器掉电,重新上电协调器,协调器可以正常与ZE通信

3. 若[size=1em]ZE掉电,然后[size=1em]重新上电,[size=1em]协调器可以正常与ZE通信;

4.[size=1em]若[size=1em]ZE掉电,协调器断电,[size=1em]ZE[size=1em]重新上电,[size=1em]抓包狗捕捉到ZE发出 orphan notification ,然后就开始发出 Beacon Request信号;[size=1em]然后开启另一个协调器,ZE无法加入新的协调器;

请问有前辈可以指教吗? 终端使用了NV_RESTORE要如何才能加入新网络?

回帖(8)

李衍安

2018-8-18 06:43:37
你需要加入 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
举报

李童

2018-8-18 06:53:09
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;    ]
举报

张喆

2018-8-18 07:12:32
引用: 大宝窝窝菊科 发表于 2018-8-18 06:43
你需要加入 reset 功能
你看一下 ZDApp.c 的 ZDOInitDevice()
去執行這段

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 restored    networkStateNV = ZDApp_ReadNetworkRestoreState();  /*读取NV网络状态的状态*/  ]  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这段代码是通过按键来绕过NV数据恢复,功能与你贴出的版本应该无异。
请问您说的 reset功能是? 
举报

李衍安

2018-8-18 07:23:54
引用: jsjdfsdf 发表于 2018-8-18 07:12
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 RA ...

基本上, reset 就是重開機後,去 erase flash
Aries Lord 的方法你也可以試看看

我是定義一個自己的按鍵為 SW_BYPASS_NV 
#define SW_BYPASS_NV    HAL_KEY_SW_5  // Bypass Network layer NV restore
在按住按鍵重新上電後,讓它去執行
// Wipe out the network state in NV
NLME_InitNV();
NLME_SetDefaultNV();
// clear NWK key values
ZDSecMgrClearNVKeyValues();
举报

更多回帖

发帖
×
20
完善资料,
赚取积分