怎么让协调器掉电后,终端停止搜索网络进入睡眠,一段时间后唤醒重新搜索网络
TI工程师你好
我想让协调器掉电后,让终端进入睡眠状态,停止搜索网络,定时一段时间后,唤醒,然后恢复搜索网络,如果没有搜索到网络,就一直重复这个过程,我在GenericApp_NwkState == DEV_NWK_ORPHAN后让他睡眠,
1. 请问我该调用哪个函数让他睡眠呢?
2. 下面这两个函数怎么使用呢?
启动搜索网络 uint8 ZDApp_StartJoiningCycle( void )
停止搜索网络 uint8 ZDApp_StopJoiningCycle( void )
3. 是不是在调用ZDApp_StopJoiningCycle后终端就会进入睡眠?
协调器掉电后,可以调用ZDApp_StopJoiningCycle停止搜网
怎么让他停止搜索网络然后睡眠一定时间呢?当协调器掉电后,终端的网络状态是DEV_NWK_ORPHAN就是失去父设备,但是ZDApp_StopJoiningCycle他是自由网络状态是devState == DEV_INIT || devState == DEV_NWK_DISC才能停止搜索网络
DEV_NWK_ORPHAN入网失败后自动转到 DEV_NWK_DISC
但是我在程序中调用ZDApp_StopJoiningCycle这个函数,我将终端连上协调器后,然后将协调器断电,终端断网,然后再将协调器上电,终端很快就连上了,并没有被禁止连接
程序如下
else if(GenericApp_NwkState == DEV_NWK_ORPHAN)
{
HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
ZDApp_StopJoiningCycle();
}
对于这个问题,好多解答都是使用ZDApp_StopJoiningCycle函数,但是就是不说在哪个函数调用,怎么进入睡眠,我结合网上的一些方法总结出一下方法
方法一:在ZDO_StartDevice()函数中,加在这个判断句里面if (startMode == MODE_REJOIN && scanCnt++ >= 5 ),
加入下内容
ZDApp_StopJoiningCycle(); //停止搜索网络
halSleep(10000); //睡眠3S
HalLedBlink(HAL_LED_1, 2, 50, 500); //唤醒后LED1闪烁2下
ZDApp_StartJoiningCycle(); //恢复网络搜索
另外还要在该c文件开头添加#include "hal_led.h"头文件
方法二:还有说改变BEACON的扫描间隔时间,但是这么做的话,如果协调器长时间掉电,然后恢复上电,则终端要很久才能重新连接到协调器,就像进入死机一样,
代码如下
在UINT16 GenericApp_ProcessEvent(byte task_id, UINT16 events)函数中加入下内容
if((GenericApp_NwkState == DEV_END_DEVICE)||
(GenericApp_NwkState == DEV_ROUTER))
{
zgDefaultStartingScanDuration = STARTING_SCAN_DURATION; //恢复连续扫描
osal_set_event(GenericApp_TaskID, SEND_DATA_EVENT);
HalLedBlink(HAL_LED_1, 0, 50, 500);
//aps_AddGroup(GENERICAPP_ENDPOINT, &GenericApp_Group);
}
else if(GenericApp_NwkState == DEV_NWK_ORPHAN)
{
HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
zgDefaultStartingScanDuration = BEACON_ORDER_4_SECONDS; //每4秒扫描一次
}
不过不建议使用方法二