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 的三次握手。
- 发起连接(Initiating):主机(Master)发送 CONNECT_IND PDU,包含连接参数。
- 连接请求(Connection Request):从机(Slave)收到后回复,双方进入连接状态。
- 连接完成(Connection Complete):双方交换 LL_CONNECTION_PARAM_REQ,确认参数生效。
这里有个坑:发起连接时,主机的扫描参数和连接参数必须匹配。我见过有人把扫描窗口设得比连接间隔还大,结果连接一直失败。
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 连接建立与参数配置的核心内容。记住,参数配置没有绝对的最佳值,得根据实际应用场景来调。多动手,多抓包分析,慢慢就有感觉了。