BLE ADV
BLE ADV
1. 普通广播
包组成结构
低功耗蓝牙一共有40个信道,频段范围从2402Mhz-2480Mhz,每2Mhz一个信道,37 38 39 是广播信道,其余为数据信道
一个广播信道最长37字节,有6字节用作蓝牙设备的MAC地址,我们只需要关注剩余的31个字节就可以了,这31个字节又给分为若干个广播数据体,蓝牙规范中称为AD Structure,每个结构体又分为三部分组成,分别是长度,类型,内容,其中长度占用一个字节,类型一个字节,内容占用若干个字节,长度=类型的字节数+内容占用的字节数=1+N
我们来看一下一个具体的例子,下面是一个广播数据包包含两个AD structure,第一个数据包的长度是4,表示后面四个字节的第一个字节为类型,后面三个字节的为数据;第二个数据的长度为3,表示后面三个字节的第一个字节为类型,后两个字节为数据。如果不够31个字节系统会自动补全
我们再来看一下下面这个例子,包含三个AD structure,三个数据类型分别为设备名称,发射功率,厂商自定义数据,第一个AD structure表示这个数据设备名称为1234,第二个AD structure表示发射功率是8dBm
adv调度
广播数据包的传输发生在每次广播事件发生时。广播事件的调度由时间参数控制,在基本情况下,这种调度被故意设置为稍微不规则,以避免与其他广播设备发生持续冲突。
advDelay是一个在每个广播事件中被分配一个伪随机值的数值,它的范围为0-10ms,并且会加到常规的广播间隔(advInterval)中,从而使广播事件在时间上受到干扰。图18复制自蓝牙核心规范第6卷B部分的图4.5,并说明了advDelay参数的影响。
以这种方式调度广播事件可以
避免冲突
,但是这使得接收器更难以高效
地接收广播数据包,并且需要更高的接收用时循环来适应不可预测的广播事件时间安排。
普通蓝牙广播分类
有几种 PDU 类型被定义为普通广播使用。不同类型的 PDU 用于无定向广播,数据包适用于任何扫描设备和有定向性广播(directed advertising),其中数据包寻址到特定设备。PDU 类型还指示是否允许主动扫描,并且接收器将回复请求进一步的数据以及广播设备是否可连接。所有普通广播都在主通道37、38和39中的一个或多个通道上进行,并且只能使用LE 1M PHY。
普通广播和相关PDU类型指的是早期 BLE 规范版本定义的广播方式和广播数据单元类型。普通广播采用不完整的蓝牙地址作为设备标识符,并且广播数据包长度有限,最多只能传输31个八位字节的数据。与之关联的 PDU 数据类型包括
-
Connectable Undirected Advertising (ADVIND)、
-
Scannable Undirected Advertising(ADVSCAN*IND)
-
Non-Connectable Undirected Advertising(ADVNONCONN*IND)
-
Scan Response(SCAN_RSP)
-
在较新版本的 BLE 规范(如 5.0 和 5.1)中增加了更多的广播方式和数据包类型,并引入了扩展广播方式和通知广播方式等新特性。
PDU Name | Description | Channels | PHY(s) | Transmitted By | Scannable | Connectable |
---|---|---|---|---|---|---|
ADV_IND | Undirected advertising | primary | LE 1M | Peripheral | Y | Y |
ADV_DIRECT_IND | Directed advertising | primary | LE 1M | Peripheral | N | Y |
ADV_ NONCONN_IND | Undirected, non-connectable, non-scannable advertising | primary | LE 1M | Peripheral | N | N |
ADV_SCAN_IND | Undirected, scannable advertising | primary | LE 1M | Peripheral | Y | |
SCAN_REQ | Scan request | primary | LE 1M | central | N/A | N/A |
SCAN_RSP | Scan response | primary | LE 1M | Peripheral | N/A | N/A |
CONNECT_IND | Connect request | primary | LE 1M | central | N/A | N/A |
广播类型 | 核心特点 | 交互流程 | 典型应用场景 |
---|---|---|---|
ADV_IND | - 非定向可连接广播 - 允许扫描请求和连接请求 - 携带31字节广播数据 | 外设 → 广播ADV_IND 中央 → 可发送SCAN_REQ或CONNECT_IND | 智能手环、温度计等需要被发现的设备 |
ADV_DIRECT_IND | - 定向高速连接广播 - 不携带广播数据 - 指定目标设备地址 - 超时自动停止 | 外设 → 广播ADV_DIRECT_IND 指定中央 → 立即响应CONNECT_IND | 快速重连已配对设备 |
ADV_NONCONN_IND | - 单向数据广播 - 禁止扫描和连接 - 周期固定广播数据 | 外设 → 持续广播ADV_NONCONN_IND 中央仅接收,无响应 | 商场Beacon、资产追踪标签 |
ADV_SCAN_IND | - 可扫描不可连接广播 - 允许扫描请求获取附加数据 | 外设 → 广播ADV_SCAN_IND 中央 → 发送SCAN_REQ获取SCAN_RSP | 电子价签、信息展示设备 |
SCAN_REQ | - 由中央设备主动发起 - 包含扫描端地址 | 中央 → 发送SCAN_REQ 外设 → 必须回复SCAN_RSP | 获取设备详细配置信息 |
SCAN_RSP | - 携带附加响应数据 - 与ADV_IND/SCAN_IND共享31字节负载 | 外设收到SCAN_REQ后 → 发送SCAN_RSP | 补充传输设备名称等扩展信息 |
CONNECT_IND | - 携带连接参数(Interval/Latency/Timeout等) - 建立异步连接链路 | 中央 → 发送CONNECT_IND 外设 → 进入连接状态 | 启动持续数据通信 |
2. 扩展广播
BLE5.0 对广播的执行方式进行了重大改变。增加了八个与广播、扫描和连接相关的新PDU,并定义了新的程序。总体而言
这组新的广播功能被称为
扩展广播
。 扩展广播允许广播更大量的数据,按确定性时间表执行广播,并传输受不同配置控制的多个不同集合的广播数据。它也在争用和占空比方面提供了显着的改进。
信道使用和数据包大小
在执行传统广播时,射频信道的使用方式与扩展广播中有所不同,主要广播信道37、38和39传输的数据较少,而通用信道0-36则传输大部分数据。在扩展广播的背景下,通用信道也称为次级广播信道
。 如5.7.2.2所述的传统广播将相同的负载最多三次传输至三个不同的主广播通道上。扩展广播只传输有效负载数据一次,并通过小的标头引用来自主广播通道的数据。因此,传输的数据总量比使用传统广播等效情况下要小,因此有效占空比减少了。
在 BLE 5.0 扩展广播(Extended Advertising) 机制中,ADV_EXT_IND 和 AUX_ADV_IND 是两种关键的广播数据包类型,它们共同构成了 多信道、多数据包的广播传输 方式。我们来详细解析它们的作用、结构及交互流程。
2.1 . ADV_EXT_IND(扩展广播指示包)
ADV_EXT_IND(Advertising Extended Indication) 是 BLE 5.0 扩展广播的起始广播包,它用于指示接收设备在哪里获取完整的广播数据。
作用
- 由于 BLE 4.x 传统广播 只能在 信道 37、38、39 上发送,且最大只能承载 31 字节的数据(包括广播头)。
- BLE 5.0 引入了 扩展广播(Extended Advertising),允许在 数据通道(通道 0~36) 继续传输更多数据(最多 255 字节)。
ADV_EXT_IND
仍然 在广播信道 37、38、39 上发送,但它不直接承载完整的广播数据,而是 包含一个指针(AuxPtr),指向数据通道上的 AUX_ADV_IND 数据包。
包结构
字段 | 说明 |
---|---|
PDU Type (ADV_EXT_IND ) | 指示该包是 扩展广播指示包 |
Adv Mode | 标明该广播是可连接、可扫描还是纯广播 |
Extended Header | 包含广播地址(AdvA)、数据指针(AuxPtr)等 |
AuxPtr(辅助指针) | 指向下一个 AUX_ADV_IND 数据包的信道、时间和速率 |
2.2 AUX_ADV_IND(辅助扩展广播包)
AUX_ADV_IND(Auxiliary Advertising Indication) 是 ADV_EXT_IND
指向的数据包,它真正承载广播数据。
作用
AUX_ADV_IND
在 数据信道(通道 0~36) 上发送,不再局限于广播信道 37、38、39。- 它可以进一步包含
AuxPtr
指向下一个AUX_CHAIN_IND
(用于更长的数据)。 - 如果广播数据还未发送完,可以继续使用 AUX_CHAIN_IND 来承载剩余的数据。
包结构
字段 | 说明 |
---|---|
PDU Type (AUX_ADV_IND ) | 表示该包是 辅助扩展广播 |
Extended Header | 包含广播数据,或者继续 AuxPtr 指向 AUX_CHAIN_IND |
AuxPtr(可选) | 指向下一个 AUX_CHAIN_IND 数据包(如果数据较长) |
2.3 交互流程
- 设备在 广播信道 37、38、39 发送
ADV_EXT_IND
,不包含完整的数据,而是 附带AuxPtr
,指示接收设备去 数据信道 X 获取广播数据。 - 监听设备解析
ADV_EXT_IND
后,跳转到AuxPtr
指定的 数据信道 X,在指定时间点接收 AUX_ADV_IND。 - 如果数据过长,
AUX_ADV_IND
可能还会附带AuxPtr
指向 AUX_CHAIN_IND,设备继续跳转接收数据,直到完整接收。
假设一个设备要广播 100 字节的数据:
- 步骤 1:设备在 广播信道 37 发送
ADV_EXT_IND
,其中包含 AuxPtr 指向 数据信道 22。 - 步骤 2:接收设备解析
ADV_EXT_IND
,在 数据信道 22 监听 AUX_ADV_IND,接收 50 字节数据。 - 步骤 3:如果数据还没传输完,
AUX_ADV_IND
继续包含AuxPtr
,指向 数据信道 15,接收 AUX_CHAIN_IND(剩余 50 字节)。 - 步骤 4:接收设备完成广播数据接收。
2.4 总结
类型 | 作用 |
---|---|
ADV_EXT_IND | 广播信道(37/38/39) 发送,仅指示数据位置(不含完整数据),用于通知设备跳转到数据信道 |
AUX_ADV_IND | 数据信道(0~36) 发送,承载实际广播数据,可能包含 AuxPtr 指向 AUX_CHAIN_IND |
AUX_CHAIN_IND | 数据信道 发送,进一步承载超长数据 |
这种机制突破了传统 31 字节限制,使 BLE 设备可以更灵活地传输 大数据广播(如 BLE Audio、IoT 传感数据、周期性广播等)。
广播包示例:
这张截图展示了 BLE 5.0 扩展广播(Extended Advertising) 的数据包信息,特别是 辅助数据包指针(Auxiliary Packet Pointer) 的详细内容。我们来分析各个字段的作用:
1. Header(包头)
-
Adv Mode:
Non Connectable / Non Scannable
- 表示该广播 不可连接、不可扫描,可能是 周期性广播(Periodic Advertising) 或 非连接大数据广播。
2. Extended Header(扩展包头)
-
Flags:
AdvA | AdvDataInfo | AuxPtr
- AdvA(Advertising Address): 表示广播包包含广播设备的地址(
F7:B4:50:74:64:56
)。 - AdvDataInfo: 广播包包含广告数据(
Advertising Data ID
和SID
)。 - AuxPtr(Auxiliary Pointer): 说明该广播数据未传输完,指向 后续数据包。
- AdvA(Advertising Address): 表示广播包包含广播设备的地址(
3. Adv Data Info(广播数据信息)
-
Advertising Data ID:
0xEF7
- 可能是厂商自定义的广播数据标识符(类似于 UUID)。
-
Advertising Set ID (SID):
0x5
- 广播集 ID,用于标识这个扩展广播属于哪个广告组。
4. Auxiliary Packet Pointer(辅助数据包指针)
这个部分指示后续数据包的信息,包括在哪个信道、何时发送、PHY 速率等。
- LL Channel:
22 (data) (RF 24, 2450 MHz)
- 表示 后续数据包位于 BLE 数据通道 22,频率为 2450 MHz。
- BLE 扩展广播允许广播数据在 数据通道(1-36) 发送,而不是传统的广播信道(37-39)。
- CA (Clock Accuracy):
51 ppm to 500 ppm
- 设备时钟精度范围,影响同步精度。
- Offset Units:
30 us
Offset
的单位,表示时间偏移的最小粒度(30 微秒)。
- Auxiliary Offset:
9.990 ms (@0.013 799 000)
- 后续数据包将在 9.990 毫秒后发送,这个时间点由
AuxPtr
指定。 @0.013 799 000
可能是全局时间戳(用于时间同步)。
- 后续数据包将在 9.990 毫秒后发送,这个时间点由
- Auxiliary PHY:
LE 2M
- 后续数据包将在 LE 2M PHY(2 Mbps)模式下发送,比 LE 1M PHY 速率更快,降低时延。
用快递站做类比就容易理解了:
传统广播就像老式快递站:
•🚚 每天早高峰(37/38/39号公路)必须发3辆快递车
•📦 每辆车都装完整货物(即使内容相同)
•😩 经常堵车还浪费油(占空比高)
扩展广播像现代快递中心:
•🚛 只在早高峰公路发一辆指引车(小标头)
•📮 真正货物在普通时段通过其他36条小路运输
•💡 节省60%以上的道路资源(占空比降低)
效果对比:
- 传统模式:三条主路天天堵车,耗电像油老虎
- 扩展模式:主路只发导航信号,真正送货走小路
这就像从"每个电梯都塞满同样广播单"变成"电梯里只贴二维码,扫码获取完整内容"的进化。
3. 周期广播
周期性广播是蓝牙5.0基于扩展广播的特性。它允许以固定的间隔发送不可连接的广播,广播数据可以在这些间隔之间更改。
然后一个或多个扫描器可以监听这些广播,这是一种多播形式。事实上,由于固定间隔,扫描仪可以在两个广播事件之间进入睡眠状态,而不是一直处于接收模式,这与其他广播模式相比是一个巨大的优势。
关于定期广播的要点如下:
- 当启用周期性广播时,不需要启用扩展广播器。获得指向周期性广播列的指针的唯一方法是通过扩展广播程序的Syncinfo字段。因此,开始延长广播是强制性的。
- 至少需要发送一个通告报文,才能使能周期性通告。
- 它将使用与辅助数据包相同的PHY。每个周期广播具有与连接相同的参数。此外,渠道。也以与使用通道选择算法#2.4的连接相同的方式确定。
- 因为它基于扩展的广播,所以它使用数据通道而不是广播通道。
示意图如下:
周期发布模式是通过主(发布)通道上发送的ADV_EXT_IND报文(遗留发布)来表示的,主(发布)通道指向AUX_ADV_IND报文(扩展发布),其中包含周期发布的信息,如时间间隔、跳跃序列、发布者地址等。广播方还将在包含实际周期性广播数据的确定间隔内发送AUX_SYNC_IND数据包(周期性广播)。
如果周期性广播的数据不能装入一个数据包中,AUX_SYNC_IND数据包可以由AUX_CHAIN_IND个数据包组成。AUX_SYNC_IND和AUX_CHAIN_IND共同构成一系列广播,形成周期性广播序列。
4. PAwR(Periodic Advertising with Responses)
PAwR(Periodic Advertising with Responses)是 BLE 5.4 在 周期广播(Periodic Advertising) 基础上的增强功能,它允许在周期广播事件中嵌入多个响应插槽(Response Slots),使得一个或多个接收设备(PAwR Scanner / Receiver)可以在预定时间窗口内向广播设备(PAwR Advertiser / Transmitter)回传数据。
PAwR 在 BLE 协议中的定位相当于一种 低占空比、时隙化的双向广播通信机制,特别适用于 大规模、多终端、低功耗的物联网场景(如 ESL 电子价签、传感器网络)。
4.1 与周期广播的关系
特性 | 周期广播(Periodic ADV) | PAwR(Periodic ADV with Responses) |
---|---|---|
数据方向 | 单向(Advertiser → Scanner) | 双向(Advertiser ↔ Scanner) |
时序结构 | 周期事件内只发 AUX_SYNC_IND/AUX_CHAIN_IND | 周期事件内包含 AUX_SYNC_SUBEVENT_IND + 响应插槽 |
多设备支持 | 多个扫描器只能接收 | 多个扫描器可在各自的插槽内回复 |
功耗优化 | 接收端可按固定间隔唤醒接收 | 接收端按分配插槽时间唤醒发送/接收,功耗更低 |
应用场景 | 广播音频、时间同步、环境数据广播 | ESL、传感器网络、低功耗多播交互 |
PAwR 可以理解为 周期广播 + 时隙化响应,是在原有 AUX_SYNC_IND 序列上扩展出多个子事件(Subevents),每个子事件内再细分为 多个响应插槽(Response Slots)。
4.2 PAwR 数据包类型
在 PAwR 中,周期事件内的 PDU 类型与周期广播有所不同,主要新增了:
PDU 类型 | 方向 | 作用 |
---|---|---|
AUX_SYNC_SUBEVENT_IND | Advertiser → Scanner | 在周期事件内的某个子事件开始时发送,携带该子事件的参数(索引、插槽分配、剩余可用插槽等) |
AUX_SYNC_SUBEVENT_RSP | Scanner → Advertiser | 在响应插槽内发送,表示对某个插槽的占用请求或直接回传业务数据 |
4.3 时序结构
一个 PAwR 周期事件 的时间结构如下:
|<-------------- Periodic Advertising Interval -------------->|
| Subevent 0 | Subevent 1 | ... | Subevent N-1 |
| Adv Tx + RS0..RSx | Adv Tx + RS0..RSx | ... |
- Adv Tx(AUX_SYNC_SUBEVENT_IND)
广播方在子事件开始时发送该 PDU,包含:- 当前子事件索引(Subevent Index)
- 剩余可用插槽数量
- 每个插槽的时延(Response Slot Delay)和间隔(Response Slot Spacing)
- RS(Response Slot)
每个响应插槽允许一个或多个接收端发起回传(AUX_SYNC_SUBEVENT_RSP)。 - 广播方可在后续周期事件中更新插槽分配信息(如 ESL 标签刷新时)。
4.4 典型交互流程
假设一个 PAwR 周期事件配置为 4 个子事件,每个子事件 3 个响应插槽,时序如下:
- Subevent 0
- 广播方发送
AUX_SYNC_SUBEVENT_IND
,其中:Subevent Index = 0
Available Slots = 3
- 接收端A在 Slot 0 回传
AUX_SYNC_SUBEVENT_RSP
(如请求更新价签) - 接收端B在 Slot 2 回传
AUX_SYNC_SUBEVENT_RSP
(如发送传感器数据)
- 广播方发送
- Subevent 1
- 广播方发送下一子事件的
AUX_SYNC_SUBEVENT_IND
- 其他设备在分配到的插槽中回传
- 广播方发送下一子事件的
- 循环直到完成整个周期事件
4.5 关键参数
参数 | 说明 |
---|---|
Num_Subevents | 一个周期事件内的子事件数量(对应 numBis 类似) |
Response_Slot_Delay | 从 AUX_SYNC_SUBEVENT_IND 结束到第一个响应插槽开始的延迟(us) |
Response_Slot_Spacing | 相邻响应插槽之间的间隔(us) |
Available Slots | 当前子事件可用的响应插槽数量 |
Slot Bitmap | 指示哪些插槽已被占用/可用 |
4.6 应用示例
ESL(Electronic Shelf Label)网络:
- 广播方:基站
- 接收方:数百个电子价签
- 广播方在子事件内分配插槽,价签只在被分配的插槽内唤醒应答,极大降低功耗
传感器网络:
- 广播方:集中网关
- 接收方:温湿度、CO₂、光照传感器
- 广播方在每个周期事件广播时间同步信息,传感器在插槽内上报测量数据