主要是beacon间隔,DTIM间隔对休眠的影响,关于路由器相关的参数可参考链接:

总结:

  1. beacon是路由器定时发出的广播帧,beacon帧中包括TIM(Traffic Indication Map)信息,用于通知所有的STA是否有单播数据,beacon的间隔一般是100ms。
  2. DTIM是一种特殊的beacon帧,表示Delivery Traffic Indication Map,用于通知STA是否有广播与组播数据,STA收到DTIM beacon后如果发现有广播或组播数据,那么必须唤醒并发送PS-Null来从AP上接收数据,因为广播帧与组播帧没有确认和重传。
  3. DTIM周期表示每隔多少个beacon帧会发送一个携带DTIM的beacon帧。DTIM周期和DTIM间隔是一个意思,都表示周期的意思,最少为1,表示每个beacon都携带DTIM。

3861的WiFi待机参数主要由以下两个接口设置:

/**
* @ingroup  hi_wifi_basic
* @brief  Set sta powersave configuration.CNcomment:设置STA的低功耗参数.CNend
*
* @par Description:
*           Set sta powersave configuration.CNcomment:设置STA的低功耗参数.CNend
*
* @attention  CNcomment:1.参数值越小,功耗越低但性能表现和抗干扰会越差,建议使用默认值或根据流量动态配置.CNend\n
*             CNcomment:2.所有参数配置0,表示该参数使用默认值.CNend\n
*             CNcomment:3.仅支持设置STA的低功耗参数.CNend\n
*             CNcomment:4.需要在关联成功后配置,支持动态配置.CNend\n
*             CNcomment:5.定时器首次启动不计数,故实际睡眠时间为配置的重启次数+1乘以周期.CNend\n
* @param  timer       [IN]  Type  #unsigned char CNcomment:低功耗定时器周期,默认50ms,取值[0-100]ms.CNend
* @param  time_cnt    [IN]  Type  #unsigned char CNcomment:低功耗定时器重启次数,达到该次数后wifi无数据收发则进入休眠,
                                                 默认为4,取值[0-10].CNend
* @param  bcn_timeout [IN]  Type  #unsigned char CNcomment:等待接收beacon的超时时间,默认10ms,取值[0-100]ms.CNend
* @param  mcast_timeout [IN]  Type  #unsigned char CNcomment:等待接收组播/广播帧的超时时间,默认30ms,取值[0-100]ms.CNend
*
* @retval #HISI_OK  Excute successfully
* @retval #Other           Error code
* @par Dependency:
*            @li hi_wifi_api.h: WiFi API
* @see  NULL
*/
int hi_wifi_sta_set_pm_param(unsigned char timer, unsigned char time_cnt, unsigned char bcn_timeout,
                             unsigned char mcast_timeout);

/**
* @ingroup  hi_wifi_basic
* @brief    Open/close system power save.CNcomment:开启/关闭WiFi低功耗模式并配置预期休眠时间.CNend
*
* @par Description:
*           Open/close system power save.CNcomment:开启/关闭WiFi低功耗模式并配置预期休眠时间.CNend
*
* @attention  NULL
* @param  enable     [IN] Type  #unsigned char, enable(1) or disable(0).CNcomment:开启/关闭WiFi低功耗.CNend
* @param  sleep_time [IN] Type  #unsigned int, expected sleep time(uint: ms). CNcomment:预期休眠时间(单位: 毫秒),
*                               参考有效范围33ms~4000ms, 准确的时间根据dtim*beacon和sleep_time值计算,
*                               关闭低功耗或者不配置有效休眠时间时需要将sleep_time配置为0(休眠时间由关联的ap决定).CNend
*
* @retval #HI_ERR_SUCCESS  Excute successfully
* @retval #Other           Error code
* @par Dependency:
*            @li hi_wifi_api.h: WiFi API
* @see  NULL
*/
int hi_wifi_set_pm_switch(unsigned char enable, unsigned int sleep_time);

hi_wifi_set_pm_switch用于设置设备在WiFi待机模式下每隔多久唤醒一次用于接收beacon和DTIM,hi_wifi_sta_set_pm_param用于设置每次唤醒后接收的超时参数。比如设置hi_wifi_set_pm_switch(HI_TRUE, 1000),则表示设备休眠后会每隔1秒唤醒一次用于接收beacon和DTIM。

关键点:设备并不一定是按设置的sleep_time的周期唤醒的,而是会根据当前路由器的DTIM周期和beacon周期来动态调整,如果sleep_time刚好是DTIM*beacon的整数倍,那么表示设备总能在每次唤醒时收到DTIM,这时就会按sleep_time周期唤醒,如果sleep_time不是DTIM*beacon的整数倍,那么3861会动态调整自己的唤醒间隔,或是每隔几次唤醒后延长一次自己的休眠时间,以接收DTIM数据。

以下是一些设置sleep_time为1000时,实际测得的唤醒间隔:

  1. 设置DTIM周期为1,beacon间隔为700ms,这时3861的唤醒间隔也会同步变为每700ms唤醒一次。
  2. 设置DTIM周期为4,beacon周期为170,这时3861的唤醒间隔约为700ms,但每隔几次唤醒后会延时一会再休眠,猜测是为了弥补与DTIM*beacon的时差。

其他点:

  1. 无线局域网内用发包工具按beacon周期对设备发送UDP单播/组播包或TCP包时,设备每次唤醒后都会延时一会再休眠。
  2. 无线局域网内网络拥挤时,设备每次唤醒后也有可能会延时一会再休眠。
  • 无标签