微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > ZigBee EndDevice休眠设备重启后不能恢复网络

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

时间:10-02 整理:3721RD 点击:

各位大虾们

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

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

我在休眠之前调用

        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   他都能加入   所以比较郁闷 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top