3. BLE 连接建立与参数配置

好,咱们今天聊聊 BLE 连接建立这件事。说白了,就是两个蓝牙设备怎么“对上眼”,然后怎么“稳定地聊下去”。很多初学者觉得配对连接很神秘,其实拆开来看,就那么几个关键步骤和参数。

我个人习惯把 BLE 连接比作两个人打电话:你先拨号(发起连接),对方接听(连接请求),然后通话建立(连接完成)。通话过程中,你们可以调整语速和音量(连接参数更新)。嗯,就这么简单。

3.1 连接参数详解

在建立连接之前,得先搞清楚三个核心参数。我在项目中遇到过不少因为参数设置不合理导致的断连问题,所以这块得重点讲。

参数名称 含义 典型范围 我的经验值
Connection Interval 连接间隔,即两个连接事件之间的时间 7.5ms ~ 4s(步进1.25ms) 低功耗场景用 30-50ms,高吞吐用 7.5-15ms
Slave Latency 从设备可以跳过多少个连接事件而不响应 0 ~ 499 传感器上报类设 0-5,低功耗设 10-30
Supervision Timeout 超时时间,超过此时间未收到包则断开连接 100ms ~ 32s 建议设为 Connection Interval × (Latency+1) × 2 以上

关键公式:Supervision Timeout > (1 + Slave Latency) × Connection Interval × 2

我曾经因为没遵守这个公式,导致设备在低功耗模式下频繁断连,排查了两天才发现是超时时间设得太短。

3.2 连接建立流程

连接建立分三步走,每一步都有对应的 HCI 事件。你想想看,这个过程其实很像 TCP 的三次握手。

  1. 发起连接(Initiating):主机(Master)发送 CONNECT_IND PDU,包含连接参数。
  2. 连接请求(Connection Request):从机(Slave)收到后回复,双方进入连接状态。
  3. 连接完成(Connection Complete):双方交换 LL_CONNECTION_PARAM_REQ,确认参数生效。

这里有个坑:发起连接时,主机的扫描参数和连接参数必须匹配。我见过有人把扫描窗口设得比连接间隔还大,结果连接一直失败。

BLE 连接建立流程 主机 (Master) 从机 (Slave) ① 发起连接 CONNECT_IND (含连接参数) ② 连接请求 LL_CONNECTION_PARAM_REQ ③ 连接完成 LL_CONNECTION_PARAM_RSP

3.3 连接参数更新请求与响应

连接建立后,参数不是一成不变的。比如设备刚连上时需要高速传输数据,之后进入低功耗模式,这时候就需要更新连接参数。

更新流程是这样的:

  • 从机发送 LL_CONNECTION_UPDATE_REQ 给主机
  • 主机收到后,如果同意就回复 LL_CONNECTION_UPDATE_RSP
  • 双方在下一个连接事件切换到新参数

注意:参数更新请求不能太频繁。我见过有人每秒发一次更新请求,结果把主机搞崩溃了。建议至少间隔 5 秒以上。

3.4 实战:使用 ESP32 建立 BLE 连接

咱们用 ESP32 来演示一下。这是我在一个智能家居项目里实际用过的代码片段。

// ESP32 BLE 连接参数配置示例
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

BLEAdvertising *pAdvertising;

void setup() {
  Serial.begin(115200);
  BLEDevice::init("ESP32_BLE_Device");

  // 创建服务器
  BLEServer *pServer = BLEDevice::createServer();

  // 配置连接参数
  BLEDevice::setConnectionInterval(30);  // 30ms 连接间隔
  BLEDevice::setSlaveLatency(5);         // 从机延迟 5 个事件
  BLEDevice::setSupervisionTimeout(500); // 超时 500ms

  // 开始广播
  pAdvertising = pServer->getAdvertising();
  pAdvertising->start();

  Serial.println("等待连接...");
}

void loop() {
  // 主循环
  delay(1000);
}

调试技巧:用 nRF Connect App 扫描 ESP32,连接后可以在「Connection Parameters」里看到实际生效的参数。如果发现参数没按你设的来,检查一下主机端是否拒绝了更新请求。

3.5 常见故障定位

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

现象 可能原因 解决方法
连接建立失败 扫描参数与连接参数不匹配 确保扫描窗口 ≥ 连接间隔
连接频繁断开 Supervision Timeout 设置过小 按公式重新计算
参数更新不生效 主机拒绝或更新间隔太短 检查主机日志,延长更新间隔
功耗异常高 连接间隔设置过小 适当增大连接间隔

嗯,以上就是 BLE 连接建立与参数配置的核心内容。记住,参数配置没有绝对的最佳值,得根据实际应用场景来调。多动手,多抓包分析,慢慢就有感觉了。