就是Home 1.2.2a这个版本存在bug,应用层函数无法通过消息ZDO_STATE_CHANGE来正确获取当前状态。
1,任何一个状态都无法切回到DEV_INIT状态,因为在执行ZDApp_ChangeState( DEV_INIT )后又立即执行ZDO_StartDevice,状态不会切回DEV_INIT。
2,DEV_NWK_DISC状态如果没有扫描到网络,会无止境的扫描下去,状态是连续的DEV_NWK_DISC。如果ZDApp_StopJoiningCycle后再ZDApp_StartJoiningCycle,是不是应该回到DEV_INIT一次?
3,REJOIN时,不会进入DEV_NWK_SEC_REJOIN_CURR_CHANNEL状态。该版本协议栈中,rejoin的四种方式,由prevDevState的值决定。虽然这样做实现了四种rejoin模式的切换,但是应用层通过ZDO_STATE_CHANGE并不能获得当前的rejoin状态。
VV:
1,DEV_INIT只是一个初始状态,如果设备秘钥认证没有通过的话,会回到INIT状态
http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/104629.aspx
2,这个在应用层完全可以自己根据实际需求控制,协议栈提供了start stop的API 函数。另外最新的协议栈里面有back off的功能,可以参考着使用
3,应用层为什么需要知道这些状态?
Aries Lord:
回复 VV:
1,我增加了一个DEV_IDLE状态,这个状态是指每次join,rejoin失败,或者scan扫描不到任何网络时,进行下一次扫描前的状态。这个状态下应用层进行stop操作,可以减少一次不必要的scan。
2,back off的切换时间默认是15分钟,而且都是周期性切换,对于一些传感器节点来说并不合适。传感器节点在无网可入的情况下,最好是进入PM3。
3,应用层是根据硬件不同而进行不同设置的,可以绑定按键触发事件。很多实际使用遇到的问题是节点入网前功耗特别大,所以控制功耗最好的办法就是入网前如果不能入网,就没有必要一直去耗电,可以进入低功耗模式,在传感器检测到某个状态后再去触发。