Other Parts Discussed in Thread: CC2530, Z-STACK
设计思路:zigbee节点在无法入网,或者被挪动至原理已入网网络的覆盖范围。在多次尝试无法入网时,进入PM3或者PM2模式,进行较长时间的休眠,并通过下次触发唤醒时再尝试入网,减少功耗损失。
以CC2530为例,在扫描网络时,每次扫描一个信道,需要打开RX侦听近500ms,在16个信道下持续时间会达到4s,电流27mA。而每次扫描完成后约200毫秒会进行下一次信道扫描。这也就是为什么没有入网的节点,电流持续在27mA。
未入网的节点会不停的发起网络扫描,因此一直在DEV_NWK_DISC状态不停的循环。而这个时候千万不要再发起ZDApp_NetworkInit函数。因为当一次网络扫描还没结束时再发起一次网络扫描,会使z-stack进入一个不可恢复的错误。因此如果在一个IO中断触发时去调度ZDApp_StartJoiningCycle,会导致ZDApp_NetworkInit连续调度,出现错误。(IO中断时调度ZDApp_StartJoiningCycle会死机)
如果在devStates_t中增加一个DEV_IDLE状态,每次扫描网络后扫描不到打开permite join的网络,或者加入网络失败(Assoc Join和Rejoin,orphan join),都会进入DEV_IDLE状态。用DEV_IDLE代替DEV_NWK_DISC状态,DEV_NWK_DISC表示正在进行网络扫描,这个状态下务必禁止再次发起网络扫描。ZDApp_StartJoiningCycle和ZDApp_StopJoiningCycle只能在DEV_IDLE和DEV_INIT状态下执行。DEV_IDLE可以通过消息ZDO_STATE_CHANGE传给应用层,应用层可以在多次扫描或者入网失败后停止入网,而停止入网的节点不会再次发起下次扫描,而是转入DEV_INIT状态,在DEV_INIT状态下,节点可以进入PM3模式,然后通过外部IO触发的方式重新发起ZDApp_StartJoiningCycle。