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 去配,连接直接失败。

⚠️ 避坑指南: 我曾经在某个国产芯片上发现,它宣称支持 7.5 ms 间隔,但实际跑起来会随机断开。后来查了芯片勘误表才知道,那个版本有硬件 bug,最小只能跑 10 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)里,主设备和从设备可以互相发多个包。但每个连接事件能发的包数量,受限于两个因素:

  1. 连接间隔的长度——间隔越长,每个连接事件里能塞的包就越多(因为时间充裕)。
  2. 每个包的大小——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

你可能会问:为什么间隔越小,吞吐量反而越高?

因为连接事件更密集了。虽然每个事件能发的包数少了,但事件总数多了。综合下来,小间隔的吞吐量更大。

💡 个人经验: 我做过一个 OTA 升级项目,需要快速传固件。当时把连接间隔设成了 15 ms,配合 DLE 251 字节,实测吞吐量能到 40 KB/s 左右。如果间隔拉到 100 ms,吞吐量直接掉到 10 KB/s 以下,升级时间从 2 分钟变成 8 分钟,用户根本受不了。

3.4 如何选择合适的间隔:一个决策框架

选连接间隔,说白了就是在功耗和性能之间找平衡。没有万能答案,但有一个决策框架可以参考:

  1. 先看应用场景:
    • 实时控制类(如遥控器、游戏手柄):需要低延迟,间隔选 7.5 ms ~ 20 ms。
    • 数据采集类(如传感器、温湿度计):延迟不敏感,间隔选 500 ms ~ 2000 ms。
    • 音频/OTA 类:需要高吞吐量,间隔选 15 ms ~ 50 ms。
  2. 再看电池容量:
    • 纽扣电池(CR2032):间隔至少 100 ms 以上,否则撑不过一周。
    • 锂电池(100 mAh 以上):可以适当缩小间隔,但也要留余量。
  3. 最后看射频环境:
    • 干扰严重的环境(如 2.4 GHz 拥挤区域):间隔不宜太小,否则容易丢包重传,反而更耗电。
    • 空旷环境:可以放心用小间隔。
🔧 实用技巧: 我习惯在开发阶段把连接间隔设成可配置的参数。这样在产品测试时,可以快速切换不同间隔,实测功耗和性能,找到最优值。千万别写死,否则后期改起来很痛苦。

3.5 核心逻辑图:连接间隔决策树

下面这张图,帮你把整个决策过程串起来:

连接间隔决策树 连接间隔决策树 应用场景是什么? 低延迟(遥控/手柄) 平衡(数据采集) 高吞吐(OTA/音频) 电池:纽扣 → 20~50 ms 电池:纽扣 → 200~1000 ms 电池:锂电池 → 15~50 ms 建议间隔 7.5 ms ~ 30 ms 建议间隔 100 ms ~ 500 ms 建议间隔 15 ms ~ 50 ms ⚠️ 注意 以上建议基于典型场景。实际项目中, 一定要结合射频环境和芯片特性做实测验证。

3.6 实战中的几个坑

最后,分享几个我踩过的坑,希望能帮你少走弯路:

  • 坑一:间隔设太小,连接不稳定。我曾经把一个心率手环的间隔设成 7.5 ms,结果在健身房这种人多的地方,连接频繁断开。后来调到 30 ms,问题解决。
  • 坑二:间隔设太大,用户体验差。有个智能锁项目,为了省电把间隔设成 2000 ms。结果用户按了开锁键,要等 2 秒才有反应。被投诉后改成了 100 ms。
  • 坑三:主从设备间隔不一致。连接间隔是由主机(Central)决定的,从机(Peripheral)只能建议。如果你的从机建议了 50 ms,但主机强制用 200 ms,那也没办法。所以,一定要确认主机的策略。
📌 总结一句话: 连接间隔没有「最佳值」,只有「最适合你场景的值」。先明确需求,再实测验证,最后定下来。别偷懒,这一步省不了。