由于实际应用的需要,我需要将终端设定为路由节点,发自身温湿度数据的同时也实现路由功能。以sensordemo为例,我直接在事件中加入和senddummyreport中增加halsleep(30000)但是没有反应,使用自己设定定时器休眠也不行,请问下有别的实现思路或者其他睡眠方法吗?
Susan Yang:
您好,Z-STACK目前不支持低功耗路由。
目前ZigBee协议里面,节点进行收发数据的时刻都是随机的,所以路由器必须处于活动状态来转发终端节点的数据,或者等待其他终端唤醒以后来请求数据。所以路由器不支持低功耗模式。
bowen gu:
回复 Susan Yang:
那能否直接在事件中处理让芯片进入PM2模式睡眠,再定时起来?
VV:
回复 bowen gu:
可是可以做,你可以强制休眠。
但是一般不建议这样去做。你只需要在休眠的时候,强制把radio关掉。
bowen gu:
回复 VV:
我试了下在sensordemo上做修改,在democollector.c的zb_HandleOsalEvent中加入我自己的MY_SLEEP_EVT睡眠事件,设断点检查显示这部分程序也得到执行了,但是系统仍旧没有休眠,仍旧按照原有的频率在发送dummyreport(发dummyreport的时间间隔是38秒,MY_SLEEP_EVT的mySleepPeriod 也是38秒,那是不是意味着76秒发一次dummyreport?),请问未正常休眠是什么原因?如何才能做到强制休眠固定长度的时间?
if(event&MY_SLEEP_EVT) { macRxOffRequest(); macRxOff(); OSAL_SET_CPU_INTO_SLEEP(myReportPeriod); osal_start_timerEx( sapi_TaskID, MY_SLEEP_EVT, mySleepPeriod ); }
gancheng:
回复 bowen gu:
你这种做法实际上就是把路由强制变成终端了,路由休眠了就没有路由的功能了,区别就是你这样做可以让网络规模比较大。
bowen gu:
回复 gancheng:
实际的想法就是想弱化路由功能,让其能够更长时间的工作,来换取更大的网络规模,同时也不完全丢掉路由功能,要保证正常的组MESH网络,因为实际情况是路由也没有交流电源供电长时间供电,但是整个网络节点的位置基本是固定不动的,路由本身也需要采集数据,但是单纯的终端接在协调器的覆盖范围又不足以覆盖整个区域。目前正头疼呢,不知您有何高见?
VV:
回复 bowen gu:
对于路由来说,什么时候需要转发数据是不确定的,所以不可以进入休眠状态。
hua ma:
回复 bowen gu:
目前的协议栈实现不了你想要的功能,如果路由休眠了,需要经过中继的数据无法到达收集节点。
bowen gu:
回复 VV:
我想问一个200m*200m的室内复杂环境区域能否用一个协调器能否进行完全覆盖?
VV:
回复 bowen gu:
能不能覆盖不是有协调器来决定的,而是有路由器的多少,节点的布放位置有关系。