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

关于ZDO_STATE_CHANGE的疑惑

各位技术大神,关于ZDO_STATE_CHANGE有以下几个疑惑:

1、对于ZDO_STATE_CHANGE来说,我的理解是设备入网时,来判断设备当前在网络中的状态(所扮演的角色),不知道是否正确;

2、关于ZDO_STATE_CHANGE触发的条件,是否是只有在入网时才被触发?会不会有其他触发情况?如果有,请描述出来;

在此,小弟表示感谢!

Susan Yang:

Once device change its state in ZigBee network (e.g., grom DEV_INIT to DEV_END_DEV),

the ZDO_STATE_CHANGE will be invoked automatically by ZDO.

user4381970:

回复 Susan Yang:

网络状态一有改变就应该出发ZDO里面的ZDO_STATE_CHANGE_EVT,

从而sapi里面case:ZDO_STATE_CHANGE 。对吗?

为什么2.5.1a版本在SAPI_StartConfirm里面判断网络状态myAppState = APP_START或者;APP_INIT

case ZDO_STATE_CHANGE: // If the device has started up, notify the application if (pMsg->status == DEV_END_DEVICE || pMsg->status == DEV_ROUTER || pMsg->status == DEV_ZB_COORD ) { SAPI_StartConfirm( ZB_SUCCESS );//成功入网 } else if (pMsg->status == DEV_HOLD || pMsg->status == DEV_INIT) { SAPI_StartConfirm( ZB_INIT );//此处为什么从来都不会进来呢?掉线也不会进来。那么应该在哪里判断掉线呢? }

感觉此处有bug?后来我在ZDO_JoinConfirmCB判断掉线,可以吗?

Aries Lord:

回复 user4381970:

对于路由来说,没有掉线的概念。

user4381970:

回复 Aries Lord:

我指的是终端.终端不知道什么原因,也不确定时间,可能发生掉线。有时候掉线重连就一直连不回去。该怎么办呢?为什么一直连不回去呢?

路由没有掉线的概念是什么意思呢?若只有一个协调器一个路由。路由失去了父节点不会触发掉线吗?网络状态也会改变吧?应用层好根据网络状态标识来进行不同的处理

VV:

回复 user4381970:

掉线是正常现象,一般都是因为节点发送数据,父设备没有ACK,就会断线。

断线以后节点的状态会做改变,而且会去重连。

你可以确认下断线以后,节点是什么状态,devState?,有没有在搜索网络。

user4381970:

回复 VV:

的确是您说的那样没有应答就掉线了。我认为他执行重新初始化去尝试重连了,但就一直连不上,但之后也可能就好了,时间不一定,有时候是断电了,有时候没有断电,只是重启了。

我单步调试过,我使用一些相对容易出现重连失败的设备仿真的。点击复位后点击全速,有时候就会连不上(之前已经加入过协调器网络的设备)。这时候通过断点发现,开始是devState = DEV_INIT,devStartMode = MODE_RESUME;之后就是rejoin,不断的执行初始化,在回调ZDO_JoinConfirmCB等待Status == ZSUCCESS。抓包发现几情况:

1,终端不发出orphan request,只是一直发beacon request,之后也不发rejoin request。

2,终端发出orphan request,但协调器没有响应回复coordinate realignment,一直发beacon request,之后一直没有发出rejoin request

3,若是成功恢复网络的就2种状况:1.终端发出orphanrequest,协调器响应coordinate realignment 2.抓包发现rejoin request (好像抓到rejoin的就一定成功,失败的都抓不到rejoin request)

网络初始化这部分代码,我们没有修改过,我也对比过home和mesh这部分代码,貌似有添加,但总体结构没有改变。

赞(0)
未经允许不得转载:TI中文支持网 » 关于ZDO_STATE_CHANGE的疑惑
分享到: 更多 (0)