3、广播类型详解:可连接非定向广播、可连接定向广播、不可连接非定向广播、可扫描非定向广播
好,咱们进入广播类型的正题。BLE 的广播,说白了就四种类型。很多初学者容易搞混,觉得不就是发个包嘛,分这么细干嘛?
其实不然。我当年刚做蓝牙项目时,就因为选错了广播类型,导致设备死活连不上。后来翻协议栈源码才找到原因。嗯,今天咱们就把这四种类型彻底讲透。
3.1 四种广播类型概览
先看一张总表,心里有个谱:
| 广播类型 | 可连接 | 可扫描 | 定向 | 典型场景 |
|---|---|---|---|---|
| 可连接非定向广播 | ✅ | ✅ | ❌ | 手机连接手环、耳机 |
| 可连接定向广播 | ✅ | ❌ | ✅ | 快速重连已知设备 |
| 不可连接非定向广播 | ❌ | ❌ | ❌ | 信标、温度传感器广播 |
| 可扫描非定向广播 | ❌ | ✅ | ❌ | 需要扫描响应的广播 |
你看,核心区别就三个维度:能不能连、能不能扫、是不是定向。咱们一个一个拆。
3.2 可连接非定向广播(Connectable Undirected Advertising)
这是最常用的广播类型。我估计你平时接触的蓝牙设备,90% 都是这个类型。
特点:
- 任何扫描设备都能收到广播
- 收到广播后,可以发起连接请求
- 广播包中不指定目标设备地址
应用场景:
- 手机搜索蓝牙耳机、手环
- 智能门锁广播自身存在
- 传感器节点等待网关连接
核心要点: 这种广播的 ADV_IND 包,PDU 类型是 0x00。广播间隔通常 20ms 到 10.24s 可配。
我在项目中遇到过一个问题:客户说设备广播了,手机就是搜不到。后来发现是广播间隔设得太短,导致射频冲突。你想想看,如果两个广播间隔都是 20ms,碰撞概率就很高。我建议广播间隔至少设 100ms 以上,除非你对实时性有变态要求。
3.3 可连接定向广播(Connectable Directed Advertising)
这个类型有点特殊。它只发给一个特定的设备。
特点:
- 广播包中包含目标设备的地址
- 只有目标设备能处理这个广播
- 其他设备收到后直接丢弃
- 广播间隔固定为 3.75ms(高速模式)
应用场景:
- 已知设备快速重连(比如手机靠近手环时)
- 低延迟连接场景
- 配对后的快速回连
注意: 定向广播的 PDU 类型是 ADV_DIRECT_IND(0x01)。它有两种模式:高速模式(3.75ms 间隔,持续 1.28s)和低速模式(间隔可配)。高速模式功耗很高,别一直开着。
我曾经踩过一个坑:做一款蓝牙遥控器,为了追求快速回连,一直用定向广播。结果电池两天就耗光了。后来改成先发几个定向广播,没回应就切回非定向广播。功耗降了 80%。
3.4 不可连接非定向广播(Non-connectable Undirected Advertising)
这种广播,说白了就是「我只发,不接」。你收到我的广播就行,别想连我。
特点:
- 广播设备不接收任何连接请求
- 扫描设备也不能发送扫描请求
- 纯粹的单向广播
- 功耗最低
应用场景:
- iBeacon、Eddystone 等信标
- 温度、湿度传感器单向上报
- 位置 beacon 广播
小技巧: 这种广播的 PDU 类型是 ADV_NONCONN_IND(0x02)。因为不需要监听连接请求,发射器可以更早进入休眠。我建议做电池供电的信标时,优先选这个类型。
我记得有个客户做冷链物流的温度标签,要求电池撑一年。用不可连接广播,广播间隔设到 1 秒,发射功率调到 0dBm,最后实测续航 14 个月。嗯,选对类型很重要。
3.5 可扫描非定向广播(Scannable Undirected Advertising)
这个类型有点中间态。它允许扫描设备发扫描请求,但不允许连接。
特点:
- 扫描设备可以发送 SCAN_REQ
- 广播设备会回复 SCAN_RSP(扫描响应)
- 但不接受连接请求
- 可以携带更多数据(广播包 + 扫描响应包)
应用场景:
- 需要广播更多数据,但不需要连接
- 设备信息展示(比如广播设备名称、服务 UUID)
- 某些私有协议的数据交互
关键区别: 可扫描广播的 PDU 类型是 ADV_SCAN_IND(0x03)。它和不可连接广播的区别就在于:能不能响应扫描请求。如果你需要扫描响应来携带额外数据,就用这个类型。
你可能会问:那为什么不直接用可连接广播?因为可连接广播要监听连接请求,功耗更高。可扫描广播只监听扫描请求,功耗介于中间。我一般这样选:
- 需要连接 → 可连接非定向
- 需要快速重连 → 可连接定向
- 只需要广播数据,不需要连接 → 不可连接非定向
- 需要广播数据 + 扫描响应,不需要连接 → 可扫描非定向
3.6 四种类型的对比总结
最后,我习惯用一张表来对比它们的协议行为:
| 行为 | 可连接非定向 | 可连接定向 | 不可连接非定向 | 可扫描非定向 |
|---|---|---|---|---|
| PDU 类型 | ADV_IND | ADV_DIRECT_IND | ADV_NONCONN_IND | ADV_SCAN_IND |
| 是否接受连接 | 是 | 是 | 否 | 否 |
| 是否接受扫描 | 是 | 否 | 否 | 是 |
| 是否定向 | 否 | 是 | 否 | 否 |
| 典型功耗 | 中 | 高 | 低 | 中低 |
| 数据容量 | 31 字节 | 31 字节 | 31 字节 | 62 字节(含扫描响应) |
避坑指南: 我曾经在做一个多设备组网项目时,把扫描响应和广播包的数据搞混了。记住:广播包是主动发的,扫描响应是被动回复的。如果你需要 62 字节数据,必须用可扫描广播,并且扫描设备要主动发 SCAN_REQ。
好了,四种广播类型就讲到这里。下一章咱们聊聊广播信道的选择和跳频机制。那个也很有意思,你会发现为什么 BLE 选 37、38、39 这三个信道——其实背后有射频层面的考量。