第2章 连接间隔(Connection Interval)详解:原理与配置归纳总结

连接间隔,在BLE里是个核心概念。很多工程师遇到连接不稳定、功耗偏高、甚至数据丢包的问题,归根结底都是它没配置好。我个人觉得,搞懂连接间隔比背一堆API要有用得多。

连接间隔到底是什么?

简单说,连接间隔是两个相邻连接事件之间的时间差。连接事件,就是主设备和从设备之间一次完整的收发交互。

举个例子:你设置连接间隔为30ms,那主机每隔30ms就会来找从机聊一次天。这就是一个连接事件。

为什么要这样设计?BLE是低功耗协议,它不会像经典蓝牙那样一直占用信道。平时从机可以睡觉,只在连接事件到来时醒来收发数据。说白了,这是一种时分复用的省电策略。

连接间隔的单位是1.25ms的整数倍。最小值是7.5ms(也就是6个单元),最大值是4.0s(3200个单元)。具体范围看这张表:

参数 最小值 最大值 步进
连接间隔(实际值) 7.5 ms 4.0 s 1.25 ms
连接间隔(协议单元) 6 3200 1

连接间隔的三重影响

连接间隔不是随便填个数字就完事的。它直接影响三个关键指标:

  • 功耗:间隔越短,设备唤醒越频繁,功耗越高。我记得在做一款智能手环时,把间隔从20ms改到50ms,待机时间直接翻了一倍。
  • 吞吐量:间隔越短,单位时间内能传输的数据包越多。你想想看,如果你要OTA升级,间隔太长会慢得让人抓狂。
  • 延迟:从用户操作到数据到达对端的时间,间隔直接影响这个响应速度。

这三个指标就像不可能三角。你没法同时做到低功耗、高吞吐、低延迟。必须根据应用场景做权衡。

我一般会问自己一个问题:这个设备是天天插着充电器,还是靠纽扣电池活半年?前者我会选短间隔,后者果断拉长。

关键参数详解

配置连接间隔时,你会遇到几个关键参数。很多人只设置了CI(Connection Interval)就完事了,忽略了其他配套参数。

1. 连接间隔最小值(CI Min)与最大值(CI Max)

这两个参数是主机在建立连接时协商用的。从机会建议一个范围,比如CI Min=20ms,CI Max=50ms。主机最终会选择一个落在该范围内的值。

注意:不是所有主机都听你的。我在项目中遇到过,某品牌手机总是选择最小值,结果功耗一下子炸了。应对方法是把CI Min和CI Max设得接近,比如都设为30ms。

2. 从机延迟(Slave Latency)

这个参数允许从机在若干个连接事件中跳过不响应。比如延迟设为3,那从机可以连续跳过3个连接事件不醒,直到第4个才必须回应。

从机延迟是省电神器。假设连接间隔是30ms,延迟是9,那从机可以睡300ms才起来一次。功耗理论降低到原来的1/10。

核心关系:有效连接间隔 = 连接间隔 ×(从机延迟 + 1)

延迟越大,省电效果越明显,但丢包风险也会增加。

3. 监督超时(Supervision Timeout)

如果主机连续一段时间没收到从机的任何回复,就会认为连接已断开。这个时间就是监督超时。

它必须大于 有效连接间隔,否则容易发生误断。协议要求:监督超时 > (1 + 从机延迟) × 连接间隔 × 2。

避坑指南:我犯过一个低级错误。把监督超时设成了300ms,但有效连接间隔因为延迟设得大,偶尔会跑到400ms。结果设备经常莫名其妙掉线。排查了三天才发现是这两个参数没对齐。

配置方法与实践

配置连接间隔有两种方式:

  • 静态配置:在广播阶段通过连接请求直接指定。
  • 动态更新:连接建立后,通过L2CAP的连接参数更新请求(Connection Parameter Update Request)来调整。

我建议你在产品开发阶段把动态更新做进去。因为不同主机的兼容性不一样,用户端的手机、平板、网关,它们的协议栈行为差异很大。预留一个更新通道,方便后期调优。

下面是一段典型的连接参数更新请求代码(基于Zephyr RTOS):

struct bt_le_conn_param param = {
    .interval_min = 24,    // 30ms (24 * 1.25ms)
    .interval_max = 40,    // 50ms (40 * 1.25ms)
    .latency = 5,          // 从机延迟
    .timeout = 400         // 监督超时:500ms
};

err = bt_conn_le_param_update(conn, ¶m);
if (err) {
    printk("参数更新失败,错误码:%d\n", err);
}

注意看,interval_min和interval_max的单位都是1.25ms,不是直接写毫秒数。很多人栽在这个单位换算上,值填错了一个数量级。

连接间隔与异常现象的关联

当连接间隔配置不当时,会出现几种典型异常:

症状 可能原因 排查方向
频繁断连 监督超时 < 有效连接间隔 检查延迟与超时的配比
数据丢包 连接间隔过小,信道拥塞 适当增大间隔,减少碰撞
功耗异常高 连接间隔过短,设备频繁醒来 增大间隔或启用从机延迟
OTA升级极慢 连接间隔过大,吞吐量受限 动态更新为更短间隔

我遇到过最典型的情况是:设备刚连上时没问题,运行半小时后开始频繁断开。用抓包工具一看,原来是某个Android手机在连接稳定后,悄悄把连接间隔翻了一倍,而我的监督超时没跟着变。这就是主从协议栈不匹配导致的。

我的调试习惯:每次改完连接参数,至少跑24小时的稳定性测试。用抓包工具记录连接事件的时间戳,看看实际间隔是否符合预期。

工程建议总结

一句话:连接间隔选小了功耗崩,选大了性能崩。下面是我踩坑多年总结出的几条建议:

  • 电池供电设备:连接间隔不低于30ms,并搭配≥3的从机延迟。
  • 需要高速传输(如OTA):连接间隔设到7.5ms~15ms,但别忘了评估对功耗的影响。
  • 监督超时建议设为有效连接间隔的3~4倍,留够余量。
  • 如果发现丢包,先看连接间隔是否太小导致信道争抢,再去怀疑射频。

嗯,先讲这么多,连接间隔的原理和配置方法算是讲透了。这部分内容我建议你多动手实践,光看是记不住的。

连接间隔知识体系与核心参数关系 连接间隔(Connection Interval) 功耗 吞吐量 延迟 CI Min / CI Max 协商范围 从机延迟 Slave Latency 监督超时 Supervision Timeout 静态配置(连接请求) 连接建立时固定 动态更新(L2CAP) 运行中调整 调试与排查:抓包 + 24小时稳定性测试 + 时间戳校验 主从协议栈兼容性验证 注意:连接间隔单位1.25ms;有效连接间隔 = 连接间隔 × (从机延迟 + 1);监督超时必须大于有效连接间隔的2倍。