This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

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

    不过不建议使用方法二