1. BLE 并发连接基础概念
1.1 连接间隔(Connection Interval)
连接间隔是 BLE 链路层在两个连接事件之间等待的时间,由主设备(Central)在连接请求中设定,从设备(Peripheral)必须遵循。连接间隔以 1.25 ms 为步长,取值范围 7.5 ms ~ 4.0 s。较小的连接间隔缩短响应延迟但增加功耗与信道占用,较大的连接间隔降低功耗但增大数据到达时延。多个并发连接时,各个连接间隔必须合理安排,防止连接事件在时间上重叠导致丢包。
| 参数 | 最小值 | 最大值 | 步长 |
|---|---|---|---|
| 连接间隔 | 6 × 1.25 ms = 7.5 ms | 3200 × 1.25 ms = 4.0 s | 1.25 ms |
| 扫描窗口 | 0 ms(无扫描) | 10.24 s | 0.625 ms |
| 扫描间隔 | 2.5 ms | 10.24 s | 0.625 ms |
1.2 扫描窗口与扫描间隔
扫描窗口(Scan Window)是每个扫描周期内收听广播信道的持续时间,扫描间隔(Scan Interval)是两个扫描起始点之间的时间。窗口必须 ≤ 间隔。并发连接中,主设备在连接事件与扫描事件之间分时切换。若扫描窗口过大,可能挤压连接事件的可用时间片,导致连接超时。
- 主动扫描:发送扫描请求获取附加数据,占用更多 RF 时间。
- 被动扫描:只接收广播包,不发送请求,并发场景下更省时。
典型并发配置推荐扫描窗口 ≤ 间隔的 50%,例如扫描间隔 100 ms 时,窗口 ≤ 50 ms。剩余时间可均匀分配给多个连接事件。
1.3 延时容忍(Latency Tolerance)
BLE 连接提供从设备延迟(Peripheral Latency)参数,允许从设备跳过指定次数的连接事件来省电。延时容忍值范围 0~499,乘上连接间隔即为从设备可忽略的最大连续事件数。主设备必须等待最多“连接间隔 ×(1 + 从设备延迟)”时间才能收到从设备数据。高并发场景下,利用从设备延迟可错开多个从设备的回报时刻,降低主设备的中断频率。
例如:连接间隔 50 ms,从设备延迟 4,则主设备最多等待 250 ms 后可收到数据。设计系统时,应用层延迟容忍应大于等于此值。
1.4 并发数上限(Maximum Concurrent Connections)
BLE 规格未明确定义并发连接上限,实际由主设备硬件资源、协议栈实现和 RF 调度能力共同决定。常见上限如下:
| 平台/协议栈 | 典型并发数 | 限制因素 |
|---|---|---|
| nRF52840 + SoftDevice | 20 | RAM 连接上下文、调度器时间片 |
| ESP32 + NimBLE | 9 | 链路层缓冲区、CPU 中断处理能力 |
| BlueZ + Linux | 7~10 | 内核蓝牙子系统调度、USB/总线延迟 |
| STM32WB + 专用栈 | 8~16 | RF 内核与 M4 核间通信开销 |
1.5 四大参数的依赖关系
下面内联 SVG 展示了连接间隔、扫描窗口、延时容忍与并发数上限之间的调度时序关系,帮助理解并发依赖。
1.6 配置示例:并发连接参数设定
以下蓝色协议栈参数示例展示了 4 个并发连接时的关键配置,实际数值需根据应用延迟要求和功耗预算调整。
/* 连接间隔:30 ms (24 x 1.25 ms) */
#define CONN_INTERVAL_MS 30
/* 从设备延迟:允许跳过 2 次连接事件 */
#define PERIPHERAL_LATENCY 2
/* 扫描窗口:15 ms,扫描间隔:30 ms */
#define SCAN_WINDOW_MS 15
#define SCAN_INTERVAL_MS 30
/* 最大并发连接数(应用层限制) */
#define MAX_CONNECTIONS 4
1.7 调试与验证方法
使用逻辑分析仪或 BLE 协议分析器(如 Ellisys、nRF Sniffer)捕获空中包,观察连接事件是否重叠。检查要点:
- 每个连接事件是否在预期时间窗内开始和结束;
- 扫描窗口是否与连接事件冲突(发生 CRC 错误或连接超时);
- 从设备延迟后的首次连接事件是否被正确调度。
日志输出示例(基于 Zephyr BLE 栈):
D: [BT] conn[0] interval 30 ms latency 2
D: [BT] conn[1] interval 40 ms latency 0
D: [BT] scan window 15 ms scan interval 30 ms
D: [BT] next connection event in 2.1 ms (slot idle)
1.8 常见错误与优化
| 错误场景 | 现象 | 根因 | 优化方向 |
|---|---|---|---|
| 扫描窗口 > 扫描间隔 | 扫描事件无法开始 | 参数越界 | 确保扫描窗口 ≤ 扫描间隔 |
| 连接间隔过小 + 多连接 | 连接事件频繁丢失 | RF 时间片不足 | 增大连接间隔或减少并发数 |
| 从设备延迟过高 | 应用层响应超时 | 延迟容忍设置不当 | 降低延迟或放宽应用层超时 |
| 并发数超硬件限制 | 协议栈内存分配失败 | 系统资源耗尽 | 使用 bt_conn_get_info() 检查可用连接槽 |