参考手册: Bluetooth Core Specification V5.0、 Supplement to the Bluetooth Core Specification V10
为了能够充分理解蓝牙的广播,我们先了解一下BLE架构的GAP(Generic Access Profile
)层。
GAP层提供决定蓝牙设备之间如何交互的框架,包括:
- 蓝牙设备的角色(Client/Server)
- 广播(广播advertising报文、广播数据、广播参数、搜寻广播)
- 连接建立(初始化连接、接受连接、设置连接参数)
- 安全
在一个BLE设备中GAP可以实现:发现蓝牙设备和广播报文并连接、广播并接受连接、发送广播报文、发现蓝牙设备和广播报文但不连接(仅扫描)。对于连接模式而言,两个设备之间可以双向传输数据;对于一个正在广播中的设备而言,无法接收数据(但有一个例外:可以接收和回复scan requests
报文)。
1 广播通道
在广播状态下,设备发送一个有效数据包给其它设备,然后等待回复。这个数据包以一个固定的广播时间间隔进行发送。在蓝牙协议栈中,有40个通道,通道之间的中间间隔为2MHz。其中通道37~39称为主广播通道,而其余37个通道称为次广播通道(在连接期间也用于数据传输)。如果设备需要使用次广播通道,则需要在主广播通道中发送一个指向次广播通道的广播数据包。
2 广播包
如下图所示为广播包的格式,它最终会被封装在LL层packet中的PDU中。
- LL层的packet format具体含义参考文档:
BLUETOOTH SPECIFICATION Version 5.0 | Vol 6, Part B 2.1 PACKET FORMAT FOR THE LE UNCODED PHYS
(有编码的和未编码的协议,编码的参考2.2)
上图是针对无编码PHY层的,但有编码PHY的PDU与上图是相同的。
- 有编码PHY:Bluetooth 5.0新引入的PHY,在远距离和噪声环境中通信很有用
现在来分析一下,PDU的各个字段:
1、PDU Type
PDU根据不同的用途分为了多个类别,该字段的长度为4位,可选的值如下:
在了解这些类别之前,我们需要先了解一些名词:
①Directed和Undirected:Directed广播类型仅接收一个已知设备的请求,而Undirected广播可以接受任意设备的请求
②Connectable和Non-Connectable:一个广播设备是否允许建立一个连接
③Scannable和Non-Scannable:一个广播设备是否能够处理一个Scan Requset信息
- Scan Request和Response是用来允许设备能够广播比广播报文允许的更长的数据
④Extended advertising:扩展广播是一种可以广播更多数据(offloaded)的方式,它是通过广播一个主广播通道上指向次广播通道的辅助包实现的。
- 对于Bluetooth 5.0以下的版本不支持
⑤Periodic advertising:两台未连接的设备之间以指定的时间间隔向设备广播数据包,这意味着不止一台设备可以监听和收听这些周期性的广播。它们由以固定间隔发送的可变的广播数据组成。
- 对于Bluetooth 5.0以下的版本不支持
下面来看看PDU的类型:
(1) Legacy Advertising PDUs
也就是兼容之前蓝牙版本的PDU类型,其含义对应上面的名词解释
ADV_IND
: Connectable Scannable Undirected advertising.ADV_DIRECT_IND
: Connectable Directed advertisingADV_NONCONN_IND
: Non-Connectable Non-Scannable Undirected advertisingADV_SCAN_IND
: Scannable Undirected advertising
(2) Extended Advertising PDUs
在Bluetooth 5.0版本引入的类型,它允许设备在次广播通道进行广播,它的作用是允许更多的广播内容。
ADV_EXT_IND
: 在主广播通道发送的扩展广播 (Connectable Scannable Undirected广播类型不可用)AUX_ADV_IND
: 在次广播通道发送的扩展广播 (Connectable Scannable Undirected广播类型不可用)AUX_SYNC_IND
: 周期性广播AUX_CHAIN_IND
: 与其他广播类型一起使用,以保存额外的广播数据(广播包的chain,即多个广播包之间由chain建立关系)
(3) Scanning PDUs
Scan包使设备能够广播比单个广告包所允许的更多的广播数据。
SCAN_REQ
: 用于主广播通道中发送的Scan Requset包SCAN_RSP
: 用于主广播通道中发送的Scan Response包AUX_SCAN_REQ
: 用于次广播通道中发送的Scan Requset包AUX_SCAN_RSP
: 用于次广播通道中发送的Scan Response包
(4) Initiating PDUs
该数据包用于在一个外围设备与广播设备之间建立连接。
CONNECT_IND
: 在主广播通道上发送的连接请求包AUX_CONNECT_REQ
: 在次广播通道上发送的连接请求包AUX_CONNECT_RSP
: 在次广播通道上发送的连接响应包
2、RFU(Reserved for future use):保留
3、ChSel
如果广播设备支持LE Channel Selection Algorithm #2算法,该位会被置1
- 参考
Vol. 6, Part B, Section 4.5.8.3
4、TxAdd
如果广播设备的地址是随机的,该位置1;如果是公共的,该位置0
5、RxAdd
如果目标设备的地址是随机的,该位置1;如果是公共的,该位置0
6、Length
packet中有效数据的长度
7、PDU Payload
广播数据包的内容及其最大大小取决于PDU类型。包含广播数据的PDU类型有:ADV_IND
,ADV_NONCONN_IND
, ADV_SCAN_IND
;ADV_EXT_IND
, AUX_ADV_IND
, AUX_SYNC_IND
, AUX_CHAIN_IND
Advertising Data帧格式如下
对于广播类型AD type
来说,它有如下取值(具体定义参考官方文档Core Specification Supplement
):
- Service UUID: 包含一系列蓝牙服务UUID
- Local Name: 设备名称
- Flags: 当有一个可连接的广播包时,该位有效,Flags包括
LE Limited Discoverable Mode
,LE General Discoverable Mode
,BR/EDR Not Supported
,Simultaneous LE
、BR/EDR to Same Device Capable (Controller)
,Simultaneous LE and BR/EDR to Same Device Capable (Host)
- Manufacturer Specific Data: 产商的唯一标识符
- TX Power Level: 发送功率
- Slave Connection Interval Range: 可通过广播数据包请求更改对方的默认连接间隔范围
- Service Solicitation: 请求与一个或多个指定服务的广播设备连接
- Service Data: 包含服务的UUID和该服务所对应的数据
- Appearance: 根据standard Appearance assigned numbers定义的广播设备的类型
- Public Target Address: 当使用公共地址绑定一个或多个设备时,定义广播的一个或多个接收者的地址。
- Random Target Address: 当使用随机地址绑定一个或多个设备时,定义广播的一个或多个接收者的地址。
- Advertising Interval: 广播间隔
- Uniform Resource Identifier: 用于广播一个URL
- LE Supported Features: 用于定义设备的低功耗特性,参考
Core Specification (Vol. 6, Part B, Section 4.6
例:设置Flags
和Local Name
对应的AD Structure
对于Flags
,它的AD Type
为0x01,这里设置LE Limited Discoverable Mode
标识,其对应的值如下图所示,第0位置1即设置,故将Flags
设置为0x01;
对于Local Name
,它包括两种:Shortened Local Name
和Complete Local Name
,这里以Complete Local Name
的设置为例,它的AD Type
为0x09。
最终AD Structure的十六进制格式如下:
- AD Type的值在官方的手册中没有说明,可以在官方SDK中查看