XBee Zigbee长休眠周期如何保障可靠通信

XBee3 ZB模块是种很方便可靠的ZigBee模块,其中会有三种角色,协调器,路由器,休眠终端,它们各司其职,完成一个稳定的本地无线网络,并保障通信安全可靠。

在无线ZigBee的应用中,常见的通信方式有:仅上行,仅下行,和上下行双向通信这三种。在实际应用中,许多人往往不理解休眠参数在真实网络环境和应用中的意义,因此意外频频,不得不在现场大费周章,进行调试。其实掌握XBee各参数的工作机制,是可以最大程序避免丢包。上下行双向通信实际上就是上行和下行的结合,就不单独细述。

一、上行通信

如果仅有上行通信,也就是节点只向网关发数据,而网关无需向下发指令。这种模式最容易,但需要注意这几个方面:

1、需要设置SO的bit1和ST,以便在模块醒来时发数据。由于模块默信是醒来时向父节点polling不到数据就马上再睡去,不要出现本地MCU还没来得及发数据,模块就因为休眠而无法接收指令,所以需要配置这个bit1,并设置ST为合适的时间。

  1. 节点数量多时,要有足够的router节点,router数量大时,还要开启Many To One模式,即设置AR参数,定期广播MTO包,这样有助于建立或修复各路由节点到协调器的路径。

二、下行通信

由于XBee的休眠模块实际上依赖于父节点缓存数据,所以下行通信是最容易处理不好的。能否收到数据取决于这些因素,一个是休眠节点已经入网挂靠到父节点上,二是父节点还保留着子节点的位置,也就是父节点还没因为子节点长时间不来polling数据而把它踢了。此外还有一个重要的因素,很多人会忽略,这是我实测总结出来的,文档上并没有,这个容易被忽略的情况是,休眠节点已经更换父节点了,但旧的父节点仍保留着原有节点,此时如果向休眠节点发送数据会有这两种情况:

  1. 使用正确的16位短地址发送,由于旧的父节点下该节点的短地址不符,所以父节点仍会在网络内依照zigbee协议转发相关的包,数据包最终能到达目标节点。

  2. 当使用FFFE作为16位地址时,旧的父节点认为是给它子节点的包,便缓存起来,等待子节点polling,这样就会丢包。

如果要使用FFFE作为16位地址,那么需要等到该节点的polling timeout到了,旧父节点把它除名了,这样再下发给该休眠节点时就不会有障碍。在实际应用中,如果不能用16位短地址来通信,则应该把polling timeout时间合理配置,以减少占着坑不拉屎的情况发生,减少丢包。

对于长休眠周期的通信,同样也是一个难点,因为SP最大只能设置28秒,如何保障数据不丢呢?这里有一些知识和技巧可以协助:

其实,需要注意的是,这个28秒是指从父节点接收到数据到丢弃数据的时间,而非休眠模块开始睡后的时间,因此这个包是否能被收到,取决于发包后28秒内模块是否醒了。以一分钟为例,如果该包是在模块睡着32秒后发的,那么这个包也不会丢,但如果是在模块刚入睡就发,这个包是有可能丢的,想要不丢,需要有两种手段:

  1. 应用程序重发

通过反馈包或应用程序握手,来确保不能丢的包一定送到达目标。注意发送方不同,反馈包的意义并不相同,参见下文,Address Not Found并不意味着丢包。

  1. 冗余多发

冗余多发是指,在一定周期内重发相同的指令,在指令当中加插重发序号,这样相同的指令即使多收了,也只处理一次。比如一分钟的休眠周期,大约可以冗余发两次即可。

反馈包的意义:

需要明白的是,XBee的发送反馈包,不同情况下有不同意义,对于父节点来说,如果从父节点向子节点发送数据,它反馈包是可以等到3SPSN*10这个polling timeout才会返回。而对于其它的角色向休眠节点发送,它通常会在三次单播timeout的时间内返回反馈包(约4.8s)。如果节点此时睡着,结果是"address not found",但这并不意味着丢包,因为只是当前地址不可达,模块醒来时会向父节点polling数据,只要父节点仍缓存着该数据,则休眠模块依然可收到数据。

此外,如果是由XBee模块的休眠周期控制着设备上电,还需要设置WH参数,以防止CPU刚上电还没准备好,模块的数据就从串口出来。