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.

zstack2.5.1a在室内rssi信号比较好的情况下,设备突然变成孤儿节点

办公室环境中,一个co下挂10个ed,个别ed偶尔掉线,抓包看是有数据重传,并且自己变成孤儿节点,请问什么情况下ed会变成孤儿节点,是信号瞬间有干扰还是协调器的信号不行?因为通过心跳包来看rssi都是比较正常的,-80dbm,会是协议栈底层让它掉线吗?办公室掉线抓包.psd

  • 看一下这边,有非常详细的分析: e2echina.ti.com/.../101468
  • 我得出的结论就是协调器没有ack回复,节点就触发断线,触发断线的代码具体是那一块呢,而且说原因比较多,怎么确定有没有干扰,阻挡物肯定有,是放在天花板上的
  •  终端设备在成功入网以后,状态成为了DEV_END_DEVICE。正常情况下该终端设备可以顺利的发送数据给父设备,也可以通过Data Request的方式向父设备获取发该子设备的数据。在实际应用层,可能出现终端设备移动,父设备掉电,因为干扰跟父设备通信多次失败,从而导致终端设备成为一个孤立的设备。如果连续发送数据没有收到父设备的MAC ACK,则触发设备进入孤立设备状态,调用到ZDO_SyncIndicationCB( uint8 type, uint16 shortAddr )函数,最后在ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )触发下面的程序。

     

     

    case ZDO_NWK_JOIN_REQ:

         if ( ZG_BUILD_JOINING_TYPE && ZG_DEVICE_JOINING_TYPE )

         {

           retryCnt = 0;

           devStartMode = MODE_RESUME;

           _tmpRejoinState = true;

           osal_cpyExtAddr( ZDO_UseExtendedPANID, _NIB.extendedPANID );

           zgDefaultStartingScanDuration = BEACON_ORDER_60_MSEC;

           ZDApp_NetworkInit( 0 );

         }

         break;

    启动的状态已经是MODE_RESUME,程序有重新执行到ZDApp_event_loop( uint8 task_id, UINT16 events )中的下面代码,再次开启启动设备的过程。

    if ( events & ZDO_NETWORK_INIT )

    {

       // Initialize apps and start the network

       ZDApp_ChangeState( DEV_INIT );

     

       ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,

                         DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );

     

       // Return unprocessed events

       return (events ^ ZDO_NETWORK_INIT);

    }

    最后执行到ZDO_StartDevice中的下面代码

     

     

    else if ( startMode == MODE_RESUME )

       {

         if ( logicalType == NODETYPE_ROUTER )

         {

           ZMacScanCnf_t scanCnf;

           ZDApp_ChangeState( DEV_NWK_ORPHAN );

     

           /* if router and nvram is available, fake successful orphan scan */

           scanCnf.hdr.Status = ZSUCCESS;

           scanCnf.ScanType = ZMAC_ORPHAN_SCAN;

           scanCnf.UnscannedChannels = 0;

           scanCnf.ResultListSize = 0;

           nwk_ScanJoiningOrphan(&scanCnf);

     

           ret = ZSuccess;

         }

         else

         {

           ZDApp_ChangeState( DEV_NWK_ORPHAN );

           //set timer for scan and rejoin

           osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinScan );

           ret = NLME_OrphanJoinRequest( runtimeChannel,

                                         zgDefaultStartingScanDuration );

         }

    }

    此时设备已经把状态从DEV_END_DEVICE状态切换到DEV_END_ORPHAN状态。通过调用NLME_OrphanJoinRequest函数向信道发送Orphan Notification告诉网络里面的设备,声明自己已经是一个孤立设备,这个Orphan Notification会在定义的每个信道上发送一次。

    上面的是引用了置顶贴里面的:https://e2echina.ti.com/question_answer/wireless_connectivity/zigbee/f/104/t/104629

  • -80dbm看起來信號是有比較弱,如果加個zigbee router是否可以改善狀況
  • 请问大概多少是正常的呢

  • 在我的經驗,至少要高於-70dbm
  • 感谢回答,疑问是为什么没有父设备的ack回复,是不是只有两个原因,一个是父设备断电,另一个是信号不好,有干扰。还会不会存在一种情况是父设备的性能达到瓶颈,网络消息处理不过来导致没有ack。
  • 正如YK说明的一样,应该是是你的设备衰减太大,导致掉网了,你可以试着当你的设备变成孤儿节点时拉近距离试一下。
  • 为什么没有父设备的ack回复会不会存在一种情况是父设备的性能达到瓶颈,网络消息处理不过来导致没有ack-->這是有可能的
  • 遇到一个类似问题,请教一下。
    e2echina.ti.com/.../492606
  • 已經在那個帖子協助你