ble之设备发现
广播 (Advertising) 与扫描 (Scanning) 是低功耗蓝牙设备在进入连接前在设备发现 (Device Discovery) 阶段的工作状态。下面,我们先了解与广播有关的基本概念。
广播的基本概念
广播是设备通过蓝牙天线,向外发送广播数据包的过程。由于广播者在广播时并不知道环境中是否存在接收方,也不知道接收方会在什么时候启动天线,所以需要周期性地发送广播数据包,直到有设备响应。在上述过程中,对于广播者来说存在以下几个问题,让我们一起来思考一下
-
向哪里发送广播数据包? (Where?)
-
发送广播数据包的周期取多久? (When?)
-
广播数据包里包含哪些信息? (What?)
向哪里发送广播数据包?
蓝牙的无线电频段
第一个问题指向的是,广播数据包应发送到哪一无线电频段。这个回答由蓝牙核心规范给出,答案是 2.4 GHz ISM 频段。2.4 GHz ISM 频段是一个全球可用的免费无线电频段,不被任何国家以军事用途等理由管控,也无需向任何组织支付许可费用,因此该频段的可用性极高,且没有任何使用成本。不过,这也意味着 2.4 GHz ISM 频段非常拥挤,可能会与其他无线通信协议发生数据冲突,如 2.4 GHz WiFi。
蓝牙信道
与经典蓝牙相同,蓝牙技术联盟为了解决数据冲突的问题,在低功耗蓝牙上也应用了自适应跳频技术 (Adaptive Frequency Hopping, AFH) ,该技术可以判断 RF 信道的拥挤程度,通过跳频避开拥挤的 RF 信道,以提高通信质量。不过低功耗蓝牙与经典蓝牙的不同之处在于,所使用的 2.4 GHz ISM 频段被划分为 40 个 2 MHz 带宽的射频 (Radio Frequency, RF) 信道,中心频率范围为 2402 MHz - 2480 MHz ,而经典蓝牙则是将这一频段划分为 79 个 1MHz 带宽的 RF 信道。
在蓝牙核心规范 4.2 (Bluetooth Core Specification 4.2) 中, RF 信道分为两种类型,如下
|
类型 |
数量 |
编号 |
作用 |
|---|---|---|---|
|
广播信道 (Advertising Channel) |
3 |
37-39 |
用于发送广播数据包和扫描响应数据包 |
|
数据信道 (Data Channel) |
37 |
0-36 |
用于发送数据通道数据包 |
广播者在广播时,会在 37-39 这三个广播信道中进行广播数据包的发送。在三个广播信道的广播数据包均发送完毕后,可以认为一次广播结束,广播者会在下一次广播时刻到来时重复上述过程。
扩展广播特性
蓝牙核心规范 4.2 中,广播数据包允许搭载最多 31 字节广播数据,这无疑限制了广播的功能。为了提高广播的可用性,蓝牙 5.0 标准引入了 扩展广播 (Extended Advertising) 特性,这一特性将广播数据包分为
|
类型 |
简称 |
单包最大广播数据字节数 |
最大广播数据字节数 |
|---|---|---|---|
|
主广播数据包 (Primary Advertising Packet) |
Legacy ADV |
31 |
31 |
|
扩展广播数据包 (Extended Advertising Packet) |
Extended ADV |
254 |
1650 |
扩展广播数据包由 ADV_EXT_IND 和 AUX_ADV_IND 组成,分别在主广播信道 (Primary Advertising Channel) 和次广播信道 (Secondary Advertising Channel) 上传输。其中,主广播信道对应于信道 37-39 ,次广播信道对应于信道 0-36 。由于接收方总是在主广播信道中接收广播数据,因此发送方在发送扩展广播数据包时,应在主广播信道中发送 ADV_EXT_IND ,在次广播信道中发送 AUX_ADV_IND ,并在 ADV_EXT_IND 中指示 AUX_ADV_IND 所在的次广播信道;通过这种机制,接收方能够在接收到主广播信道的 ADV_EXT_IND 以后,根据指示到指定的次广播信道去接收 AUX_ADV_IND ,从而得到完整的扩展广播数据包。
|
类型 |
信道 |
作用 |
|---|---|---|
|
主广播信道 (Primary Advertising Channel) |
37-39 |
用于传输扩展广播数据包的 ADV_EXT_IND |
|
次广播信道 (Secondary Advertising Channel) |
0-36 |
用于传输扩展广播数据包的 AUX_ADV_IND |
发送广播数据包的周期取多久?
广播间隔
对于第二个问题,即发送广播数据包的周期怎么取,蓝牙标准中也给出了一个明确的参数定义,即广播间隔 (Advertising Interval)。广播间隔可取的范围为 20 ms 到 10.24 s ,取值步长为 0.625 ms。
广播间隔的取值决定了广播者的可发现性 (Discoverability) 以及设备功耗。当广播间隔取得太长时,广播数据包被接收方接收到的概率就会变得很低,此时广播者的可发现性就会变差。同时,广播间隔也不宜取得太短,因此频繁发送广播数据需要消耗更多的电量。所以,广播者需要在可发现性和能耗之间进行取舍,根据应用场景的需求选择最合适的广播间隔。
值得一提的是,如果在同一空间中存在两个广播间隔相同的广播者,那么有概率出现重复性的撞包 (Packet Collision) 现象,即两个广播者总是在同一时刻向同一信道发送广播数据。由于广播是一个只发不收的过程,广播者无法得知是否发生了广播撞包。为了降低上述问题的发生概率,广播者应在每一次广播事件后添加 0-10 ms 的随机时延。
广播数据包里包含哪些信息?
广播数据包结构
对于第三个问题,即广播数据包内含有什么信息,在蓝牙核心规范 4.2 中给出了广播数据包的格式定义,如下图所示

看起来非常复杂,让我们来逐层分解。广播数据包的最外层包含四个部分,分别是
|
序号 |
名称 |
字节数 |
功能 |
|---|---|---|---|
|
1 |
预置码 (Preamble) |
1 |
特殊的比特序列,用于设备时钟同步 |
|
2 |
访问地址 (Access Address) |
4 |
标记广播数据包的地址 |
|
3 |
协议数据单元 (Protocol Data Unit, PDU) |
2-39 |
有效数据的存放区域 |
|
4 |
循环冗余校验和 (Cyclic Redundancy Check, CRC) |
3 |
用于循环冗余校验 |
广播数据包是蓝牙数据包的一种类型,由 PDU 类型决定。下面我们将对 PDU 展开详细的介绍
PDU
PDU 段为有效数据存放的区域,其结构如下
|
序号 |
名称 |
字节数 |
|---|---|---|
|
1 |
头 (Header) |
2 |
|
2 |
有效负载 (Payload) |
0-37 |
PDU 头
PDU 头中含有较多信息,可以分为以下六个部分
|
序号 |
名称 |
比特位数 |
备注 |
|---|---|---|---|
|
1 |
PDU 类型 (PDU Type) |
4 |
|
|
2 |
保留位 (Reserved for Future Use, RFU) |
1 |
|
|
3 |
通道选择位 (Channel Selection Bit, ChSel) |
1 |
标记广播者是否支持 LE Channel Selection Algorithm #2 通道选择算法 |
|
4 |
发送地址类型 (Tx Address, TxAdd) |
1 |
0/1 分别表示公共地址/随机地址 |
|
5 |
接收地址类型 (Rx Address, RxAdd) |
1 |
0/1 分别表示公共地址/随机地址 |
|
6 |
有效负载长度 (Payload Length) |
8 |
PDU 类型位反映了设备的广播行为。在蓝牙标准中,共有以下三对广播行为
-
可连接 (Connectable) 与 不可连接 (Non-connectable)
-
是否接受其他设备的连接请求
-
-
可扫描 (Scannable) 与 不可扫描 (Non-scannable)
-
是否接受其他设备的扫描请求
-
-
不定向 (Undirected) 与 定向 (Directed)
-
是否发送广播数据至指定设备
-
上述广播行为可以组合成以下四种常见的广播类型,对应四种不同的 PDU 类型
|
可连接? |
可扫描? |
不定向? |
PDU 类型 |
作用 |
|---|---|---|---|---|
|
是 |
是 |
是 |
ADV_IND |
最常见的广播类型 |
|
是 |
否 |
否 |
ADV_DIRECT_IND |
常用于已知设备重连 |
|
否 |
否 |
是 |
ADV_NONCONN_IND |
作为信标设备,仅向外发送广播数据 |
|
否 |
是 |
是 |
ADV_SCAN_IND |
作为信标设备,一般用于广播数据包长度不足的情况,此时可以通过扫描响应向外发送额外的数据 |
PDU 有效负载
PDU 有效负载也分为两部分
|
序号 |
名称 |
字节数 |
备注 |
|---|---|---|---|
|
1 |
广播地址 (Advertisement Address, AdvA) |
6 |
广播设备的 48 位蓝牙地址 |
|
2 |
广播数据 (Advertisement Data, AdvData) |
0-31 |
由若干广播数据结构 (Advertisement Data Structure) 组成 |
先看广播地址,即蓝牙地址,可以分为
|
类型 |
说明 |
|---|---|
|
公共地址 (Public Address) |
全球范围内独一无二的固定设备地址,厂商必须为此到 IEEE 组织注册并缴纳一定费用 |
|
随机地址 (Random Address) |
随机生成的地址 |
随机地址又根据用途分为两类
|
类型 |
说明 |
|---|---|
|
随机静态地址 (Random Static Address) |
可以随固件固化于设备,也可以在设备启动时随机生成,但在设备运行过程中不得变更;常作为公共地址的平替 |
|
随机私有地址 (Random Private Address) |
可在设备运行过程中周期性变更,避免被其他设备追踪 |
若使用随机私有地址的设备要与其他受信任的设备通信,则应使用身份解析秘钥 (Identity Resolving Key, IRK) 生成随机地址,此时其他持有相同 IRK 的设备可以解析并得到设备的真实地址。此时,随机私有地址又可以分为两类
|
类型 |
说明 |
|---|---|
|
可解析随机私有地址 (Resolvable Random Private Address) |
可通过 IRK 解析得到设备真实地址 |
|
不可解析随机私有地址 (Non-resolvable Random Private Address) |
完全随机的地址,仅用于防止设备被追踪,非常少用 |
然后看广播数据。一个广播数据结构的格式定义如下
|
序号 |
名称 |
字节数 |
备注 |
|---|---|---|---|
|
1 |
数据长度 (AD Length) |
1 |
|
|
2 |
数据类型 (AD Type) |
n |
大部分数据类型占用 1 字节 |
|
3 |
数据 (AD Data) |
(AD Length - n) |
更多推荐
所有评论(0)