人人都在问的禁节点连续扫描降低功耗的问题。
当节点与协调器断开后,总会一直扫描,试图重新加入,碰巧某个节点设备被放在一个通信不好的位置,电池也就很快用完,或者有一大堆设备,白天需要正常工作,晚上可能会收到协调器发来的指令,进入休眠状态(设备很多,无法手工逐个关闭、开启),此时节点断网后,仅需相当长的周期检查一下网络,以保证第二个白天及时进入正常工作状态。
以上的需求能了解到的解决方案基本上都是修改zgDefaultStartingScanDuration,实测虽然信标发送周期控制了,但好像并没有将信道扫描停止,功耗一直保持在25mA左右,以下是我瞎琢磨的方法,实测好像能达到开头所述需求,分享一下:
1、加入全局变量myEndDeviceJoinCnt用于统计扫描入网次数
#if defined(MY_ENDDEVICE)
uint8 myEndDeviceJoinCnt=0;//尝试加入网络计数
#endif
2、模仿ZDO_NETWORK_INIT事件加入自定义事件ZDO_START_JOINING_EVT并在事件处理函数中加入
#if defined(MY_ENDDEVICE)
if ( events & ZDO_START_JOINING_EVT )
{
myEndDeviceJoinCnt=0;//清入网尝试计数
ZDApp_StartJoiningCycle();//启动入网
return (events ^ ZDO_START_JOINING_EVT);
}
#endif
3、在ZDO_StartDevice函数最后加入
#if defined(MY_ENDDEVICE)
else{
if(startMode== MODE_JOIN||zgDefaultChannelList==MAX_CHANNELS_24GHZ){
if(myEndDeviceJoinCnt++>5){//尝试5次入网
ZDApp_StopJoiningCycle();//停止尝试
#if defined( LCD_SUPPORTED )
HalLcdWriteNumber(98);//1621屏上打个标志
#endif
osal_pwrmgr_device(PWRMGR_BATTERY);//将设备设为低功耗,初始入网好像被设成了PWRMGR_ALWAYS_ON 即使停止扫描,也会有8mA的功耗
osal_start_timerEx(ZDAppTaskID, ZDO_START_JOINING_EVT,NWK_RETRY_CYCLE_DELAY/*自定义的入网尝试周期*/ );//过一段较长时间再尝试入网
//myEndDeviceJoinCnt=0;
}
}
}
#endif
这样,断网或节点启动后协调器还未启动,节点先尝试入网,失败后,进入低功耗,暂停一段时间(自己设定),再重新尝试几次入网,如此将功耗降到最低。
有其他好的方法别忘了分享下哦.
按键有没有设成中断模式,如果没有的话每100ms会唤醒检测一下按键。另外检查一下类似的周期性事件还有没有
感谢分享。 TI已经在协议栈里面实现了这个功能的,你可以看下ZDO_REJOIN_BACKOFF这个事件的定义。
VV你好,我现在想实现这个功能,但是没有找到你说的ZDO_REJOIN_BACKOFF事件啊,我用的协议栈版本为2.6.2
找到了,最新的协议栈有。如果想细致的学习一下协议栈看那些书会比较好呢?
没有详细介绍协议栈软件的文档
关于API的介绍你可以参考协议栈下面安装的Documents Folder里面。
其他的你可以参考ZigBee Specification,TI就是按照标准做的软件实现