4、BLE广播与扫描:广播类型、广播数据格式、扫描参数、主动扫描与被动扫描
BLE(Bluetooth Low Energy)协议栈中,广播与扫描是连接建立前的核心机制,也是低功耗设计的关键环节。广播者(Advertiser)周期性发送广播报文,扫描者(Scanner)监听这些报文以发现设备或获取服务信息。理解广播类型、数据格式、扫描参数以及主动/被动扫描的区别,是进行BLE应用开发、功耗调优和协议分析的基础。本章将系统拆解广播与扫描的完整链路,并结合实际工程场景给出参数配置建议与排障思路。
上图展示了BLE广播与扫描的总体架构。广播者在三个专用广播信道(37/38/39)上交替发送广播报文,扫描者则在这些信道上进行监听。广播数据由多个AD Structure组成,每个结构包含长度、类型和数据三部分。扫描者可以选择被动监听(仅接收广播)或主动扫描(发送扫描请求以获取额外数据)。下面我们将逐一深入每个环节。
4.1 广播类型与广播模式
BLE协议定义了四种广播类型,分别对应不同的连接需求和拓扑场景。广播类型决定了广播报文是否可被扫描、是否可被连接,以及是否支持定向广播。
| 广播类型 | 可扫描 | 可连接 | 典型应用场景 |
|---|---|---|---|
| 可连接非定向广播 (Connectable Undirected) | 是 | 是 | 标准外设(如心率计、温度传感器)等待主机连接 |
| 可连接定向广播 (Connectable Directed) | 否 | 是 | 快速重连,仅向指定设备发起(如配对后的回连) |
| 不可连接非定向广播 (Non-connectable Undirected) | 是 | 否 | 纯广播信标(如iBeacon、Eddystone) |
| 可扫描非定向广播 (Scannable Undirected) | 是 | 否 | 允许扫描者获取扫描响应,但不建立连接 |
在实际工程中,选择广播类型需要权衡功耗、连接建立速度和数据交互需求。例如,一个温湿度传感器需要定期上报数据,但不需要被连接,则选择不可连接非定向广播;而一个智能门锁需要被手机连接控制,则必须使用可连接非定向广播。
4.2 广播数据格式与AD Structure
广播报文的数据部分由若干个AD Structure(Advertising Data Structure)串联组成。每个AD Structure包含三个字段:长度(Length)、类型(AD Type)和数据(Data)。长度字段占1字节,表示AD Type和Data的总字节数(即长度值 = 1 + Data长度)。
// 一个典型的广播数据包(31字节)示例
// 0x02 0x01 0x06 → Flags: LE General Discoverable + BR/EDR Not Supported
// 0x05 0x09 0x48 0x65 0x6C 0x6C 0x6F → Complete Local Name: "Hello"
// 0x03 0x02 0x0F 0x18 → Incomplete Service UUID: 0x180F (Battery Service)
// 0xFF 0x00 0x01 0x02 → Manufacturer Specific Data
常见的AD Type包括:Flags(0x01)、Incomplete/Complete Service UUID(0x02/0x03)、Local Name(0x08/0x09)、Tx Power Level(0x0A)、Manufacturer Specific(0xFF)等。广播数据总长度限制为31字节(传统广播)或扩展广播(251字节,BLE 5.0+)。
4.3 扫描参数与扫描行为
扫描参数直接影响发现速度、功耗和响应延迟。关键参数包括扫描间隔(scan_interval)、扫描窗口(scan_window)和扫描类型(主动/被动)。
- 扫描间隔(scan_interval):两次扫描启动之间的时间间隔,范围10ms~10.24s。
- 扫描窗口(scan_window):单次扫描持续监听的时间,范围10ms~10.24s,且必须 ≤ 扫描间隔。
- 扫描类型:被动扫描(0x00)仅监听广播;主动扫描(0x01)在收到广播后发送SCAN_REQ以获取扫描响应。
扫描占空比 = 扫描窗口 / 扫描间隔。占空比越高,发现设备越快,但功耗也越高。例如,扫描间隔100ms、窗口50ms,占空比为50%,适合需要快速发现的场景;而扫描间隔1s、窗口50ms,占空比5%,适合低功耗后台扫描。
4.4 主动扫描与被动扫描的对比与选择
被动扫描只接收广播报文,不发送任何数据;主动扫描则在收到广播后,向广播者发送SCAN_REQ,广播者收到后回复SCAN_RSP。主动扫描能获取更多数据(如设备名称、服务UUID等),但会增加空中信道占用和设备功耗。
| 对比维度 | 被动扫描 | 主动扫描 |
|---|---|---|
| 数据获取量 | 仅广播报文(31字节) | 广播报文 + 扫描响应(最多62字节) |
| 功耗 | 较低(仅接收) | 较高(需发送SCAN_REQ) |
| 信道占用 | 低 | 高(额外SCAN_REQ/RSP交互) |
| 适用场景 | 信标检测、存在性感知 | 设备发现、信息采集、连接前评估 |
在实际开发中,若仅需判断设备是否存在(如室内定位信标),使用被动扫描即可;若需要获取设备名称或服务信息(如APP连接前显示设备列表),则必须使用主动扫描。
4.5 实战案例:低功耗信标扫描与参数调优
假设我们需要开发一个室内定位系统,部署了100个BLE信标(iBeacon),要求手机APP在1秒内发现至少90%的信标,同时尽量降低手机功耗。
初始参数:信标广播间隔100ms,广播数据为iBeacon格式(包含UUID、Major、Minor)。手机扫描间隔200ms,扫描窗口100ms(占空比50%)。
测试结果:发现率约85%,平均发现延迟约400ms,功耗较高(连续扫描1小时耗电12%)。
分析过程:扫描窗口100ms恰好覆盖一个广播间隔,但广播信道有3个(37/38/39),广播者会轮换信道发送,扫描者也需要在3个信道上轮流监听。实际每个信道上的监听时间约为100ms/3≈33ms,而广播者在每个信道上的发送间隔为300ms(100ms×3),因此存在漏检概率。
优化方案:将扫描间隔调整为150ms,扫描窗口调整为120ms(占空比80%),同时开启主动扫描以获取完整iBeacon数据。调整后,发现率提升至95%,平均发现延迟降至250ms,功耗略有增加(耗电14%),但满足需求。
复盘经验:扫描参数需要根据广播间隔和信道数量进行数学估算,不能盲目设置。若功耗敏感,可考虑使用“扫描-休眠”交替模式,或利用BLE 5.0的扩展广播和周期性广播特性。
4.6 常见误区与总结
- 误区1:广播间隔越小越好。实际上,广播间隔过小会显著增加功耗,且可能造成信道拥塞。建议根据应用需求选择100ms~1s。
- 误区2:扫描窗口越大越好。扫描窗口增大确实提高发现率,但功耗线性上升。应结合扫描间隔计算占空比,控制在合理范围。
- 误区3:所有设备都使用主动扫描。对于纯信标场景,被动扫描足够且更省电。
- 误区4:忽略广播信道的影响。广播者在37/38/39三个信道轮发,扫描者必须在这三个信道上都监听,否则会漏检。