ZigBee低功耗的特性只针对睡眠终端设备(ZigBee Sleep EndDevice),而路由器(Router)和协调器(Coordinator)通常为常电设备,不在本文低功耗的讨论范围之内。根据不同的ZigBee协议栈,需要先使能协议栈中某些宏定义开关,才能打开睡眠功能,实现低功耗,这是终端设备能进入睡眠的前提条件!由于不同厂商协议栈的具体实现的方法都不一样,我们不讨论其实现的具体操作,只讨论ZigBee协议中实现低功耗的机制。
ZigBee 睡眠终端设备在空闲的时候,默认关闭接收器,通过周期性向父设备发送DataRequest请求新数据,这个周期叫Long Poll时间,当父设备有暂存的新数据时,ZigBee Sleep EndDevice会打开接收器,并快速发送DataRequest请求并接收新数据,此时两个DataReques间隔叫做Short Poll时间,在Long Poll周期里,ZigBee终端设备是睡眠的,电流一般为几个微安。
ZigBee睡眠终端设备如果需要定时发送数据、采集数据,会同时运行多个定时器,如:每隔五分钟采集一次传感器数据然后发送出去,每隔一分钟发送一个心跳包(自身的状态),于是可以模拟画出时间轴如下所示:
上图中两个蓝线之间代表:每隔5分钟发送一次采集的数据,两根黑线之间代表:每隔1分钟去发送一次心跳包数据,两根红线之间代表:每隔7s发送一次DataRequest(POLL机制),如果以垂直方向从上往下为时间轴,那么用一根绿色的竖线与所有横线的交点,即为唤醒ZigBee Sleep EndDevice设备的时间点,而实际项目中,往往还存在一些外部中断事件,同样也会唤醒设备,如:一个ZigBee开关设备,每次手动触发一次开关,都会被唤醒向其他设备(如:与之绑定的灯泡)发送OnOff命令数据。
ZigBee Sleep EndDevice要实现低功耗,还必须注意ADC、SPI、I2C、外接芯片的电源管脚、LED状态和LCD状态,都必须确定他们工作的状态(关闭)之后才能保证进入睡眠状态后,电流只有几到十几微安的水平。
ZigBee的aging机制只适用于EndDevice设备,是基于EndDevice的DataRequest实现的一种确认设备网络连接状态的机制,但是无法确定Router的网络连接状态,因此还需要在网关(Coordinate)的应用层添加一个的机制来确认(Router、EndDevice)设备是否在线,有两种方式实现:1.Coordiantor定期发送request给所有ZigBee局域网内设备的,如果设备回了response则说明设备还在线。2.ZigBee节点在入网后,主动定期发送心跳包,如果Coordinator能够收到设备定期的心跳包数据则说明设备在线,对于第一种方式,Coordinate发给EndDevice的消息都暂存在父节点(Router),只有当ZigBee Sleep EndDevice醒来才回去poll父设备拿回自己的数据,有时候由于poll间隔太长,没有及时回复消息给Coordinator,Coordinate会重发数据给终端设备,直到设备醒来接受数据并且回复response为止,而重发的数据都暂存在父设备中,因此设备醒来后会接收到多条重复的数据,同样也会回复多条数据,这样会必然会增加功耗(发送数据的瞬时电流29mA,接收瞬时数据电流24mA,通过示波器观察波形更加明显)。
为了避免这个问题,通常选用方式2,即:不管是Router还是Sleep EndDevice设备,不管有没有心跳包功能的设备,网关(Coordiantor)在每个设备入网时都配置设备一个可报告的属性(configure report),每隔一段时间(如:5分钟)汇报一次属性,这样对于低功耗睡眠终端设备来说就只会发一个report数据,而不会出现之前的问题,同样能优化功耗,延长电池使用寿命。
ZigBee Sleep EndDevice不在网时状态下的低功耗同样需要优化,如请求入网的间隔,请求入网的最大次数,掉网后rejoin的间隔时间等都需要考虑。
有OTA功能的ZigBee Sleep EndDevice设备,需要注意请求OTA服务器的间隔,一般设置为每隔24小时请求一次比较合理,过于频繁的请求OTA服务器会影响产品的电池使用寿命。
Coordinator使用configure report去设置Sleep EndDevice设备的某些非定时report的(如:只有属性改变了或者超过最大报 告间隔时间才主动汇报)属性时,把configure里面最大报告间隔设置为0xFFFE比较合适。
对于Long Poll间隔15分钟的深度睡眠设备,需要根据long Poll的间隔调整ChildAgingTimeOut时间,使其大于ong Poll的间隔15分钟
在使用完外设之后需要将外设芯片关闭/禁止,初始化的时候需要将悬空/未使用的IO设置为Disable,进入睡眠外部上拉的IO口也需要设置为Disable,对于低功耗串口(握手信号),进入睡眠可以将TX设置为Disable,断开串口route,唤醒后重新配置TX
总结,细节决定成败,很多人使用ZigBee无线技术来开发产品,都是看好ZigBee 低功耗的特性,然而用好ZigBee低功耗的特性并不容易,要注意的小细节很多,以上只是个人在工作当中对低功耗的一点小观点,不足之处请高手指点,也欢迎补充。