微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 怎么让协调器掉电后,终端停止搜索网络进入睡眠,一段时间后唤醒重新搜索网络

怎么让协调器掉电后,终端停止搜索网络进入睡眠,一段时间后唤醒重新搜索网络

时间:10-02 整理:3721RD 点击:

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秒扫描一次
}

不过不建议使用方法二

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top