办公室环境中,一个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