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 广播状态下的休眠流程图

下面这张图展示了广播状态下休眠与唤醒的完整流程。我建议你仔细看看,尤其是「休眠窗口」和「广播事件」的交替关系。

广播状态下的休眠与唤醒流程 系统初始化 配置广播参数 进入休眠(低功耗模式) 定时器唤醒(广播间隔到期) 发送广播包(37/38/39信道) 可连接? 是 开启接收窗口 否 直接休眠 循环 关键参数 • 广播间隔:20ms~10.24s • 随机延迟:0~10ms • 接收窗口:150~300μs • 休眠占比:97%~99.8% 功耗差异 • 可连接广播:~120μA • 非可连接广播:~85μA • 省电比例:约30%~40%

4.5 实际项目中的经验

最后分享几个我在项目中积累的经验:

  1. 动态调整广播间隔:设备空闲时用长间隔(如 1s),需要被发现时切到短间隔(如 50ms)。这个策略在门锁、遥控器、可穿戴设备上非常有效。
  2. 非可连接广播 + 定向广播:如果你知道要连接的目标设备地址,可以用定向广播(Directed Advertising)。它只在两个信道上发送,且不需要接收窗口,功耗更低。
  3. 注意晶振精度:休眠时通常使用低频晶振(32.768kHz),精度不如高频晶振。广播间隔越长,累积误差越大。我曾经遇到过广播间隔设 5s,实际变成了 5.3s,导致手机端扫描超时。解决办法是用高频晶振做定期校准。
  4. 测量实际功耗:不要只看数据手册。用电流探头实测广播状态下的平均电流,你会发现很多「惊喜」。比如某些芯片在休眠唤醒瞬间会有电流尖峰,如果广播间隔很短,这个尖峰占比会很大。

一个小技巧:在广播包 payload 里塞一个序列号,每次广播递增。用手机抓包看序列号是否连续,就能判断设备有没有在休眠期间「假死」或「异常重启」。这个方法帮我排查过好几个低功耗 Bug。

广播状态下的休眠,说白了就是「发完就睡,睡醒再发」。把广播间隔和广播类型选对,你的设备续航就能从「一天一充」变成「一周一充」甚至「一年一充」。