高吞吐传输
BLE GAP PHY/Data Length、GATT Notify
前置阅读:Hello Notify、连接参数调优
学习目标
- 理解影响 BLE 吞吐量的关键因素:PHY 速率、Connection Interval、Data Length、MTU
- 掌握 2M PHY + 251 字节 Data Length 的高吞吐配置
- 理解 BLE 与 SLE 在高吞吐场景下的差距
- 能够配置并验证 BLE 的最大有效吞吐量
基本概念
BLE 吞吐量的四个决定因素
| 因素 |
最大值 |
影响 |
| PHY |
2M |
物理层速率上限 |
| Connection Interval |
7.5ms(最短) |
调度频率,间隔越短时隙越多 |
| Data Length(DLE) |
251 字节 |
单包有效载荷 |
| MTU |
517 字节 |
GATT 层单次传输上限 |
BLE vs SLE 高吞吐对比
| 对比项 |
BLE |
SLE |
| PHY 上限 |
2Mbps |
4Mbps |
| 有效吞吐 |
~800Kbps |
~3Mbps |
| 单包载荷 |
251B |
更大 |
| 适用场景 |
中小数据、手机兼容 |
大数据、SLE 专有 |
Data Length Extension(DLE)
BLE 4.2+ 支持 DLE,单包从 27 字节扩展到 251 字节——协议开销占比大幅降低。
涉及 API
| API |
谁调用 |
用途 |
gap_ble_set_phy() |
双方 |
切换到 2M PHY |
gap_ble_set_data_length() |
双方 |
设置单包最大数据长度 |
gap_ble_connect_param_update() |
Peripheral |
请求缩短连接间隔 |
gatts_notify_indicate() |
Peripheral |
高速发送数据包 |
gattc_exchange_mtu_req() |
Central |
请求更大的 MTU |
案例说明
做什么
Peripheral 使用 2M PHY + 7.5ms 连接间隔 + 251 字节 DLE + 517 字节 MTU,向 Central 高速发送数据。
| 模式 |
PHY |
Interval |
Data Length |
吞吐 |
| 普通 |
1M |
30ms |
27B |
~50Kbps |
| 高吞吐 |
2M |
7.5ms |
251B |
~800Kbps |
关键配置
| 参数 |
推荐值 |
说明 |
| PHY |
2M |
必需,1M 吞吐砍半 |
| Connection Interval |
7.5ms |
最短合法值 |
| Data Length |
251B |
DLE 最大值 |
| MTU |
517B |
GATT 最大值 |
代码详解
/* 高吞吐配置三步曲 */
gap_ble_set_phy(conn_id, GAP_BLE_PHY_2M);
gap_ble_set_data_length(conn_id, 251, 500); // tx=251, rx_time=500μs
gap_ble_connect_param_update(conn_id, 6, 6, 0, 500); // 6×1.25ms=7.5ms
/* 高速发送循环 */
while (sending) {
int ret = gatts_notify_indicate(conn_id, attr_handle,
data_len, data, false);
if (ret == ERRCODE_BUSY) {
osal_task_yield(); // 流控满了,让出 CPU 等待
}
}
/* Central 端吞吐统计:500 包窗口,total_bytes / elapsed_ms */