结论边界
“开启 Power Save”不等于功耗一定下降。802.11 Power Save 是 STA 与 AP 之间的链路语义,不是终端本地一个私有开关。
先看边界:
- STA 需要通过帧头里的 Power Management bit 告诉 AP 自己进入省电态。
- AP 接受后,才会按省电 STA 的语义缓存单播数据。
- STA 要按 Beacon/TIM/DTIM 节奏醒来检查缓存提示。
- TIM 只是提示 AP 有缓存,不是数据已经交付。
- 缓存领取可能走 PS-Poll,也可能走 U-APSD;两者抓包形态不同。
- 功耗下不来,常见原因是频繁醒来、领取缓存低效、链路重传、AP/驱动省电语义不一致,而不只是应用层心跳太密。
排障不要只看 SDK 返回“power save enabled”。要看空口和设备日志是否真的形成省电交互。
先确认 PM bit
Power Management bit 的作用不是“让本机睡觉”,而是声明:
从这帧开始,AP 应按省电 STA 的规则处理我的下行数据。
抓包重点:
- STA 是否稳定发送
PM=1的帧; - 是否刚切到
PM=1又很快回到PM=0; - 上行业务、扫描、漫游、驱动策略是否频繁把 STA 拉回 active;
- AP 是否在 STA 进入省电后改变单播下发行为。
如果驱动日志显示省电已开启,但空口上看不到稳定 PM bit 切换,这个“开启”对链路侧没有意义。
再看 TIM
AP 为省电 STA 缓存单播数据后,通过 Beacon 中的 TIM 提示缓存状态。
TIM 的语义:
AP 当前是否有与某些 AID 对应的缓存单播数据
它不是:
数据已经发给 STA
STA 已经收到数据
后续不需要额外 MAC 交互
排查 TIM 前先拿到目标 STA 的 AID。否则看 Partial Virtual Bitmap 很容易误判。
判断顺序:
- 确认目标 STA 的 AID。
- 看 Beacon 的 Bitmap Control 和 Partial Virtual Bitmap 是否覆盖该 AID。
- 判断目标 AID bit 是否置位。
- 观察 TIM 后 STA 是否醒来领取缓存。
常见误判:
- 位图很短就认为 AP 没缓存;
- 忽略 bitmap offset;
- 把 DTIM 相关指示和单播 AID bit 混在一起看;
- 看到 TIM 置位就认为数据已经交付。
DTIM 会影响平均功耗
DTIM 是 Delivery Traffic Indication Message。AP 按 DTIM 周期提示组播/广播缓存,也会影响 STA 必须醒来的节奏。
工程影响:
- DTIM period 越小,STA 越频繁醒来;
- DTIM period 越大,组播/广播下发延迟可能变高;
- 有些 IoT 设备即使单播很少,也会因为 DTIM 频繁醒来;
- AP 的 Beacon interval 和 DTIM period 要一起看。
记录时不要只写“DTIM=3”,还要写 Beacon interval:
Beacon interval = 100 ms
DTIM period = 3
=> DTIM 间隔约 300 ms
缓存领取:PS-Poll 与 U-APSD
TIM 置位后,STA 需要领取缓存数据。
PS-Poll
传统 PS-Poll 路径:
AP Beacon/TIM: 有缓存
STA -> AP: PS-Poll
AP -> STA: buffered DATA
STA -> AP: ACK
如果 AP 还有更多缓存,DATA 里可能设置 More Data bit,STA 继续领取。
问题点:
- PS-Poll 往返多,缓存多时效率低;
- 每领一批都要保持 awake;
- 丢包或低速率会拉长活跃窗口;
- More Data 判断错误会导致 STA 过早睡回去或长时间醒着。
U-APSD
WMM Power Save / U-APSD 通过 trigger frame 触发 AP 下发 service period 内的缓存帧。
典型判断字段:
- trigger frame;
- QoS Data;
- More Data;
- EOSP;
- AC 是否启用 U-APSD。
EOSP 表示本次 service period 结束。若 EOSP 缺失或异常,STA 可能不敢睡回去,平均功耗会上升。
功耗下不来的常见原因
1. PM bit 不稳定
表现:
- STA 频繁
PM=1/PM=0切换; - 后台扫描、保活、驱动队列让 STA 长时间 active;
- 用户态以为省电已开,空口上没有稳定省电状态。
排查:
抓 STA 发出的 Data/QoS Null
看 Power Management bit
对照驱动电源状态日志
2. DTIM 过密
表现:
- 单播不多,但 STA 仍频繁醒来;
- Beacon/DTIM 节奏与电流波形对应明显。
排查:
记录 Beacon interval / DTIM period
看每个 DTIM 是否拉起 Wi-Fi 模组
检查是否有组播/广播缓存
3. TIM 后领取缓存低效
表现:
- TIM 置位后,PS-Poll/trigger 往返多;
- More Data 长时间为 1;
- EOSP 不及时;
- 活跃窗口被拖长。
排查:
TIM -> PS-Poll/trigger -> DATA -> ACK
统计一次缓存领取持续时间
统计期间 retry 和 rate
4. 链路质量差导致重传
低功耗设备常常只看平均流量,忽略重传 airtime。
表现:
- 上下行数据量不大;
- retry/ACK miss 多;
- 每次醒来都因为重传多停留更久;
- 电流波形显示短业务变成长活跃窗口。
排查:
RSSI/SNR
FCS/PHY error
Retry bit
MCS/rate fallback
ACK miss
CCA busy
5. AP 与 STA 省电能力不匹配
可能情况:
- AP 对 PS-Poll/U-APSD 支持或策略不同;
- 某些 AC 没启用 U-APSD;
- AP 组播/广播策略保守;
- AP 固件对 IoT STA 省电兼容性差。
排查:
关联能力协商
WMM/U-APSD 参数
AP 日志
换 AP 对比
固定 basic rates / DTIM / beacon interval 做 A/B 测试
抓包判断路径
1. 建立时间线
不要只截单帧。按时间线记录:
STA 关联
PM bit 切换
Beacon/TIM/DTIM
PS-Poll 或 U-APSD trigger
AP 下发缓存 DATA
More Data / EOSP
STA 回到省电状态
2. 对齐电流波形
如果有功耗仪,把电流波形与抓包时间对齐。
重点看:
- Beacon/DTIM 是否对应周期性电流尖峰;
- TIM 置位后活跃窗口持续多久;
- retry 是否拉长活跃窗口;
- STA 是否按预期回到 sleep。
3. 对照驱动日志
日志里至少要找:
power save enter / exit
listen interval
DTIM
U-APSD config
TX/RX queue
scan / roam
wake reason
firmware sleep state
空口和日志不一致时,以空口行为为准继续追驱动/固件原因。
常见误判
| 现象 | 不能直接下的结论 | 下一步确认 |
|---|---|---|
| SDK 返回省电开启 | 链路已进入省电 | 必须看 PM bit 和 AP 缓存行为 |
| TIM 置位 | 数据已经收到 | TIM 只是缓存提示,后面还要领取 |
| 流量很小 | 功耗应该低 | DTIM、重传、领取缓存效率会决定平均功耗 |
| DTIM period 大 | 一定更省电 | 组播/广播延迟变大,部分业务可能被拖慢 |
| 看到 PS-Poll | 省电流程正常 | 还要看 More Data、ACK、重传和领取耗时 |
| U-APSD 开启 | 一定比 PS-Poll 省电 | 要看 AC 配置、trigger、EOSP 和 AP 实现 |
现场记录模板
设备 / 模组:
AP 型号 / 固件:
Beacon interval:
DTIM period:
Listen interval:
目标 STA AID:
Power Management bit:稳定 PM=1 / 频繁切换 / 未看到
TIM 是否覆盖目标 AID:
DTIM 是否触发周期唤醒:
领取方式:PS-Poll / U-APSD / 其他
More Data:
EOSP:
Retry / ACK miss:
RSSI/SNR:
CCA busy:
电流波形活跃窗口:
驱动日志 wake reason:
结论:
缺失证据:
来源与核验
- IEEE Std 802.11:Power Management bit、TIM/DTIM、AID、PS-Poll、QoS/U-APSD、More Data、EOSP、ACK/retry 语义。
- Wireshark/radiotap:PM bit、TIM bitmap、QoS Control、More Data、EOSP、Retry、rate、RSSI/SNR、FCS/PHY error。
- 设备侧证据:驱动/固件 power save 状态、wake reason、scan/roam、TX/RX queue、电流波形。
最后结论
Wi‑Fi 省电排查按这条线走:
STA 是否稳定声明 PM=1?
AP 是否开始缓存单播?
TIM 是否正确覆盖目标 AID?
DTIM 是否过密?
缓存领取走 PS-Poll 还是 U-APSD?
More Data / EOSP 是否让 STA 能及时睡回去?
重传和低速率是否拉长活跃窗口?
电流波形是否与 Beacon/DTIM/TIM/领取缓存对应?
只有这些证据闭合,才能判断功耗下不来是应用层唤醒太多、AP 策略问题、链路质量问题,还是驱动/固件没有真正进入省电轨道。
回复 / 留言