我使用2.5.1版本的Zstack进行低功耗实验。正常联网时,使用halSleep函数能够进入PM2模式。当协调器断电后,为了减少功耗,在SampleApp_ProcessEvent函数中对网络状态进行了10次判断,仍不能联网时则使用halSleep函数进入休眠。可是从软件调试和测试工作电流中发现完全没有进入休眠模式。请教一下应该怎么配置以达到这种效果:协调器断电后终端设备无法联入网络,在休眠半小时重新尝试连入网络。
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.
我使用2.5.1版本的Zstack进行低功耗实验。正常联网时,使用halSleep函数能够进入PM2模式。当协调器断电后,为了减少功耗,在SampleApp_ProcessEvent函数中对网络状态进行了10次判断,仍不能联网时则使用halSleep函数进入休眠。可是从软件调试和测试工作电流中发现完全没有进入休眠模式。请教一下应该怎么配置以达到这种效果:协调器断电后终端设备无法联入网络,在休眠半小时重新尝试连入网络。
是否因為osal_start_timerEx觸発事件後你沒有把事件的bit flag清除?
但是如果停止的话就没法再进入周期发送的状态了,那如果说断网后终端设备休眠一段时间再启动重连应该从那一块入手呢,谢谢
去掉SAMPLEAPP_SEND_PERIODIC_MSG_EVT這個週期性事件就可以正常進入休眠了嗎?
是的,去掉这个就可以进入休眠, 原来的休眠直接放这里是可以的
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{switch ( pkt->clusterId )
{
case SAMPLEAPP_PERIODIC_CLUSTERID:
if(*(pkt->cmd.Data) == endb[0])
{
vIIC_Stop();
vIIC_Stop2();
HalUARTWrite(0, RecvData, Len); //打印收到数据
halSleep(180000);
halSleep(180000);
halSleep(180000);
halSleep(60000);
HalLedSet( HAL_LED_2, HAL_LED_MODE_TOGGLE);
}
break;
现在放这里就不行了
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{
flag++;
halSleep(10000);// Device is no longer in the network
}
break;
default:
break;
}