关于 修改 rejoin backoff 的出现问题!
请问大家有个紧急按钮,低功耗的。
原本 zstack 最新版本提供了
断网后===》寻网一段时间 rejoin scan ===》 休眠 一段时间 rejoin backoff===》再次寻网一段时间 这样的循环机制
但是我在进入rejoin backoff 时候 屏蔽了定时器
// ZDApp_StartJoiningCycle();
// osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinScan );
将这个机制打破。不让它 继续循环 。取而替之 后面 用 按一下按钮 ,调用一次
NLME_NetworkDiscoveryRequest()
发一个beacon request 去尝试入网。
经多次测试,百分百复现:
紧急按钮入网, 接着第一次断网后,会按着rejoin scan 的时候寻网,时间到了进入 rejoin backoff ,然后进入rejoin backoff 后 因屏蔽了定时器 不再寻网。
这前面一段 都是正常的。
接着,我通过按一下按键 发一个 beacon request的方法 入网。
入网后,将协调器断电, 让紧急按钮再次 断网。
断网后,紧急按钮发了一个orphan 之后 接着发一个beacon request, 然后就没再发 beacon request了,
但是它却仍处于寻网的状态。 等到rejoin scan 时间一到再次进入rejoin back 的休眠
为什么在rejoin scan 阶段它只发一个beacon request 之后就不再发了呢? 不知道哪里出错了~~~~
原来zstack 实现 寻网===》休眠===》寻网 的机制 是靠
ZDApp_StartJoiningCycle() 和 ZDApp_StopJoiningCycle () 这两个函数。 而追根到底 就是设置布尔变量 continueJoining。
在 函数 ZDApp_ProcessOSALMsg()中的ZDO_NWK_DISC_CNF case 里面,
寻网后没有找到合适的网络进入 则进行以下判断
continueJoining = TRUE 时,调用ZDApp_NetworkInit() 然后随机一个时间 进行再次发beacon request
continueJoining = FALSE时,不在发beacon request 停止寻网。
上述例子中, 由于首次入网continueJoining 是为TRUE。所以第一次断网后,终端设备在ZDO_NWK_DISC_CNF case 里面 是会继续调用ZDApp_NetworkInit() 去发 beacon request的。直到定时器时间到 进入rejoin backoff 后,将continueJoining 设为false, 这样就停止发送beacon request寻网。
当后面 使用手动发送beacon request 入网, 而 continueJoining 依然是false , 这时 再次断网,终端设备进入ZDO_NWK_DISC_CNF case 里面,就不会再调用ZDApp_NetworkInit() 去发 beacon request 但是这时 rejoin scan 的定时器是开着的,所以依然会跑完 定时器 规定的时间 进入 rejoin backoff 再休眠~~~~
所以手动 发送beacon request 的 做法 就会造成这样的结果。。如果你这时候 将continueJoining 设置为true, 那会造成 发送beacon request之后,一直不停的发~~~
谢谢分享,
你也可以看下下面链接中的介绍
http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/104629.aspx