ZigBee路由节点实现休眠

对于zigbeen的路由节点,TI是不支持休眠功能的。然而可以自己手动修改代码,也可以实现路由节点休眠,达到PM3模式。

1.右键工程名称,选择Options->C/C++Compiler/Preprocessor选项,在Defined Symbols框里添加POWER_SAVING



2.修改f8wConfig.cfg文件。

找到-DRFD_RCVC_ALWAYS_ON将值改为-DRFD_RCVC_ALWAYS_ON=FALSE
-DPOLL_RATE=1000改为-DPOLL_RATE=0
-DQUEUED_POLL_RATE=0改为-DQUEUED_POLL_RATE=0
-DRESPONSE_POLL_RATE=100改为-DRESPONSE_POLL_RATE=0

3.在OnBoard.c文件的InitBoard()函数中将else分支中的OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;改为OnboardKeyIntEnable= HAL_KEY_INTERRUPT_ENABLE;

4.在OSAL_PwrMgr.c文件中的osal_pwrmgr_init()函数中,将/pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; 改为pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY;这样的话在下面的osal_pwrmgr_powerconserve()函数中的两个if判断条件就能通过,就会进入休眠模式,当然也可以直接暴力一点,将这两个if判断条件直接注释掉。

通过以上4步,对于终端节点就能够进入休眠模式。但是对于路由器节点,还差一步。

5.在mac_sleep.c文件中的macSleep()函数中,将第一个if判断条件,即if (macRxActive || macRxOutgoingAckFlag || macTxActive || macRxEnableFlags)改为if (macRxActive || macRxOutgoingAckFlag || macTxActive)。
这样的话路由节点也会进入休眠模式,但是这样的话会存在一个问题,路由节点在进入休眠模式之后,就无法与其它路由节点或者终端节点进行建立连接了,原因很可能就是在刚刚的if条件中取消了一个判断条件。
解决办法也是有的:假设路由器A和路由器B连接,B向A发送数据,A要实现休眠,那么首先让A未进入休眠模式,这样A和B就能建立连接。然后让B发送数据给A,告诉A可以进入休眠,A收到数据之后就进入休眠模式,这样的话A就会进入休眠,而且A和B还是保持建连的。不过此方法只适用于两个路由器连接,对于终端和路由器连接未能成功,这样的话终端得绑定一个正常工作的路由器才能和休眠的路由器进行数据传输。

下图是用POWER MONITOR测试仪,测得的路由器在休眠状况下周期性发送数据的电流图。


上图中的一个个小波峰就是发送数据包和心跳包时消耗的电流,而在平常,电流消耗就本为0.

当然路由器在进入休眠之后,基本就收不到其它设备给它发的数据包了,除非休眠路由器给其它设备发送数据的瞬间会产生电流,这样才会收到别人给它发送的数据包。

解决方法也是有的,虽然不能保证百分百收到其它设备给它发送的数据包,但是能保证很大概率会收到,当然操作得当,也能达到全部收到。就是让它周期性的睡一段时间,醒一段时间,具体实现可以不断修改变进入睡眠的判断条件,在OSAL.c文件中的osal_start_system()函数中最后的else里面的这个函数osal_pwrmgr_powerconserve(),也就是进入休眠的函数,只需在这个函数外面加个判断条件,隔一段时间这个判断成立,隔一段时间这个判断不成立,这样就能控制路由器何时睡眠,何时唤醒了。

下图就是路由器在每2s内,睡眠1.5s,醒0.5s的电流图。



其中红色框起来的就是醒时候的电流,而黑色框起来的小波峰,就是醒的时候接收到的数据包和发送的数据包,绿色框起来的就是睡眠时发送的数据包。

猜你喜欢

转载自blog.csdn.net/wearlee/article/details/80332248