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.

请问,cc2530如何让终端在没有加入网络的情况下进入POWER_SAVING?

Other Parts Discussed in Thread: Z-STACK

如题,实际测试中发现,终端只有在加入网络之后才能进入低功耗模式,那么如果只有一个终端的情况下,就会一直在正常工作模式,这样子电池供电的话工作不了几天就没电了。

  • 非常理解你的需求,在实际应用中也确实存在这样的问题。

    首先你需要通过抓包看下,为什么在没有入网的情况下,功能一直会很高。原先是因为节点一直在搜索网络,发送beacon request寻找网络。

    那么如果需要实现低功耗,你需要控制搜索网络的频率,或者间歇性的搜索网络。

    有两种方式可以做

    1)手动的使能网络扫描,你可以通过使能MANAGED_SCAN,具体你可以了解下具体的过程。

    2)停止和启动网络烧苗,你可以开启一段时间扫描,如果没有扫描到,那么可以停止一段时间,这个实现,你可以参考Z-Stack Home 1.2.2a里面针对Rejoin的处理。

    if( events & ZDO_REJOIN_BACKOFF )
    {
    if( devState == DEV_NWK_BACKOFF )
    {
    ZDApp_ChangeState(DEV_NWK_DISC);
    // Restart scan for rejoin
    ZDApp_StartJoiningCycle();
    osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinScan );
    }
    else
    {
    // Rejoin backoff, silent period
    ZDApp_ChangeState(DEV_NWK_BACKOFF);
    ZDApp_StopJoiningCycle();
    osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinBackoff );
    }

    return ( events ^ ZDO_REJOIN_BACKOFF);
    }

  • 虽然定了POWER_SAVING但是有个电源类型的全局变量默认是常电,改成电池

  • 十分感谢你的回复,请问具体在什么地方去改动?

  • /*********************************************************************
    * @fn osal_pwrmgr_device
    *
    * @brief Sets the device power characteristic.
    *
    * @param pwrmgr_device - type of power devices. With PWRMGR_ALWAYS_ON
    * selection, there is no power savings and the device is most
    * likely on mains power. The PWRMGR_BATTERY selection allows the
    * HAL sleep manager to enter sleep.
    *
    * @return none
    */
    void osal_pwrmgr_device( uint8 pwrmgr_device )
    {
    pwrmgr_attribute.pwrmgr_device = pwrmgr_device;
    }

    应该是在这个地方修改吧 

  • 自己弄一个条件编译就行了

    void osal_pwrmgr_init( void )

    {
    #if defined (POWER_SAVING)
    pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY;
    #else
    pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; 
    #endif
    pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve
    }