This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

orphan 节点无法加入协调器网络的问题

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

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

3. 若ZE掉电,然后重新上电,协调器可以正常与ZE通信;

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

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

  • 你需要加入 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

  • 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;
        }
  • 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功能是? 


  • 基本上, reset 就是重開機後,去 erase flash

     的方法你也可以試看看

    我是定義一個自己的按鍵為 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();

  • 楼上的正解,VV大神曾经也是这么建议的,的方法要求对NV比较了解,都可以尝试下!

  •  felix shih的办法是可以的,V大神在其他帖子里也是这么建议的,的办法也可行,要求对NV比较了解。

  • hi felix shih ,

        谢谢你的建议。不过如果是产品的话,按键有时不太合理。

         不知道zigbee终端节点能不能在尝试加入原来的网络失败(协调器掉电后),自动扫描其他网络 ?

  • 您好,请问你的问题解决了么?可以实现自动扫描新网络了吗?