参考:
https://bbs.huaweicloud.com/blogs/309276
https://blog.csdn.net/weixin_48033504/article/details/122638836
低功耗蓝牙两类报文 : 广播报文 和 数据报文。
本文讨论广播报文数据段,不包括完整报文其他部分,比如前导,接入地址等
蓝牙设备通过广播表明自己的存在,等待被连接。
BLE 考虑功耗, 使用了3个广播信道,顺序广播。
两个蓝牙设备想要建立连接, 第一步是 从机(server) 向外广播, 主机(client) 搜索到后发起请求。 从机广播中包含设备的相关信息,比如设备名称,设备具有的服务uuid 等。
广播包类型
- 广播包 (Advertising Data)
- 响应包 (Scan Response)
主机主动扫描的情况下, 发送扫描请求给从机, 从机返回扫描响应数据。
广播数据包格式
每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。
-
有效数据部分
包含若干个广播数据单元,称为 AD Structure 。如图所示,AD Structure 的组成是:- 长度 Len ,表示这个 AD Structure 的长度(除去 len本身 1)
- 类型 AD Type
标记这段广播数据代表什么, 比如设备名, uuid 等。 - 数据 AD data
-
无效数据部分
广播包的长度必须是 31 个 byte,如果有效数据部分不到 31 自己,剩下的就用 0 补全。这部分的数据是无效的。
报文解析举例:
如手机收到如下一大串广播报文,由上面广播报文格式可知,AD struct 由两部分组成: LEN + Data(Data包含AD type + AD data)。由于底层将LEN (值为0x17 即23 )过滤了,所以这里智能看到data部分。
2,1,6,6,16,-51,-6,1,1,1,c,9,
54,41,50,45,20,4c,49,47,48,54,53,
3,19,-80,5 ,c,9,
41,49,47,4f,20,4c,49,47,48,54,53,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
第1个2 表示报文中第1个AD structure len 为2,1为AD type表示设备标识 ,设备标识值为6
2, 长度
1, 设备标识
6,
第2个AD struct len 为2,AD type 为16 表示Service Data, 0xFAAF 、0x010101
6, 长度
16, Service Data
-51,-6, UUID 0xaf fa
1,1,1, Data
c, = 12 : 长度
9, : 设备名称
54,41,50,45,20,4c,49,47,48,54,53, //第一个包,11个字节为 “TAPE LIGHTS” 的ASCII值,
3, 长度
19, : 设备外观
-80,5,
c, =12 :长度
9: 设备名称
AIGO LIGHTS :
41,49,47,4f,20,4c,49,47,48,54,53, //第二个包
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
AD Type 类型都是统一定义的。