连接参数基础:三大核心参数定义与作用
做蓝牙开发这些年,我见过太多工程师一上来就调参数,结果越调越糟。说白了,连接参数就像蓝牙通信的「交通规则」——你不懂规则,车开得再快也得翻。
这一章,咱们就把 Connection Interval、Slave Latency、Supervision Timeout 这三个核心参数彻底讲透。嗯,每个参数我都会结合项目里踩过的坑来讲,保证你听完就能用。
2.1 Connection Interval(连接间隔)
连接间隔,就是主设备和从设备之间两次「握手」的时间间隔。单位是 1.25ms,取值范围 7.5ms ~ 4s。
举个例子:你设了 30(十进制),那实际间隔就是 30 × 1.25ms = 37.5ms。也就是说,主设备每 37.5ms 会发一次数据包给从设备。
核心公式:
实际间隔(ms)= Connection Interval × 1.25ms
取值范围:6 ~ 3200(对应 7.5ms ~ 4000ms)
我个人习惯把连接间隔分成三类场景:
| 场景 | 推荐间隔 | 典型值 |
|---|---|---|
| 高实时性(游戏手柄、鼠标) | 7.5ms ~ 15ms | 6 ~ 12 |
| 中等实时性(心率监测、键盘) | 20ms ~ 50ms | 16 ~ 40 |
| 低功耗(温湿度传感器、信标) | 100ms ~ 1s | 80 ~ 800 |
我在项目中遇到过一个问题:某款智能手环,连接间隔设了 7.5ms,结果手机端功耗直接翻倍。为什么?因为手机蓝牙芯片每 7.5ms 就要被唤醒一次,根本来不及休眠。后来我改成 30ms,功耗降了 40%,用户体验反而更好。
我的经验:连接间隔不是越小越好。你想想看,间隔越小,延迟越低,但功耗越高。关键是要找到那个「甜点」——满足延迟要求的前提下,尽量拉大间隔。
2.2 Slave Latency(从设备延迟)
这个参数很多人理解错了。Slave Latency 不是「延迟」,而是「从设备可以跳过多少次连接事件而不回复」。
说白了,它允许从设备「偷懒」。比如你设了 Slave Latency = 4,那从设备最多可以连续跳过 4 次连接事件,不用发任何数据包。主设备还是会按时发,但从设备可以继续睡。
关键点:
- Slave Latency 取值范围:0 ~ 499
- 最大值不能超过 (Supervision Timeout / Connection Interval) - 1
- 设为 0 表示不允许跳过任何连接事件
我记得有一次做低功耗温度标签,要求电池撑一年。连接间隔设了 500ms,但温度数据每 5 秒才上报一次。如果每次连接事件都回复,太浪费了。我设了 Slave Latency = 9,这样从设备每 5 秒才真正参与一次连接事件,其余时间都在深度休眠。
结果呢?电池寿命从 8 个月延长到了 14 个月。嗯,这就是 Slave Latency 的威力。
避坑指南:我曾经把 Slave Latency 设得太大,导致手机端以为设备断连了。因为主设备收不到回复,会触发 Supervision Timeout。记住:Slave Latency 越大,连接越「脆弱」,一旦丢包就可能超时断连。
2.3 Supervision Timeout(监督超时)
Supervision Timeout 是连接的「安全网」。如果主设备在超时时间内没收到从设备的任何有效数据包,就会判定连接断开。
单位是 10ms,取值范围 100ms ~ 32s。注意:它必须大于 (Connection Interval × (Slave Latency + 1)) × 2。
强制约束:
Supervision Timeout > (Connection Interval × (Slave Latency + 1)) × 2
典型值:2000ms ~ 6000ms
你想想看,如果连接间隔是 50ms,Slave Latency = 4,那从设备最长可以 250ms 不回复。如果 Supervision Timeout 设了 300ms,那稍微丢一个包就可能断连。所以我一般会留 2~3 倍的余量。
| 参数组合 | 最小超时 | 推荐超时 |
|---|---|---|
| 间隔 30ms,Latency=0 | 60ms | 1000ms |
| 间隔 50ms,Latency=4 | 500ms | 3000ms |
| 间隔 100ms,Latency=9 | 2000ms | 6000ms |
我在做蓝牙门锁项目时踩过一个坑:Supervision Timeout 设了 500ms,结果用户把手机放口袋里走远了,门锁 0.5 秒就断连了。用户投诉说「一转身就断」。后来我改成 4000ms,给了足够的缓冲时间,问题就解决了。
我的建议:除非你的应用对断连检测有极高要求(比如医疗设备),否则 Supervision Timeout 设 3~6 秒比较稳妥。太短容易误断,太长又会让用户觉得「反应迟钝」。
2.4 三大参数的联动关系
这三个参数不是孤立的。它们像齿轮一样咬合在一起。我画了一张图,帮你理清它们的关系:
从图上你能看到:
- Connection Interval 是基础,决定了通信的「节拍」
- Slave Latency 在节拍上做「减法」,允许从设备跳过某些节拍
- Supervision Timeout 是「安全阀」,防止连接无限期等待
三者必须满足一个硬约束:Supervision Timeout > Connection Interval × (Slave Latency + 1) × 2。如果不满足,蓝牙协议栈会直接拒绝你的参数。
实战口诀:
先定间隔,再算延迟,最后设超时。超时至少是实际间隔的 3 倍以上。
2.5 参数配置示例
下面是一个实际项目中我用过的参数配置,跑在 Nordic nRF52832 上,连接一台 Android 手机:
// 连接参数结构体
typedef struct {
uint16_t conn_interval; // 单位:1.25ms
uint16_t slave_latency; // 单位:次数
uint16_t supervision_timeout; // 单位:10ms
} ble_conn_params_t;
// 实际配置
ble_conn_params_t params = {
.conn_interval = 24, // 24 × 1.25ms = 30ms
.slave_latency = 4, // 最多跳过 4 次
.supervision_timeout = 300 // 300 × 10ms = 3000ms
};
// 检查约束
// 实际间隔 = 30ms × (4 + 1) = 150ms
// 超时要求 > 150ms × 2 = 300ms ✅
// 实际超时 3000ms,满足条件
这个配置用在智能手表上,心率数据每 1 秒上报一次,电池续航 7 天。嗯,效果还不错。
小技巧:调试时可以用手机端的 nRF Connect 或 LightBlue 查看当前连接参数。如果发现参数没生效,多半是手机端拒绝了你的请求。这时候可以试试先发一个「保守」的参数,再逐步优化。
2.6 常见误区总结
最后,我总结几个新手容易犯的错:
- 误区一:以为 Slave Latency 越小越好。其实它主要用来省电,设 0 反而浪费。
- 误区二:Supervision Timeout 设得太小,导致频繁断连。我曾经吃过这个亏。
- 误区三:三个参数各自为政,不考虑联动关系。结果协议栈直接报错。
- 误区四:忽略手机端的兼容性。有些手机对短间隔支持不好,会主动断开。
重要提醒:参数配置不是「一次搞定」的事。不同手机、不同蓝牙芯片版本,行为都不一样。我建议你在开发阶段至少测试 5 款主流手机,确保参数兼容。