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 0-10ms 0-10ms 广播间隔 (20ms - 10.24s) 每个广播事件在 3 个信道上依次发送,信道间有随机延迟,避免碰撞

你看,一个广播事件就是一次“信道 37 → 延迟 → 信道 38 → 延迟 → 信道 39”的完整流程。然后等待一个广播间隔,再开始下一个事件。

这里有个细节:扫描设备通常只在三个信道上轮流监听,每个信道停留一段时间。如果广播间隔和扫描窗口不匹配,就可能漏掉广播包。我建议你在调试时,用抓包工具确认广播事件是否被扫描端正确接收。

1.5 小结

广播基础就这些。记住三个核心点:

  • 广播只用 3 个信道(37/38/39),目的是抗干扰
  • 广播 PDU 类型决定设备的行为(可连接、可扫描、不可连接)
  • 广播间隔直接影响功耗和被发现速度,需要根据场景权衡