硬件平台:CC2530
协议栈:Z-Stack
应用背景:
ZigBee终端节点接收数据的方式是每隔一段时间向父节点发送一次DateRequest (数据请求),此时父节点若有属于该终端节点的数据,则会将此数据发送给终端节点。这个时间间隔为ZIgBee DateRequest Poll间隔,此参数可以在配置文件f8wConfig.cfg中进行配置,参数名为-DBEACON_REQUEST_DELAY,单位为毫秒。
在项目实施过程中,出于对功耗的控制,很多ZigBee终端节点都会配置为低功耗(PM1~PM3),PM2是较为常见的工作模式,当配置为休眠模式后,ZigBee终端节点会根据-DBEACON_REQUEST_DELAY所设置的POLL间隔唤醒,并向父节点(协调器)获取属于自己的数据。并且在休眠模式下,一般会将此参数配置为较大的数据,避免设备频繁唤醒,从而达到低功耗的效果。但在某些应用场景中,固定的数据获取间隔会造成数据传输缓慢,业务阻塞的问题。因此有必要对POLL的频率进行动态的调节。
以下是我的一个项目中的一个场景:
上位机在某段时间内需要通过ZigBee协调器向处于休眠中的终端节点批量下载一批数据,若依旧保持休眠状态下的POLL频率,接收十条报文的时间需要至少30秒的时间(若需要给予上位机反馈报文,时间还需翻倍)。
最终采用的解决方法是在发生类似以上的高频率数据传输时,调用NLME_SetPollRate函数调节POLL频率,使其在某段时间内POLL频率加快。如下:
if (Large_Date == 1) // 批量传输起始标志
{
NLME_SetPollRate(100);//将POLL频率调节至100MS一次
}
……//其他处理
其他场景应用:
某个产品的数据上报通讯过程包含三个阶段,如下。
1、MCU向ZigBee终端发送一组数据,随后进行等待反馈状态,若一秒后未收到反馈,重发数据;
2、ZigBee终端将此数据转发至协调器,有协调器传至上位机服务器,服务器收到数据后,给予反馈报文,由协调器下
发至ZigBee终端。
3、ZigBee终端收到反馈报文后转发给MCU,MCU确认此次数据传输结束,通讯结束。
若ZigBee终端采用3S的POLL频率,会造成在第二阶段中,ZigBee终端至少需要3S后才能获取到来自协调器的反馈报
文,待传到MCU时,时间早已超过MCU的最长等待时间,造成重发现象。
因此可以采用ZigBee终端在等待反馈报文期间提高POLL频率的方式,避免这种情况的发生。