一、前言
终端在第一次连接的时候通常会发一个连接请求(beacon request)给协调器,协调器接受到它的请求后就会给它分配一个短地址,后续通讯的时候终端只需要拿短地址和协调器通讯即可。实际上终端遇到特殊情况是会和协调器发起重连的:1.终端重上电的时候。2.协调器重上电的时候。3.终端离开网络后又重新加入网络。而重连的时候终端和协调器会进行大量数据的交互,从重连到正常发送数据需要一定时间,而且重连对通讯信号强度有要求,信号不好的时候重连会失败。而公司的终端设备是一个低功耗设备,发送完数据就必需进入休眠状态,而且设备之间有金属板阻隔,信号不太强,而且限制重连的时候只发送一个beacon request,所以一般要重连几次才连上,信号不好的情况甚至很难重连。
二、zigbee保持常连接的方法
zigbee之所以需要重连,个人认为是为了实现自组网和网络自愈的能力,当与终端最近的节点断开了,终端可以通过重连的方式去连接另外一个节点,网络就会重新恢复。代价就是在重连的过程中无法控制设备。还有在星型接的网络里面,重连其实是没必要的,反而增加了网络负担。我想要的效果是只要网络一通就能控制设备,显然利用原有的zigbee协议栈是满足不了要求的,需要更改zigbee协议栈。用抓包工具分析zigbee在断开网络的数据帧,发现网络重连是由终端发起的,因为终端有些是休眠设备,一旦休眠了,协调器是探测不到的,所以问题解决的方向是不让终端发起重连请求。还有一个关键点是终端断开连接的时候会发送一个声明“我是孤儿节点,谁来领养我”,那么可以推理去掉这部分代码应该可以实现不重连。
这部分源代码在ZDObject.c文件里面,注释掉两行代码即可“