3. 连接间隔(Connection Interval):取值范围、对功耗与吞吐量的影响、如何选择合适的间隔
连接间隔,英文叫 Connection Interval。说白了,就是两个蓝牙设备之间,每隔多久互相「打招呼」一次。
这个参数太关键了。我做了这么多年蓝牙开发,可以负责任地告诉你:连接间隔选得好,项目就成功了一半。选不好?功耗爆炸、数据丢包、连接不稳,各种坑等着你。
3.1 取值范围:不是你想设多少就设多少
蓝牙核心规范规定了连接间隔的范围。嗯,这里要注意,不同蓝牙版本略有差异,但主流范围是这样的:
| 参数 | 最小值 | 最大值 | 单位 |
|---|---|---|---|
| 连接间隔 | 7.5 ms | 4000 ms | 毫秒 |
| 对应步长 | 1.25 ms | — | 毫秒 |
注意,这个 7.5 ms 是 BLE 4.0 之后才支持的。早期版本最小是 20 ms。我有个项目就踩过这个坑——芯片只支持 20 ms 起步,结果我按 7.5 ms 去配,连接直接失败。
3.2 对功耗的影响:间隔越大,越省电
这个逻辑很直观。你想想看,两个设备每 7.5 ms 就要醒来一次,互相发个包确认「我还活着」。一天下来,收发器要开关多少次?
功耗和连接间隔的关系,大致是这样的:
- 间隔越小(比如 7.5 ms ~ 30 ms):设备频繁唤醒,收发器占空比高,功耗大。适合需要低延迟的场景。
- 间隔适中(比如 50 ms ~ 200 ms):平衡点。大多数消费类产品落在这个区间。
- 间隔越大(比如 500 ms ~ 4000 ms):设备大部分时间在睡觉,功耗极低。但延迟也高得离谱。
我习惯用一个简单的公式来估算功耗:
平均电流 ≈ (唤醒电流 × 唤醒时间 + 睡眠电流 × 睡眠时间) / 连接间隔
举个例子,假设唤醒电流 10 mA,唤醒时间 2 ms,睡眠电流 1 μA:
- 间隔 7.5 ms:平均电流 ≈ (10 mA × 2 ms + 0.001 mA × 5.5 ms) / 7.5 ms ≈ 2.67 mA
- 间隔 100 ms:平均电流 ≈ (10 mA × 2 ms + 0.001 mA × 98 ms) / 100 ms ≈ 0.2 mA
- 间隔 1000 ms:平均电流 ≈ (10 mA × 2 ms + 0.001 mA × 998 ms) / 1000 ms ≈ 0.02 mA
看到了吗?从 7.5 ms 到 1000 ms,功耗差了 100 多倍。所以,如果你做的是纽扣电池设备,连接间隔千万别设太小。
3.3 对吞吐量的影响:间隔越小,速度越快
吞吐量,说白了就是单位时间内能传多少数据。连接间隔直接影响这个。
每个连接事件(Connection Event)里,主设备和从设备可以互相发多个包。但每个连接事件能发的包数量,受限于两个因素:
- 连接间隔的长度——间隔越长,每个连接事件里能塞的包就越多(因为时间充裕)。
- 每个包的大小——BLE 4.2 之前最大 27 字节,之后支持 251 字节(DLE 扩展)。
吞吐量的计算公式:
吞吐量 ≈ (每个连接事件的字节数 × 连接事件数) / 时间
连接事件数 = 1000 ms / 连接间隔。
我整理了一个对比表,方便你直观感受:
| 连接间隔 | 每个连接事件最大包数 | 理论吞吐量(27 字节包) | 理论吞吐量(251 字节包) |
|---|---|---|---|
| 7.5 ms | 1 ~ 2 | ~ 7.2 KB/s | ~ 66.9 KB/s |
| 30 ms | 4 ~ 6 | ~ 5.4 KB/s | ~ 50.2 KB/s |
| 100 ms | 10 ~ 15 | ~ 4.0 KB/s | ~ 37.6 KB/s |
| 500 ms | 30 ~ 50 | ~ 2.7 KB/s | ~ 25.1 KB/s |
你可能会问:为什么间隔越小,吞吐量反而越高?
因为连接事件更密集了。虽然每个事件能发的包数少了,但事件总数多了。综合下来,小间隔的吞吐量更大。
3.4 如何选择合适的间隔:一个决策框架
选连接间隔,说白了就是在功耗和性能之间找平衡。没有万能答案,但有一个决策框架可以参考:
- 先看应用场景:
- 实时控制类(如遥控器、游戏手柄):需要低延迟,间隔选 7.5 ms ~ 20 ms。
- 数据采集类(如传感器、温湿度计):延迟不敏感,间隔选 500 ms ~ 2000 ms。
- 音频/OTA 类:需要高吞吐量,间隔选 15 ms ~ 50 ms。
- 再看电池容量:
- 纽扣电池(CR2032):间隔至少 100 ms 以上,否则撑不过一周。
- 锂电池(100 mAh 以上):可以适当缩小间隔,但也要留余量。
- 最后看射频环境:
- 干扰严重的环境(如 2.4 GHz 拥挤区域):间隔不宜太小,否则容易丢包重传,反而更耗电。
- 空旷环境:可以放心用小间隔。
3.5 核心逻辑图:连接间隔决策树
下面这张图,帮你把整个决策过程串起来:
3.6 实战中的几个坑
最后,分享几个我踩过的坑,希望能帮你少走弯路:
- 坑一:间隔设太小,连接不稳定。我曾经把一个心率手环的间隔设成 7.5 ms,结果在健身房这种人多的地方,连接频繁断开。后来调到 30 ms,问题解决。
- 坑二:间隔设太大,用户体验差。有个智能锁项目,为了省电把间隔设成 2000 ms。结果用户按了开锁键,要等 2 秒才有反应。被投诉后改成了 100 ms。
- 坑三:主从设备间隔不一致。连接间隔是由主机(Central)决定的,从机(Peripheral)只能建议。如果你的从机建议了 50 ms,但主机强制用 200 ms,那也没办法。所以,一定要确认主机的策略。