BLE 广播格式定义

简介: BLE 广播格式定义

低功耗蓝牙两类报文 : 广播报文 和 数据报文。

本文讨论广播报文数据段,不包括完整报文其他部分,比如前导,接入地址等


蓝牙设备通过广播表明自己的存在,等待被连接。

BLE 考虑功耗, 使用了3个广播信道,顺序广播。


两个蓝牙设备想要建立连接, 第一步是 从机(server) 向外广播, 主机(client) 搜索到后发起请求。 从机广播中包含设备的相关信息,比如设备名称,设备具有的服务uuid 等。


广播包类型

  • 广播包 (Advertising Data)
  • 响应包 (Scan Response)主机主动扫描的情况下, 发送扫描请求给从机, 从机返回扫描响应数据。


广播数据包格式


image.png



每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。


  • 有效数据部分
  • 包含若干个广播数据单元,称为 AD Structure 。如图所示,AD Structure 的组成是:

  • 长度 Len ,表示这个 AD Structure 的长度(除去 len本身 1)
  • 类型 AD Type
  • 标记这段广播数据代表什么, 比如设备名, uuid 等。
  • 数据 AD data
  • 无效数据部分
  • 广播包的长度必须是 31 个 byte,如果有效数据部分不到 31 自己,剩下的就用 0 补全。这部分的数据是无效的。


Flags

对于低功耗蓝牙设备, 广播中需要包括的一个 Structure, 包含一个byte 的标记, 标记设备

  • Flags used over the LE physical channel are:

  • Limited Discoverable Mode
  • General Discoverable Mode
  • BR/EDR Not Supported
  • Simultaneous LE and BR/EDR to Same Device Capable (Controller)
  • Simultaneous LE and BR/EDR to Same Device Capable (Host)


广播设备的服务uuid


假如蓝牙设备有心率等profile, 可以在广播中添加那对应的服务uuid ,这样其他设备可以通过广播直接了解设备具备的功能。

GAP 和 GATT 服务的 UUID 不应该出现在广播中, 这对于每个设备都是具有的。

广播中包含服务uuid 包括六种类型, 对应不同程度 uuid 和列表完整性(complete 和 incomplete)


  • 16-bit Bluetooth Service UUIDs
  • 32-bit Bluetooth Service UUIDs
  • Global 128-bit Service UUIDs


complete 和 incomplete 的区别

比如, 我设备有两个服务对应的 16 bit uuid 分别是 0x1122 和 0x 2233。


  • 如果我只想广播其中一个

image.png

广播中的厂商信息

这个一段的广播标记时 0XFF, 对应用于标记设备的生产商和其他信息。

数据前两个字节时厂商ID, 其他自定义。

具体其他广播数据段类型详见 参考。


官方提供例子

image.png


广播数据格式

所有的 AD type 的定义在文档 Core Specification Supplement 中。 AD Type 包括如下类型:


Flags: TYPE = 0x01。这个数据用来标识设备 LE 物理连接的功能。DATA 是 0 到多个字节的 Flag 值,每个 bit 上用 0 或者 1 来表示是否为 True。如果有任何一个 bit 不为 0,并且广播包是可连接的,就必须包含此数据。各 bit 的定义如下:


  • bit 0: LE 有限发现模式
  • bit 1: LE 普通发现模式
  • bit 2: 不支持 BR/EDR
  • bit 3: 对 Same Device Capable(Controller) 同时支持 BLE 和 BR/EDR
  • bit 4: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
  • bit 5..7: 预留


Service UUID: 广播数据中一般都会把设备支持的 GATT Service 广播出来,用来告诉外面本设备所支持的 Service。有三种类型的 UUID:16 bit, 32bit, 128 bit。广播中,每种类型类型有有两个类别:完整和非完整的。这样就共有 6 种 AD Type。


  • 非完整的 16 bit UUID 列表: TYPE = 0x02;
  • 完整的 16 bit UUID 列表: TYPE = 0x03;
  • 非完整的 32 bit UUID 列表: TYPE = 0x04;
  • 完整的 32 bit UUID 列表: TYPE = 0x05;
  • 非完整的 128 bit UUID 列表: TYPE = 0x06;
  • 完整的 128 bit UUID 列表: TYPE = 0x07;


Local Name: 设备名字,DATA 是名字的字符串。 Local Name 可以是设备的全名,也可以是设备名字的缩写,其中缩写必须是全名的前面的若干字符。


  • 设备全名: TYPE = 0x08
  • 设备简称: TYPE = 0x09


TX Power Level: TYPE = 0x0A,表示设备发送广播包的信号强度。DATA 部分是一个字节,表示 -127 到 + 127 dBm。


带外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每个 bit 表示一个功能:


  • bit 0: OOB Flag,0 表示没有 OOB 数据,1 表示有
  • bit 1: 支持 LE
  • bit 2: 对 Same Device Capable(Host) 同时支持 BLE 和 BR/EDR
  • bit 3: 地址类型,0 表示公开地址,1 表示随机地址


外设(Slave)连接间隔范围:TYPE = 0x12。数据中定义了 Slave 最大和最小连接间隔,数据包含 4 个字节:


  • 前 2 字节:定义最小连接间隔,取值范围:0x0006 ~ 0x0C80,而 0xFFFF 表示未定义;
  • 后 2 字节:定义最大连接间隔,同上,不过需要保证最大连接间隔大于或者等于最小连接间隔。


服务搜寻:外围设备可以要请中心设备提供相应的 Service。其数据定义和前面的 Service UUID 类似:


  • 16 bit UUID 列表: TYPE = 0x14
  • 32 bit UUID 列表: TYPE = 0x??
  • 128 bit UUID 列表: TYPE = 0x15


Service Data: Service 对应的数据。


  • 16 bit UUID Service: TYPE = 0x16, 前 2 字节是 UUID,后面是 Service 的数据;
  • 32 bit UUID Service: TYPE = 0x??, 前 4 字节是 UUID,后面是 Service 的数据;
  • 128 bit UUID Service: TYPE = 0x??, 前 16 字节是 UUID,后面是 Service 的数据;


公开目标地址:TYPE = 0x17,表示希望这个广播包被指定的目标设备处理,此设备绑定了公开地址,DATA 是目标地址列表,每个地址 6 字节。


随机目标地址:TYPE = 0x18,定义和前一个类似,表示希望这个广播包被指定的目标设备处理,此设备绑定了随机地址,DATA 是目标地址列表,每个地址 6 字节。


Appearance:TYPE = 0x19,DATA 是表示了设备的外观。


厂商自定义数据: TYPE = 0xFF,厂商自定义的数据中,前两个字节表示厂商 ID,剩下的是厂商自己按照需求添加,里面的数据内容自己定义。


还有一些其他的数据,我这里就不一一列举了,有需要的可以从这个文档查阅 Core Specification Supplement 。

目录
相关文章
|
3月前
|
存储 缓存 监控
|
4月前
|
算法 网络协议 物联网
|
5月前
|
芯片
USB Type-C引脚解析 && CC、DFP、UFP、DRP用途解析
USB Type-C引脚解析 && CC、DFP、UFP、DRP用途解析
|
6月前
|
算法 数据处理 C++
Franca IDL与CommonAPI C++ D-Bus实战教程:方法、信号和属性传递详解
Franca IDL与CommonAPI C++ D-Bus实战教程:方法、信号和属性传递详解
150 0
|
物联网 网络性能优化
一文解释 MQTT 数据包的结构
一文解释 MQTT 数据包的结构
334 0
|
存储 编解码 监控
GB/T28181-2016 SDP定义和音视频传输模式解读
联网系统中SIP消息体中携带的SDP内容应符合IETF RFC 2327的相关要求。应有如下字段:Session
328 0
|
安全 Go
Go 方法接收器:选择值接收器还是指针接收器?
本文简单介绍了 Go 语言中的方法接收器,重点讲解了值接收器和指针接收器。通过实际示例展示了它们的用法,并对比了它们的差异性。最后,给出了如何根据实际情况正确选择接收器的建议。 总之,在选择接收器时,我们应考虑接收器类型的特性及使用场景,根据实际需求做出选择。若 无法确定 究竟使用哪种接收器,建议优先考虑 指针接收器。
38851 0
|
编解码
如何使用RTP封装H264视频数据
RTP的第一个字节是消息类型,如果是FU-A,第二个字节用来指示是否是I帧,是否I帧的开始或结束。
如何使用RTP封装H264视频数据
|
弹性计算 关系型数据库 数据库
跨私网传输用法解析
数加集成(Data Integration)是阿里集团对外提供的稳定高效、弹性伸缩的数据同步平台,为阿里云大数据计算引擎(包括关系型数据库、MPP数据库、大数据存储、非结构化存储、NoSql数据库等)提供互通的跨网络离线(批量)的数据进出通道。
2274 0