广播与扫描

[English]

广播的功能

广播是 BLE 设备发现和连接的基础。广播数据包由广播者(Peripheral)发送,主设备(Central)通过扫描广播数据包来发现 BLE 设备并可以与之建立连接。

BLE 广播功能

功能

描述

被扫描/连接发现

Peripheral(从设备)通过广播让 Central(主设备)发现并连接

无需连接直接传递数据

广播包中可以携带少量数据,适合发通知、位置信息、传感器数据等

发信号触发行为

如 iBeacon、Eddystone 用于定位、唤醒应用等场景

设备身份识别

广播中包含设备名、UUID、制造商信息等,便于识别设备类型

在阅读本节内容之前,建议先阅读 BLE 设备发现 章节,了解 BLE 4.2 广播的相关介绍。

广播常见数据类型及其名称

在 BLE 广播包中,每段数据都由 Length + Type + Value 组成,Type(类型)字段是根据 Bluetooth SIG 规范定义的。以下是广播包中常见的数据类型。

BLE 广播数据类型

Type (Hex)

名称(英文)

中文说明

常见用途/备注

0x01

Flags

标志位,说明设备能力

标明是否支持 BR/EDR、是否在广播模式等,必须项

0x02

Incomplete List of 16-bit UUIDs

不完整 16 位服务 UUID 列表

广播设备提供的一部分 GATT 服务

0x03

Complete List of 16-bit UUIDs

完整 16 位服务 UUID 列表

告知所有服务,常用于通用 BLE 外设

0x06

Incomplete List of 128-bit UUIDs

不完整 128 位服务 UUID 列表

自定义服务的 UUID(128 位)的一部分

0x07

Complete List of 128-bit UUIDs

完整 128 位服务 UUID 列表

自定义服务完整广播

0x08

Shortened Local Name

缩短的设备名称

节省空间,优先显示短名

0x09

Complete Local Name

完整的设备名称

广播设备名,手机扫描会看到

0x0A

Tx Power Level

发射功率级别(dBm)

用于估算距离,配合 RSSI

0x16

Service Data - 16-bit UUID

附带 16 位 UUID 的服务数据

广播一些与服务相关的数据(如温度、电量)

0xFF

Manufacturer Specific Data

厂商自定义数据段

广泛用于 iBeacon、Eddystone、自定义协议

更多的广播数据类型请参考 Assigned Numbers

BLE 5.0 引入的广播新特性

在 BLE 5.0 引入了扩展广播(Extended Advertising)和周期性广播(Periodic Advertising)这些新机制,用于突破传统广播的一些限制。BLE 4.2 及以前版本的广播被称之为传统广播(Legacy Advertising),拓展广播相比 BLE 4.x 在广播方面带来了非常显著的改进和增强,主要目标是为了支持更远距离、更大数据量、更灵活的低功耗应用。下面是两种广播对比:

BLE 4.x vs BLE 5.0 广播特性对比

特性/区别

BLE 4.x

BLE 5.0

广播数据容量

最多 31 字节

最多 255 字节(扩展广播)

广播信道数量

固定 3 个(37,38,39)

支持更多信道(扩展广播可用所有 40 个)

广播距离支持

通常 50 米左右

最远可达 200 米(使用 Coded PHY)

广播速率

标准 1 Mbps

支持 2 Mbps 高速广播

广播方式

Legacy Advertising(传统广播)

增加 Extended Advertising(扩展广播)
支持 Periodic Advertising(周期广播)

广播连接能力

广播中只能承载连接请求信息

广播数据和连接请求可以分离,更灵活

多 PHY 支持(物理层)

仅 1 Mbps

新增 2 Mbps 和 Coded PHY(500/125 kbps)

广播功耗 vs 距离/速率

受限

更远、更快、更省电(根据配置选择)

BLE 5.0 广播(拓展广播)带来最大的优势是广播数据容量的提升,然而部分主流手机对 BLE 5.0 广播支持并不完善,在实际使用中可能会遇到连接失败、无法搜索到广播、广播数据无法解析等问题。如果考虑最优兼容性,建议使用传统广播。

已知存在的拓展广播包兼容性问题包括:

  • IOS 18.5 的设备可能无法扫描到 1M PHY 的拓展广播包

  • 部分安卓设备可能无法扫描到非 1M PHY 的拓展广播包

广播 API 使用说明

在 NimBLE 协议栈中提供了 BLE 4.x 和 BLE 5.0 两套广播 API,两套 API 分别有对应的配置项,无法同时使用。例如 bleprph_example 示例默认使用 BLE 5.0 广播 API,如果需要使用 BLE 4.x 广播 API,除了需要关闭例程配置项 EXAMPLE_EXTENDED_ADV 使主程序调用 4.x 广播 API 外,还需要关闭广播配置项 BT_NIMBLE_EXT_ADV

在 BLE 5.0 推出之后,传统广播视为 BLE 5.0 广播的子集,使用 BLE 5.0 广播 API 也可以发送传统广播。具体的实现代码参考 ble_multi_adv_example 示例。

广播参数的说明

关于广播连接参数的配置,可以参考 ble_gap_ext_adv_params 结构体。

需要着重注意的配置项有以下几个:

  • itvl_min:单位为 1.25 ms,取值范围为 0x0006 到 0x0C80

  • itvl_max:单位为 1.25 ms,取值范围为 0x0006 到 0x0C80

  • channel_map:指定广播使用的信道,0x00 表示默认的三个信道,0x01、0x02、0x04 分别表示使用 37、38、39 信道,0x07 表示 37、38、39 全部三个信道

  • own_addr_type:0x00、0x01、0x02、0x03 分别表示广播地址类型为公共地址、随机地址、可解析公共地址和可解析随机地址

此外在配置广播类型时需要额外注意:非定向可连接广播必须是可扫描的。

扫描

扫描是发现和连接 BLE 设备的基础。主设备(Central)通过扫描广播数据包来发现 BLE 设备并可以与之建立连接。

关于扫描相关的理论知识,请参考 扫描的基本概念 章节。

扫描 API 使用说明

和广播类似,在 NimBLE 协议栈中,提供了两套 API 来开启扫描,分别是 ble_gap_discble_gap_ext_disc

  • 使用 ble_gap_disc API 开启扫描,扫描相关的配置项由结构体 ble_gap_disc_params 配置。使用方式可参考例程 blecentble_multi_adv

  • 使用 ble_gap_ext_disc API 开启扫描,扫描相关的配置项由结构体 ble_gap_ext_disc_params 配置。使用方式可参考例程 ble_multi_conn

备注

避免在扫描回调中打印过多的数据,否则在周围设备较多时可能因打印不及时触发任务看门狗。

广播包过滤

配置 disc_params.filter_duplicates = 1 开启广播包过滤。然而广播包过滤的具体方式由配置项 BT_CTRL_SCAN_DUPL_TYPE 决定:

  • Scan Duplicate By Device Address(默认):过滤来自同一设备地址的广播包

  • Scan Duplicate By Advertising Data:过滤内容相同的广播包

  • Scan Duplicate By Advertising Set Handle:过滤来自于同一设备相同内容的广播包

扫描响应包和广播包接收个数不一致

协议规定了设备不应该对连续的每一个广告包都发送扫描请求,避免产生过多响应。如果确需此功能,ESP32-C3 及之前推出的芯片通过使能配置项 BT_CTRL_SCAN_BACKOFF_UPPERLIMITMAX ,ESP32-C2 及之后的芯片可通过将配置项 BT_CTRL_SCAN_BACKOFF_UPPERLIMITMAX 设置为 1 来强制发起扫描请求。