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.

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

Other Parts Discussed in Thread: Z-STACK

各位大虾们

        最近发现  EndDevice休眠设备重启后不能恢复网络,已经打开了  NV_RESTORE  和  NV_INIT  编译选项,反复的复位实现   发现有回复不了网络的情况,而且还很频繁,

       在上电复位后看Log打印发现  如果能够调用一次AF_DataRequest函数(暂时不知道是哪里调用),则能够正常恢复,反之如果系统没有调用则又重新扫描网络,不能恢复加入原有网络,谁能帮忙解答一下,谢谢

  • 不太明白你提到的不能恢复网络是什么意思??

    设备在重新上电以后,首先应该会发送Orphan Notification,协调器有回复Coordinator Realignment吗?

  •    首先谢谢回答:

            不能恢复网络的意思是 已经成功加入到A协调器网络(可以上报数据,并相互通讯),然后重启EndDevice设备,重启后EndDevice不能恢复网络,又开始进入待组网状态(协调器修改为默认是不允许加入),并且如果有B协调器存在并允许加入,EndDevice设备又会加入到B协调器,就是没有能够恢复原来网络。

          你说的上电发送Orphan Notification,如果没发送,程序里面在哪里判断?

  • Do you erase flash before you program 2530 image?

  • 如果使能了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 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
  • 没有擦除Flash,不是一直不能恢复,也没有什么规律,有时候重启10次的话   大约有两次不能恢复,有时候可能10次有五六次不能恢复

  •   我之前注意过这里,我程序里面已经关闭了按键操作 #define HAL_KEY    FALSE   屏蔽了按键,这个地方应该不会擦除了吧?我先屏蔽掉试试吧!

    我现在是在一个工程文件里面实现的Coordinate 和 Router 和 EndDevice,只是我自己的应用层不一样,后两者的硬件也是差不多,并且Router复位后恢复网络没有问题,我先屏蔽掉ZDOInitDevice 里面判断的代码试试

  • 这样吧,先不要使用有你自己应用程序的软件了。直接拿TI的官方协议栈例程,没有做过任何改动的情况下做下测试,在使能NV_RESTORE的情况下。

    首先排除下到底是软件的问题,还是硬件的问题。

  • 按照你说的   用TI的官方协议栈例程测试,从上午开始测,到现在还未发现不能恢复网络的情况,看来是我后期修改的有问题了。

    我先说一下我改的地方吧,我现在协调器上电设置为禁止加入网络NLME_PermitJoiningRequest(0),通过按键允许NLME_PermitJoiningRequest(10),

    EndDevice上电后调用  devState = DEV_INIT;   ZDOInitDevice(0);

    1、增加了预编译NV_RESTORENV_INIT

    2、打开了数据加密SECURE=1ZG_SECURE_DYNAMIC=1

    3、开启了ZDO_MGMT_LEAVE_REQUESTZDO_MGMT_LEAVE_RESPONSE、ZDO_MGMT_PERMIT_JOIN_RESPONSE实现

    4、指定ZDO_UseExtendedPANID(与协调器zgApsUseExtendedPANID对应)

    5、按照官网配置方法配置过MTO

    不知道上述这些对不能恢复网络有没有影响?


  • 我在休眠之前调用

            NLME_SetPollRate( 0 );  
            NLME_SetQueuedPollRate( 0 );
            NLME_SetResponseRate( 0 );

    唤醒后调用

            NLME_SetPollRate( 1000 ); // 60 000ms = 1 min 
            NLME_SetQueuedPollRate( 100 );
            NLME_SetResponseRate( 100 );

    是不是这个影响的?

  • 你要改的话就改NLME_SetPollRate( 1000 ); 就可以了,其他的不要改。 

    另外你测试不能入网,你看到的空中数据包是什么,有什么异常吗

    ZG_SECURE_DYNAMIC=0

  •      只改这一个的话 NLME_SetPollRate( 1000 ); 程序会100毫秒左右就唤醒一次,不能进入我先要的15S唤醒一次。

    现在还有一个问题, 测试过程是这样的:EndDevice设备加入A协调器网络,通讯正常,然后关闭(断电)协调器和终端设备,

                                                                     打开B协调器电源,打开EndDevice设备电源,这时EndDevice设备会重新加入B协调器网络,(协调器默认是关闭了允许加入的),

    不知道为什么会组到B协调器?而没有恢复原来的A网络?

  • 就是 简单的 断电上电吗????

    请问 你用的时候什么版本的zstack ???

    我用HA1.2.2A  的 发现了 终端设备 在发出rejoin  request 的时候, 如果长时间没有收到response的话,它就会自己删掉自己的NWK KEY ,然后把自己的NV flash 里面的信息删掉,

    接着 无论任何协调器 一开permit join  它就加进去了!!

    情况和你有点类似, 但是复现 的方法和你不一样!!!

    你可以在ZDAPP.C 里面看一下是不是 复位了!!!

  • 对 就是 简单 断电上电

    我用的版本是Z-Stack Mesh 1.0.0

    我现在协调器不开permit join   他都能加入   所以比较郁闷