4、BLE广播功耗优化:广播间隔、广播类型与数据包长度

广播,是BLE设备最基础的行为之一。但很多人没意识到,广播阶段的功耗,往往占了整个设备功耗的大头。我见过不少项目,明明待机电流设计得挺好,一跑广播就崩了——电池撑不过一周。

这一章,咱们就聊聊广播功耗怎么优化。说白了,就是三个维度:广播间隔怎么选、广播类型怎么定、数据包长度怎么控

4.1 广播间隔(Advertising Interval)的选择

广播间隔,就是设备两次广播事件之间的时间。单位是0.625ms,协议里叫Advertising Interval。

举个例子:你设了100,那实际间隔就是100 × 0.625ms = 62.5ms。

间隔越短,设备被发现得越快,但功耗也越高。这是个典型的trade-off。

核心公式:广播功耗 ≈ 广播事件次数 × 单次广播能耗

间隔减半,功耗翻倍。就是这么直接。

我个人习惯,在项目初期先按这个经验值来选:

应用场景 推荐广播间隔 平均电流(参考)
快速配对/发现 20ms - 50ms ~500μA - 1mA
常规信标 100ms - 500ms ~50μA - 200μA
低功耗传感器 1s - 5s ~5μA - 20μA

我在一个智能门锁项目里遇到过一个问题:客户要求手机靠近时1秒内必须发现设备。我一开始设了20ms间隔,功耗直接飙到1.2mA。后来改成动态广播——平时用1s间隔,检测到手机靠近信号再切到20ms。功耗降了80%。

技巧:如果产品支持,尽量用动态广播间隔。平时低频,需要时高频。这是性价比最高的方案。

4.2 广播类型功耗对比

BLE广播分三种类型:可连接广播、不可连接广播、扫描响应广播。功耗差异不小。

你想想看,这三种广播,本质上区别在哪?

  • 可连接广播(Connectable):广播包+扫描响应包,设备可以被连接。功耗最高。
  • 不可连接广播(Non-connectable):只发广播包,不响应扫描请求。功耗最低。
  • 扫描响应广播(Scannable):广播包+扫描响应包,但不可连接。功耗居中。

我做过一个对比测试,用同一块开发板,同样的广播间隔(100ms),结果如下:

广播类型 平均电流 适用场景
不可连接广播 ~45μA 信标、广播数据
扫描响应广播 ~65μA 需要额外数据但不需要连接
可连接广播 ~85μA 需要建立连接

嗯,这里要注意:如果你的设备只是发个温度数据,根本不需要连接,那就别用可连接广播。我曾经见过一个项目,明明只是广播温湿度,却用了可连接广播,白白多耗了40%的电流。

避坑指南:我曾经在一个项目中,为了省事,所有设备统一用了可连接广播。结果功耗超标,排查了两天才发现是广播类型的问题。后来改成不可连接广播,电流直接降了一半。

4.3 广播数据包长度优化

广播数据包,最大31字节。很多人觉得,反正就31字节,能塞多少塞多少。其实不然。

广播包越长,空中传输时间越长,功耗也越高。虽然单次差异不大,但积少成多。

我建议你遵循这几个原则:

  1. 只放必要数据。比如设备名称,如果不需要显示全名,用缩写。
  2. 合并AD Structure。多个数据尽量合并到一个AD Structure里。
  3. 避免冗余。比如UUID,如果协议里已经定义了,广播里就别重复。

举个例子,一个典型的iBeacon广播包:

// 优化前:31字节全用满
0x02 0x01 0x06          // Flags
0x1A 0xFF 0x4C 0x00     // Manufacturer Specific Data
0x02 0x15               // iBeacon Proximity UUID
...                      // 20字节UUID + Major + Minor + Tx Power

// 优化后:只保留核心数据
0x02 0x01 0x06          // Flags
0x0A 0xFF 0x4C 0x00     // Manufacturer Specific Data
0x02 0x15               // iBeacon Proximity UUID
...                      // 只保留必要的UUID和Tx Power

我在一个蓝牙手环项目里,把广播包从31字节压缩到18字节,广播功耗降低了约15%。虽然不多,但对于纽扣电池供电的设备来说,这15%可能就是多撑一个月的关键。

小技巧:用Wireshark抓包,看看你的广播包里到底塞了哪些没用的数据。我每次优化前都会先抓包分析,往往能发现一些「历史遗留」的冗余字段。

4.4 综合优化建议

好了,三个维度都聊完了。最后给个总结性的建议:

  • 广播间隔:能长就别短,能用动态就别固定。
  • 广播类型:不需要连接就别用可连接广播。
  • 数据包长度:能短就别长,只放必要数据。

这三个点,任何一个优化到位,都能省下可观的功耗。三个都做到,你的设备续航至少能提升30%-50%。

下一章,咱们聊聊连接阶段的功耗优化。连接建立之后,功耗怎么控?有哪些坑?到时候细说。