TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

Viki Shi:

看一下这边,有非常详细的分析: e2echina.ti.com/…/101468

user3976358:

回复 Viki Shi:

我得出的结论就是协调器没有ack回复,节点就触发断线,触发断线的代码具体是那一块呢,而且说原因比较多,怎么确定有没有干扰,阻挡物肯定有,是放在天花板上的

Alvin Chen:

回复 user3976358:

 终端设备在成功入网以后,状态成为了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

YiKai Chen:

-80dbm看起來信號是有比較弱,如果加個zigbee router是否可以改善狀況

user3976358:

回复 YiKai Chen:

请问大概多少是正常的呢

YiKai Chen:

回复 user3976358:

在我的經驗,至少要高於-70dbm

user3976358:

回复 Alvin Chen:

感谢回答,疑问是为什么没有父设备的ack回复,是不是只有两个原因,一个是父设备断电,另一个是信号不好,有干扰。还会不会存在一种情况是父设备的性能达到瓶颈,网络消息处理不过来导致没有ack。

Alvin Chen:

回复 user3976358:

正如YK说明的一样,应该是是你的设备衰减太大,导致掉网了,你可以试着当你的设备变成孤儿节点时拉近距离试一下。

YiKai Chen:

回复 user3976358:

为什么没有父设备的ack回复会不会存在一种情况是父设备的性能达到瓶颈,网络消息处理不过来导致没有ack–>這是有可能的

th smi:

回复 YiKai Chen:

遇到一个类似问题,请教一下。
e2echina.ti.com/…/492606

赞(0)
未经允许不得转载:TI中文支持网 » zstack2.5.1a在室内rssi信号比较好的情况下,设备突然变成孤儿节点
分享到: 更多 (0)