3、BLE连接建立:连接参数与流程的艺术

好,咱们今天聊聊BLE连接建立这件事。说实话,很多开发者觉得连接就是两个设备配对成功就完事了。但在我眼里,连接参数的配置才是真正的技术活。你想想看,一个蓝牙设备能不能省电、响应快不快,很大程度上取决于连接参数设得好不好。

3.1 连接参数:三个关键数字

连接参数主要有三个:连接间隔从机延迟超时时间。这三个参数就像三根绳子,绑着功耗和性能两头。

3.1.1 连接间隔(Connection Interval)

连接间隔,说白了就是两个设备之间多久“打招呼”一次。单位是1.25ms,范围从7.5ms到4s。

我举个例子:

  • 连接间隔设成7.5ms,相当于每7.5毫秒就通信一次。延迟低,但功耗高。
  • 连接间隔设成100ms,功耗低很多,但响应就慢了。

我在项目中遇到过一个问题:一个心率监测设备,连接间隔设成了50ms,结果电池撑不过一天。后来改成200ms,电池直接用了两周。但代价是数据更新慢了。这就是典型的功耗和性能的博弈。

核心原则:连接间隔越小,功耗越高,延迟越低。反之亦然。

3.1.2 从机延迟(Slave Latency)

这个参数很多人容易忽略。从机延迟允许从设备跳过一些连接事件,说白了就是“偷懒”。

假设连接间隔是100ms,从机延迟设成4。那么从设备最多可以连续跳过4个连接事件,也就是400ms才响应一次。

嗯,这里要注意:

  • 从机延迟越大,从设备越省电
  • 但主设备得一直等着,不能偷懒
  • 从机延迟不能超过超时时间

我曾经调试过一个智能门锁项目,门锁作为从设备,从机延迟设成了9。结果用户按门铃后,门锁要等将近1秒才响应。用户投诉说“门锁反应太慢”。后来我把从机延迟降到3,响应时间控制在300ms以内,问题解决了。

我的建议:从机延迟一般设成0-4比较合理。除非你的设备对功耗要求极高,否则别设太大。

3.1.3 超时时间(Supervision Timeout)

超时时间是个安全网。如果主设备和从设备在超时时间内没有通信,连接就会断开。

公式很简单:

超时时间 > (连接间隔 × (1 + 从机延迟))

为什么?因为从设备可能正在“偷懒”,主设备得给它留够时间。

我见过一个坑:有人把超时时间设成2秒,连接间隔100ms,从机延迟19。算一下:100ms × (1 + 19) = 2000ms = 2秒。刚好等于超时时间。结果设备稍微有点干扰就断连。为什么?因为从设备刚好在超时边界上,稍微延迟一点就超时了。

避坑指南:我曾经因为超时时间设得太紧,导致设备在信号弱的地方频繁断连。建议超时时间至少比理论值大20%。

3.2 连接建立流程:三步走

连接建立其实就三步:广播、扫描、发起连接。听起来简单,但每一步都有讲究。

3.2.1 广播阶段

从设备(比如传感器)先广播。广播包里有设备信息、服务UUID等。广播间隔一般设成20ms到10.24s。

广播间隔越小,被发现得越快,但功耗越高。我一般建议:

  • 需要快速连接的设备:广播间隔100-200ms
  • 不着急连接的设备:广播间隔1-2s

3.2.2 扫描阶段

主设备(比如手机)在扫描。扫描窗口和扫描间隔是两个关键参数。

扫描窗口:每次扫描持续多久
扫描间隔:两次扫描之间隔多久

举个例子:

扫描窗口 = 30ms
扫描间隔 = 100ms
意味着:每100ms里,有30ms在扫描,70ms在休息

扫描窗口越大,发现设备越快,但功耗也高。我习惯把扫描窗口设成扫描间隔的一半左右。

3.2.3 连接发起

主设备收到广播后,发送连接请求。连接请求里就包含了我们刚才说的三个连接参数。

这里有个细节:连接参数是主设备决定的。从设备只能接受或者拒绝。但聪明的从设备可以在连接建立后,通过L2CAP信令请求更新参数。

关键点:连接参数不是一成不变的。你可以在连接建立后动态调整。比如设备刚连接时用短间隔快速传输数据,传输完成后用长间隔省电。

3.3 实战经验:参数怎么配?

说了这么多理论,来点实际的。我总结了一个参数配置表,供你参考:

应用场景 连接间隔 从机延迟 超时时间 功耗
实时控制(如遥控器) 7.5-15ms 0 2-4s
音频传输 10-20ms 0-1 2-4s 中高
传感器数据采集 50-200ms 2-4 4-6s
低功耗传感器 500ms-1s 4-9 6-10s

这个表是我多年调试经验的总结。但记住,每个项目都不一样,你得根据实际情况微调。

小技巧:调试时先用大间隔、小延迟的参数,确保连接稳定。然后再逐步优化。别一上来就追求极致性能,否则出了问题你都不知道是参数的问题还是硬件的问题。

3.4 避坑指南

最后,分享几个我踩过的坑:

  1. 连接间隔设得太小:有一次我把连接间隔设成7.5ms,结果两个设备靠得太近,射频干扰严重,连接频繁断开。后来改成15ms就好了。
  2. 从机延迟设得太大:前面说的智能门锁就是例子。用户体验很重要,别为了省电牺牲响应速度。
  3. 超时时间设得太紧:在信号不好的环境里,超时时间一定要留余量。我一般设成理论值的1.5倍。
  4. 忘记动态调整参数:很多设备在传输数据和待机时对功耗的要求不同。记得在连接建立后动态调整参数。

好了,连接建立这部分就讲到这里。记住一句话:没有最好的参数,只有最适合的参数。下一章咱们聊聊数据交互和MTU,那又是另一个有意思的话题。