4、Advertising 状态下的休眠:Advertising Interval 与休眠窗口,可连接与非可连接广播的功耗差异
广播状态下的休眠,是 BLE 功耗优化的第一道坎。
很多人觉得广播就是一直往外发数据包,其实不是。芯片在两次广播事件之间,是可以睡大觉的。这个「睡多久」直接决定了你的设备能用几天还是几周。
4.1 Advertising Interval 与休眠窗口
先看一个基本概念:Advertising Interval(广播间隔)。
它指的是两次广播事件起始点之间的时间。BLE 协议规定这个值范围是 20ms 到 10.24s,步进 0.625ms。
但注意,实际广播事件不是精确按这个间隔发生的。协议加了一个随机延迟,范围 0~10ms。为什么?为了防止多个设备在同一个信道持续碰撞。我刚开始做 BLE 时没太在意这个细节,结果在产线上发现多台设备同时广播时丢包率飙升——嗯,后来才意识到是忽略了随机延迟的作用。
一个典型的广播事件长这样:
- 设备在 37/38/39 三个信道上依次发送广播包
- 每个包发送后,会开启一小段接收窗口(ScanWindow),监听是否有扫描请求
- 三个信道发完,本次广播事件结束
- 芯片进入休眠,直到下一个广播事件到来
这个休眠窗口有多大?说白了就是:
休眠窗口 ≈ Advertising Interval - 广播事件持续时间
广播事件持续时间取决于几个因素:
- 广播包长度(31 字节 payload 还是 255 字节扩展广播)
- 是否开启 Scan Response(扫描响应)
- 每个信道上的接收窗口时长
我给你们算一笔账。假设广播间隔 100ms,广播事件持续约 2ms(三个信道各发一个 37 字节包,加接收窗口)。那么休眠窗口就是 98ms。占空比只有 2%。
如果广播间隔拉到 1s,休眠窗口变成 998ms,占空比降到 0.2%。功耗差距是 10 倍。
核心结论:广播间隔每增大 10 倍,平均电流大约降低 10 倍。但代价是设备被发现的时间变长了。
4.2 可连接广播 vs 非可连接广播
这里有个很多人忽略的点:可连接广播(Connectable Advertising)和非可连接广播(Non-connectable Advertising)的功耗差异,比你想象的大得多。
为什么?
可连接广播在发送完广播包后,必须开启接收窗口,等待扫描请求。这个窗口通常持续 150μs 到 300μs。三个信道加起来,接收窗口的总时长大约 0.5~1ms。
非可连接广播呢?发完包直接关射频,不需要等任何人。接收窗口为 0。
你想想看,虽然单次广播事件只差 1ms,但设备一天可能要广播几万次。积少成多,这个差异就出来了。
我做过一个实际对比测试,用同一款芯片,同样的广播间隔 100ms:
| 广播类型 | 广播间隔 | 平均电流 | 休眠占比 |
|---|---|---|---|
| 可连接广播 | 100ms | ~120μA | ~97% |
| 非可连接广播 | 100ms | ~85μA | ~98% |
| 可连接广播 | 1s | ~15μA | ~99.7% |
| 非可连接广播 | 1s | ~10μA | ~99.8% |
看到没?非可连接广播比可连接广播省电约 30%~40%。如果你的应用不需要被连接(比如纯 Beacon 广播),一定要用非可连接广播类型。
我的习惯:在产品原型阶段,我会先用可连接广播调试。等功能稳定后,如果确认不需要连接,就切到非可连接广播。这一步改动,往往能让电池续航从「勉强够用」变成「绰绰有余」。
4.3 广播间隔与休眠窗口的权衡
这里有个经典问题:广播间隔设多大才合适?
答案取决于你的应用场景。我列几个常见场景供你参考:
- 快速连接(如蓝牙配对):20ms~50ms。设备能在 1 秒内被发现并连接。代价是平均电流 300μA 以上。
- 普通交互(如遥控器、门锁):100ms~200ms。用户体验和功耗的折中点。平均电流 50~150μA。
- 周期性广播(如 Beacon、传感器):500ms~2s。功耗很低,但设备被发现可能需要几秒。平均电流 10~30μA。
- 超低功耗(如纽扣电池设备):5s~10s。平均电流可以做到 5μA 以下。但用户体验会受影响。
我曾经踩过的坑:有个项目为了省电,把广播间隔设到了 10s。结果用户按遥控器后,设备要等 10 秒才能被手机发现。产品经理差点没把我吃了。后来改成动态广播间隔——平时 2s,检测到按键动作后立即切换到 50ms,持续 30 秒。既省电又保证了响应速度。
4.4 广播状态下的休眠流程图
下面这张图展示了广播状态下休眠与唤醒的完整流程。我建议你仔细看看,尤其是「休眠窗口」和「广播事件」的交替关系。
4.5 实际项目中的经验
最后分享几个我在项目中积累的经验:
- 动态调整广播间隔:设备空闲时用长间隔(如 1s),需要被发现时切到短间隔(如 50ms)。这个策略在门锁、遥控器、可穿戴设备上非常有效。
- 非可连接广播 + 定向广播:如果你知道要连接的目标设备地址,可以用定向广播(Directed Advertising)。它只在两个信道上发送,且不需要接收窗口,功耗更低。
- 注意晶振精度:休眠时通常使用低频晶振(32.768kHz),精度不如高频晶振。广播间隔越长,累积误差越大。我曾经遇到过广播间隔设 5s,实际变成了 5.3s,导致手机端扫描超时。解决办法是用高频晶振做定期校准。
- 测量实际功耗:不要只看数据手册。用电流探头实测广播状态下的平均电流,你会发现很多「惊喜」。比如某些芯片在休眠唤醒瞬间会有电流尖峰,如果广播间隔很短,这个尖峰占比会很大。
一个小技巧:在广播包 payload 里塞一个序列号,每次广播递增。用手机抓包看序列号是否连续,就能判断设备有没有在休眠期间「假死」或「异常重启」。这个方法帮我排查过好几个低功耗 Bug。
广播状态下的休眠,说白了就是「发完就睡,睡醒再发」。把广播间隔和广播类型选对,你的设备续航就能从「一天一充」变成「一周一充」甚至「一年一充」。