各位技术大神,关于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这部分代码,貌似有添加,但总体结构没有改变。