BLE 广播
广播
-
广播包分为两种
- 广播包(Advertising Data)
- 响应包(Scan Response)
-
其中广播包是每个外设都必须广播的,而响应包是可选的。每个广播包的长度必须是31Byte,如果不到31Byte,则剩下的全用0填充,这部分的数据是无效的。
广播数据单元
-
广播包中包含若干个广播数据单元,广播数据单元也称为AD Structure
-
广播数据单元 = 长度Length + AD type + AD Data
-
长度值Length只占一个字节,并且位于广播数据单元的第一个字节。
-
例子(解析广播携带的RAW数据) 0201020f094b61747447617474424c45303031020a040503f1fff2ff06ff06000102030616f2ff0203040000000000000000000000000000000000000000
-
AD Type类型
- bit 0x00:LE有限发现模式
- bit 0x01:LE普通发现模式
- bit 0x02:不支持BR/EDR
- bit 0x03:对Same Device Capable(Controller)同时支持BLE和BR/EDR
- bit 0x04:对Same Device Capable(Host)同时支持BLE和BR/EDR
- bit 0x05..0x07:预留
- bit 0x08:缩写的设备名称
- bit 0x09:完整的设备名称
-
length is 2 , type is 0x01, data is 0x02(标识设备LE物理连接模式)
- TYPE = 0x01 LE普通发现模式
-
length is 15 , type is 0x09, data is 0x4B61747447617474424C45303031(设备名称)
-
length is 2 , type is 0x0A, data is 0x04(信号强度)
- TYPE = 0x0A 表示设备发送广播包的信号强度。数值范围:-127~+127dBm
-
length is 5 , type is 0x03, data is 0xF1FFF2FF(携带的UUID前缀)
-
length is 6 , type is 0xFF, data is 0x0600010203(厂商自定义数据)
- TYPE = 0xFF 表示厂商数据,前两个字节表示厂商ID,剩下的是厂商自定义的数据
-
length is 6 , type is 0x16, data is 0xF2FF020304(自定义服务数据)
- TYPE = 0x16 表示自定义的Service的数据,前2字节是UUID,后面是Service的数据
-
ServiceData
- 16bit UUID Service: TYPE = 0x16,前2字节是UUID,后面是Service的数据;
- 32bit UUID service: TYPE = 0x20,前4字节是UUID,后面是Service的数据;
- 128bit UUID service: TYPE = 0x21, 前16字节是UUID,后面是Service的数据。
蓝牙mesh广播
在传统蓝牙(BR/EDR (Basic Rate / Eenhanced Data Rate))中,蓝牙与设备之间的关系是一对一的,因此设备间需要先进行“配对”(Pair),再建立一条稳定的连接进行数据传输。低功耗蓝牙设备则可以和其他设备建立一对多扩扑,通过广播的形式,向在无线电直接覆盖的范围内的任何其他设备发送数据。蓝牙mesh网络则在低功耗蓝牙的基础上更进一步建立了设备间的多对多关系,通过中继,让数据可以被广播到不在直接无线电覆盖范围内的设备,通信范围得到极大拓展。 在网络中使用广播和中继,很容易让人联想到网络洪泛,无限制的中继会让网络资源瞬间被耗尽。为避免这种情况的发生,蓝牙mesh网络采用了一种管理型网络洪泛(Managed-Flood-Based)的方式。 除使用广播进行常规的数据通信外,蓝牙mesh网络还定义了有特定用途的广播格式,如PB(Provisioning Bearer)-ADV(Advertising)和Mesh Beacon。
3.1 管理型网络洪泛
蓝牙mesh网络使用了一种“管理型网络洪泛”的方式,既广播信道,进行消息的传输,让传输范围里面的所有设备都可以收到消息。网络中的支持中继功能的设备则可以将消息转发至其传输范围内的所有设备。 在蓝牙mesh网络中,并不存在一个集中式路由器的角色,因此在蓝牙mesh网络中传输的消息,并不会沿着某一特定路径进行传输,而是可以通过多重路径到达目的地。 为了避免无限制的中继给网络造成灾难性的影响,蓝牙mesh网络采取了一系列的措施,其中,有两个主要的方法:信息缓存(Message Cache)队列和TTL(Time To Live)字段。 每台设备上都包含一个网络信息缓存队列,用于保存已经被中继过的消息,如果收到的新消息与队列中的消息相匹配,则可以直接丢弃,无须进一步处理。 每条消息中都包含一个TTL字段,该字段可限制消息的跳数。消息每次都被中继,包含的TTL值将被减1,每个消息最多可以被中继126次。
TODO 中继次数可以不可以突破126次?限制126次是如何限制的?
3.1.1 信息缓存队列
为了减少没必要的安全检查及多余的中继,每个节点的网络层都应该包含一个信息缓存队列,用于保存最近接受的网络数据包。如果某个刚收到的网络数据包已经在缓存队列中,则可以直接丢弃该数据包。若该数据包并不在缓存队列中,则可以被进一步处理。 信息缓存队列中并不一定要保存完整的网络数据包,只需保存其中一部分关键特征即可,如NetMIC、SRC/SEQ等,在收到新的网络数据包时,使用这些特征进行比较,既可判断数据包是否已存在。 当新的网络数据包需要缓存到信息缓存队列中,队列已满时,需要先将队列中最早的消息丢弃,再保存新的网络数据包。 信息缓存队列要能够保存至少两个网络数据包,在实际设计时需要考虑所在网络的密度。
TODO 软件与硬件两边信息缓存队列实现的规范与细节?
3.1.2 TTL 字段
一个TTL值被设置为0的网络数据包是不会被中继的,所以收到该数据包的节点知道,自己与发送方的距离在一个单一的无线距离内(当它们之间进行通信时并不需要中继节点)。 在中继节点中,TTL值在底层传输层中修改。当底层传输层收到网络层上报的信息时,若该信息的TTL值大于或等于2,且目的地址并不是自己,则该信息的TTL值会被减1,该信息再重新被发送到网络中。若该信息的TTL值已经小于2,则该信息会直接被丢弃。
3.2 蓝牙mesh广播的数据格式
蓝牙mesh广播实际上是以低功耗蓝牙(BLE)广播为基础的,所用的数据包格式也是基于低功耗蓝牙广播的数据包格式,通过AD Type字段与其它广播进行区分。 低功耗蓝牙广播的数据格式由多个AD Structure包含一个Length字段、一个AD Type字段,以及一个AD Data字段,如表3-1所示。
表3-1 AD Structure
| Length 字段 | AD Type 字段 | AD Data 字段 |
|---|---|---|
| 1 字节 | n 字节 | Length-n 字节 |
在蓝牙mesh协议中使用了3种AD Type字段:Mesh Beacon、Mesh Message和PB-ADV。对应作用如下:
- Mesh Beacon:用于对蓝牙mesh节点或未配网节点进行周期性的广播,比如未配网设备通过周期性发送Unprovisioned Device Beacon,让自己可以被Provisioner发现,从而有机会加入蓝牙mesh网络。
- Mesh Message:在正常的蓝牙mesh节点间传输网络层数据包,其中包含TTL字段。
- PB-ADV:在Provision过程中,在广播信道上传输Generic Provisioning PDU。
上述类型的广播都是不可连接、不可搜索的无方向广播事件。如果节点收到了一个可连接或可搜索的广播事件,则应直接丢弃该广播事件。
3.2.1 Mesh Beacon
Mesh Beacon用于对蓝牙mesh节点或未分配节点进行周期性的广播,这两种节点分别对应了两种Beacon类型:Unprovisioned Device Beacon和Secure Network Beacon。
3.2.2 PB-ADV
在Provision过程中可使用两种承载层:
- PB-ADV
- 基于广播信道传输Generic Provisioning PDU。
- PB-GATT
- 将Provisioning PDU封装在Proxy PDU中进行传输的。
- 其设计是为了让不支持PB-ADV的设备也可以作为Provisioner,这样可以兼容许多不支持蓝牙mesh的蓝牙设备,如现在市场上售卖的许多手机。
3.2.3 Mesh Message
Mesh Message类型的消息被用于在蓝牙mesh节点间传输网络数据包。