最新消息:

BitCloud协议栈应用层主动离网重新扫描新网络加入功能的实现

ZigBee 作者:刘明伟 作者的G+ 2644浏览 0评论

目前在做的一个ZigBee应用,设计上需要能通过心跳机制检测当前的网络是否可用,不可用则离开网络寻找新的网络加入。

按此设计开发,通过心跳机制,当心跳一定次数不通后,主动离开网络,然后扫描新的网络,并尝试加入。

使用Atmel BitCloud PS 1.1开发,当达到主动离网的条件后,按照如下步骤开始主动离网并寻找新网络加入的流程:

1. 离开网络

离开网络通过向底层发送离网请求即可,因为本应用中这种离网的状况是在网络情况不佳的状态下,所以不需要要求子节点也离开网络,因为即便要求子节点也未必收的到,发更多的包只会导致网络状况进一步地恶化。

2. 复位网络

在离网请求的callback函数中,进行网络复位。发送复位网络的请求即可。最好能先判断当前离网状态是否成功,然后决定下一步的动作。不过我觉得,既然已经决定要离网了,又有什么能阻挡得了呢,没有什么能够阻挡复位掉网络的脚步。

3. 扫描网络并加入

复位网络后,通过设置系统状态机,让栈去重新扫描网络加入网络。

这样做看起来是合理合法,理应能顺利实现所需功能的,但是,会发现会有奇怪的问题。

虽然有时候能成功离网然后扫描网络加入到新的网络,但是有的时候,却不是这样,会在加入网络的过程中ZDO_StartNetworkConf()出现invalid_request的错误。

经过一段各种碰壁的尝试,最后解决办法如下:

修改加入网络的请求,使在这个请求的callback没有调用前不能再次发送这个请求。
static /*inline*/ void startNetwork(void)函数中,发送网络请求前先判断。

原先代码:

修改为:

其实这个方法虽然解决了问题,想起来也是有些奇怪。因为正常上电后入网的过程,跟这个过程是相同的,但是上电后扫描网络建立网络却从来没有看到出现过invalid_request的问题。而APP修改状态机过去,却会发生这种问题,比较费解。

BitCloud使用起来总是感觉没那么顺手,容易出各式的bug。

转载请注明:刘明伟的博客 » BitCloud协议栈应用层主动离网重新扫描新网络加入功能的实现

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址