4、BLE广播与扫描:广播类型、广播数据格式、扫描参数、主动扫描与被动扫描

BLE(Bluetooth Low Energy)协议栈中,广播与扫描是连接建立前的核心机制,也是低功耗设计的关键环节。广播者(Advertiser)周期性发送广播报文,扫描者(Scanner)监听这些报文以发现设备或获取服务信息。理解广播类型、数据格式、扫描参数以及主动/被动扫描的区别,是进行BLE应用开发、功耗调优和协议分析的基础。本章将系统拆解广播与扫描的完整链路,并结合实际工程场景给出参数配置建议与排障思路。

广播者 (Advertiser) 广播类型: 可连接/不可连接 广播数据: AD Structure 周期: 20ms ~ 10.24s 扫描者 (Scanner) 主动扫描: 发送扫描请求 被动扫描: 仅监听广播 窗口/间隔: 10ms~10.24s 广播信道: 37/38/39 (2402/2426/2480 MHz) 扫描请求 (SCAN_REQ) / 扫描响应 (SCAN_RSP) 广播数据格式 (AD Structure) Length AD Type Data (0~31 bytes) → 多个AD Structure Flags (0x01) | Local Name (0x09) | Service UUID (0x02/0x03) | Manufacturer (0xFF) 扫描窗口 (scan_window) ≤ 扫描间隔 (scan_interval) | 主动扫描标志 (scan_type)

上图展示了BLE广播与扫描的总体架构。广播者在三个专用广播信道(37/38/39)上交替发送广播报文,扫描者则在这些信道上进行监听。广播数据由多个AD Structure组成,每个结构包含长度、类型和数据三部分。扫描者可以选择被动监听(仅接收广播)或主动扫描(发送扫描请求以获取额外数据)。下面我们将逐一深入每个环节。

4.1 广播类型与广播模式

BLE协议定义了四种广播类型,分别对应不同的连接需求和拓扑场景。广播类型决定了广播报文是否可被扫描、是否可被连接,以及是否支持定向广播。

广播类型可扫描可连接典型应用场景
可连接非定向广播 (Connectable Undirected)是是标准外设(如心率计、温度传感器)等待主机连接
可连接定向广播 (Connectable Directed)否是快速重连,仅向指定设备发起(如配对后的回连)
不可连接非定向广播 (Non-connectable Undirected)是否纯广播信标(如iBeacon、Eddystone)
可扫描非定向广播 (Scannable Undirected)是否允许扫描者获取扫描响应,但不建立连接

在实际工程中,选择广播类型需要权衡功耗、连接建立速度和数据交互需求。例如,一个温湿度传感器需要定期上报数据,但不需要被连接,则选择不可连接非定向广播;而一个智能门锁需要被手机连接控制,则必须使用可连接非定向广播。

经验提醒:定向广播虽然能加速重连,但广播间隔通常较短(如3.75ms),功耗较高。若非必要,建议使用非定向广播并配合白名单(White List)机制实现类似效果。

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+)。

核心原则:广播数据应尽量精简,只包含必要信息。若需要传输较多数据,可考虑使用扫描响应(Scan Response)或扩展广播。扫描响应同样限制为31字节,但通过主动扫描可以额外获取。

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%,适合低功耗后台扫描。

风险提示:扫描窗口设置过短(如小于10ms)可能导致漏检广播报文,尤其是在广播间隔较长时。建议扫描窗口至少覆盖一个广播间隔的1.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三个信道轮发,扫描者必须在这三个信道上都监听,否则会漏检。
总结:BLE广播与扫描是低功耗无线通信的基石。广播类型决定了连接能力,AD Structure承载了应用数据,扫描参数平衡了发现速度与功耗,主动/被动扫描则提供了数据获取的灵活性。在实际工程中,务必根据应用场景、功耗预算和连接需求,系统性地配置这些参数,并通过实测验证效果。