1. BLE 广播基础:广播物理信道、广播 PDU 类型、广播事件与间隔
各位同学,咱们今天聊聊 BLE 广播。说实话,广播是整个 BLE 协议栈里最基础、也最容易出问题的一环。我当年刚接触蓝牙时,就被广播间隔和信道的关系绕晕过。后来踩了几个坑,才真正搞明白。
广播,说白了就是设备在特定信道上,周期性地往外喊话。它不关心有没有人听,只管发。这种“单向喊话”的模式,是 BLE 设备被发现、建立连接的第一步。
1.1 广播物理信道
BLE 在 2.4GHz ISM 频段工作,一共划分了 40 个射频信道,编号 0 到 39。但广播只用其中 3 个:信道 37、38、39。
你可能会问:为什么是这三个?
嗯,这是有意为之的。这 3 个信道分别分布在 2.4GHz 频段的低、中、高三个位置,彼此间隔足够大。这样设计,是为了避开 Wi-Fi 常用的信道 1、6、11 的干扰。我在项目中遇到过,如果设备放在 Wi-Fi 路由器旁边,广播丢包率会明显上升。这时候,这三个信道的跳频机制就起作用了。
核心要点: BLE 广播信道只有 3 个(37/38/39),数据信道有 37 个(0-36)。广播信道专门用于设备发现和连接建立,数据信道用于后续数据传输。
每个广播信道带宽 2MHz,与数据信道相同。但广播信道的发射功率通常更高,以确保覆盖范围。
| 信道编号 | 中心频率 (MHz) | 用途 | 备注 |
|---|---|---|---|
| 37 | 2402 | 广播 / 扫描响应 | 频段最低端 |
| 38 | 2426 | 广播 / 扫描响应 | 频段中间 |
| 39 | 2480 | 广播 / 扫描响应 | 频段最高端 |
个人经验: 我建议你在做产品测试时,专门在这三个信道上抓一下空口包。很多广播问题,比如信道 38 被 Wi-Fi 干扰导致扫描不到设备,只有抓包才能发现。
1.2 广播 PDU 类型
广播包的结构,核心是 PDU(Protocol Data Unit)。PDU 类型决定了这个广播包是干什么的。
BLE 4.0/4.1 定义了 4 种广播 PDU 类型,到了 4.2 又增加了 2 种。咱们先看最常用的几种:
- ADV_IND:可连接的非定向广播。最常用,任何扫描设备都能收到,并且可以发起连接。
- ADV_DIRECT_IND:定向广播。只针对特定设备,连接建立更快,但功耗更高。
- ADV_NONCONN_IND:不可连接的非定向广播。只发不收,适合 Beacon 类应用。
- ADV_SCAN_IND:可扫描的非定向广播。允许扫描设备发送扫描请求,但不可连接。
我刚开始做 Beacon 项目时,就犯过一个低级错误:把广播类型设成了 ADV_IND,结果手机扫描到设备后总想连上去,导致 Beacon 数据一直发不出去。后来改成 ADV_NONCONN_IND,问题就解决了。
避坑指南: 我曾经在量产固件里发现,广播类型设置错误会导致设备无法被扫描到。检查一下你的广播 PDU 类型,特别是 ADV_DIRECT_IND 的白名单配置,很容易漏掉。
每种 PDU 类型都有固定的格式。以 ADV_IND 为例,它的 PDU 结构如下:
PDU 结构:
+----------------+----------------+----------------+
| PDU Type (4b) | ChSel (1b) | TxAdd (1b) |
| RxAdd (1b) | Length (8b) | RFU (1b) |
+----------------+----------------+----------------+
| 广播地址 (6 字节) | 广播数据 (0-31 字节) |
+--------------------------------+-------------------+
注意,广播数据最大 31 字节。这是 BLE 4.x 的限制,到了 BLE 5.0 才扩展到 255 字节。如果你需要发更多数据,就得考虑用扩展广播。
1.3 广播事件与间隔
广播不是一直发,而是按“事件”来组织的。一个广播事件,就是在三个广播信道上依次发送一次广播包。
广播间隔,就是两个相邻广播事件开始之间的时间。这个值很关键,直接影响功耗和被发现的速度。
标准广播间隔范围是 20ms 到 10.24s,步进 0.625ms。但实际应用中,常用值在 100ms 到 1s 之间。
| 广播间隔 | 典型场景 | 功耗 | 被发现延迟 |
|---|---|---|---|
| 20-50ms | 高实时性连接(如鼠标) | 高 | < 50ms |
| 100-200ms | 普通外设(如键盘) | 中 | 100-200ms |
| 500ms-1s | Beacon、传感器 | 低 | 0.5-1s |
| > 1s | 低功耗标签 | 极低 | 数秒 |
每个广播事件内,设备会在三个信道上依次发送。但为了减少碰撞,每个信道发送后会加入一个随机延迟,范围 0-10ms。这就是所谓的“广播信道跳频”。
我建议: 如果你做的是电池供电的设备,广播间隔别设太短。我曾经有个项目,广播间隔设成 30ms,结果电池撑不到一天。后来改成 500ms,续航直接到两周。功耗和实时性,你得权衡。
广播事件还有一个重要参数:广播数据更新频率。你可以在每个广播事件中更新数据,但通常不需要。我习惯在广播数据变化时才更新,比如温度传感器每 5 秒更新一次广播数据,但广播间隔还是 500ms。
1.4 广播流程示意图
下面这张图,展示了广播事件在三个信道上的执行流程。你可以看到,每个信道发送后,设备会短暂等待,然后切换到下一个信道。
你看,一个广播事件就是一次“信道 37 → 延迟 → 信道 38 → 延迟 → 信道 39”的完整流程。然后等待一个广播间隔,再开始下一个事件。
这里有个细节:扫描设备通常只在三个信道上轮流监听,每个信道停留一段时间。如果广播间隔和扫描窗口不匹配,就可能漏掉广播包。我建议你在调试时,用抓包工具确认广播事件是否被扫描端正确接收。
1.5 小结
广播基础就这些。记住三个核心点:
- 广播只用 3 个信道(37/38/39),目的是抗干扰
- 广播 PDU 类型决定设备的行为(可连接、可扫描、不可连接)
- 广播间隔直接影响功耗和被发现速度,需要根据场景权衡