广播与扫描
广播的功能
广播是 BLE 设备发现和连接的基础。广播数据包由广播者(Peripheral)发送,主设备(Central)通过扫描广播数据包来发现 BLE 设备并可以与之建立连接。
功能 |
描述 |
---|---|
被扫描/连接发现 |
Peripheral(从设备)通过广播让 Central(主设备)发现并连接 |
无需连接直接传递数据 |
广播包中可以携带少量数据,适合发通知、位置信息、传感器数据等 |
发信号触发行为 |
如 iBeacon、Eddystone 用于定位、唤醒应用等场景 |
设备身份识别 |
广播中包含设备名、UUID、制造商信息等,便于识别设备类型 |
在阅读本节内容之前,建议先阅读 BLE 设备发现 章节,了解 BLE 4.2 广播的相关介绍。
广播常见数据类型及其名称
在 BLE 广播包中,每段数据都由 Length + Type + Value 组成,Type(类型)字段是根据 Bluetooth SIG 规范定义的。以下是广播包中常见的数据类型。
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 |
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 到 0x0C80itvl_max
:单位为 1.25 ms,取值范围为 0x0006 到 0x0C80channel_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_disc
和 ble_gap_ext_disc
。
使用
ble_gap_disc
API 开启扫描,扫描相关的配置项由结构体ble_gap_disc_params
配置。使用方式可参考例程 blecent 和 ble_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 来强制发起扫描请求。