连接参数基础:三大核心参数定义与作用

做蓝牙开发这些年,我见过太多工程师一上来就调参数,结果越调越糟。说白了,连接参数就像蓝牙通信的「交通规则」——你不懂规则,车开得再快也得翻。

这一章,咱们就把 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 连接断连保护 联动约束 ① 实际连接事件间隔 = Connection Interval × (Slave Latency + 1) ② Supervision Timeout 必须 > 实际间隔 × 2 ③ Slave Latency 最大值 = (Supervision Timeout / Interval) - 1

从图上你能看到:

  • 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 常见误区总结

最后,我总结几个新手容易犯的错:

  1. 误区一:以为 Slave Latency 越小越好。其实它主要用来省电,设 0 反而浪费。
  2. 误区二:Supervision Timeout 设得太小,导致频繁断连。我曾经吃过这个亏。
  3. 误区三:三个参数各自为政,不考虑联动关系。结果协议栈直接报错。
  4. 误区四:忽略手机端的兼容性。有些手机对短间隔支持不好,会主动断开。

重要提醒:参数配置不是「一次搞定」的事。不同手机、不同蓝牙芯片版本,行为都不一样。我建议你在开发阶段至少测试 5 款主流手机,确保参数兼容。