在 BLE 扫描结果中,rawBytes表示扫描到的原始广播数据或扫描响应数据。
这些数据通常由多个AD Structure组成,每个 AD Structure 都按照固定格式排列。
一、rawBytes 的结构
BLE 广播数据的基本结构如下:
Length | AD Type | AD Data其中:
| 字段 | 长度 | 说明 |
|---|---|---|
| Length | 1 字节 | 表示后面还有多少字节,不包含 Length 自身 |
| AD Type | 1 字节 | 表示当前这段数据的类型 |
| AD Data | Length - 1 字节 | 具体数据,解析方式由 AD Type 决定 |
需要注意:
Length 包含 AD Type 和 AD Data Length 不包含 Length 自己 AD Data 的长度 = Length - 1例如:
02 01 06解析为:
02 = Length,表示后面有 2 个字节 01 = AD Type 06 = AD Data所以整个 AD Structure 实际长度是:
1 + Length = 3 字节解析 rawBytes 时,就是不断重复读取:
读取 Length 读取 AD Type 读取 Length - 1 字节的 AD Data 根据 AD Type 解析 AD Data 继续读取下一段 AD Structure如果遇到:
00表示:
Length = 0通常可以认为后面没有有效广播数据了。
二、常用 AD Type 及 Data 解析方式
| AD Type | 名称 | AD Data 解析方式 |
|---|---|---|
0x01 | Flags | 1 字节,按 bit 位解析 |
0x02 | Incomplete List of 16-bit Service UUIDs | 每 2 字节一个 UUID,小端序 |
0x03 | Complete List of 16-bit Service UUIDs | 每 2 字节一个 UUID,小端序 |
0x06 | Incomplete List of 128-bit Service UUIDs | 每 16 字节一个 UUID |
0x07 | Complete List of 128-bit Service UUIDs | 每 16 字节一个 UUID |
0x08 | Shortened Local Name | 按 UTF-8 字符串解析 |
0x09 | Complete Local Name | 按 UTF-8 字符串解析 |
0x0A | Tx Power Level | 1 字节有符号整数,单位 dBm |
0x16 | Service Data - 16-bit UUID | 前 2 字节是 16-bit UUID,小端序;后面是 Service Data |
0x19 | Appearance | 2 字节,小端序 |
0xFF | Manufacturer Specific Data | 前 2 字节是 Company ID,小端序;后面是厂商自定义数据 |
1. Flags:0x01
示例:
02 01 06解析:
02 = Length 01 = AD Type,表示 Flags 06 = AD Data0x06转成二进制:
0000 0110常见 bit 位含义:
| 位 | 值 | 含义 |
|---|---|---|
| bit0 | 0x01 | LE Limited Discoverable Mode |
| bit1 | 0x02 | LE General Discoverable Mode |
| bit2 | 0x04 | BR/EDR Not Supported |
| bit3 | 0x08 | Simultaneous LE and BR/EDR to Same Device Capable, Controller |
| bit4 | 0x10 | Simultaneous LE and BR/EDR to Same Device Capable, Host |
所以:
0x06 = 0x02 + 0x04表示:
LE General Discoverable Mode BR/EDR Not Supported2. 16-bit Service UUID:0x02 / 0x03
示例:
03 02 0F 18解析:
03 = Length 02 = AD Type,表示 Incomplete List of 16-bit Service UUIDs 0F 18 = AD Data16-bit UUID 使用小端序:
0F 18 => 0x180F通常可以补全成 128-bit UUID:
0000180f-0000-1000-8000-00805f9b34fb如果 AD Data 中有多个 UUID,例如:
05 03 0F 18 0A 18解析为:
0F 18 => 0x180F 0A 18 => 0x180A3. Local Name:0x08 / 0x09
示例:
08 09 44 65 76 69 63 65 31解析:
08 = Length 09 = AD Type,表示 Complete Local Name 44 65 76 69 63 65 31 = AD DataAD Data 按 UTF-8 字符串解析:
Device1其中:
44 = D 65 = e 76 = v 69 = i 63 = c 65 = e 31 = 14. Tx Power Level:0x0A
示例:
02 0A EC解析:
02 = Length 0A = AD Type,表示 Tx Power Level EC = AD DataTx Power 是 1 字节有符号整数。
0xEC => -20所以表示:
Tx Power = -20 dBm5. Service Data - 16-bit UUID:0x16
示例:
05 16 0F 18 64 00解析:
05 = Length 16 = AD Type,表示 Service Data - 16-bit UUID 0F 18 = 16-bit UUID,小端序 64 00 = Service Data其中:
0F 18 => 0x180F后面的:
64 00是该 Service 对应的数据,具体含义需要根据对应 Service 定义或厂商协议解析。
6. Appearance:0x19
示例:
03 19 C1 03解析:
03 = Length 19 = AD Type,表示 Appearance C1 03 = AD DataAppearance 是 2 字节小端序:
C1 03 => 0x03C1常见 Appearance 示例:
| 值 | 含义 |
|---|---|
0x0000 | Unknown |
0x0040 | Generic Phone |
0x0080 | Generic Computer |
0x03C0 | Generic Human Interface Device |
0x03C1 | Keyboard |
0x03C2 | Mouse |
7. Manufacturer Specific Data:0xFF
示例:
08 FF 4C 00 01 02 03 04 05解析:
08 = Length FF = AD Type,表示 Manufacturer Specific Data 4C 00 = Company ID 01 02 03 04 05 = Manufacturer DataCompany ID 使用小端序:
4C 00 => 0x004C后面的:
01 02 03 04 05是厂商自定义数据。
需要注意:
0xFF 的 AD Data 中,只有前 2 字节 Company ID 是标准规定的; 后面的 Manufacturer Data 由厂商自己定义。所以 Manufacturer Data 可能表示设备型号、MAC 地址、序列号、传感器数据、业务状态等,具体要看厂商协议。
三、完整示例
下面用一段脱敏后的 rawBytes 举例:
02 01 06 03 03 0F 18 08 09 44 65 76 69 63 65 31 08 FF 4C 00 01 02 03 04 05 03 19 C1 03逐段解析如下。
第 1 段
02 01 06解析:
02 = Length 01 = AD Type,Flags 06 = AD Data0x06表示:
LE General Discoverable Mode BR/EDR Not Supported第 2 段
03 03 0F 18解析:
03 = Length 03 = AD Type,Complete List of 16-bit Service UUIDs 0F 18 = AD Data小端序解析:
0F 18 => 0x180F补全成 128-bit UUID:
0000180f-0000-1000-8000-00805f9b34fb第 3 段
08 09 44 65 76 69 63 65 31解析:
08 = Length 09 = AD Type,Complete Local Name 44 65 76 69 63 65 31 = AD Data按 UTF-8 字符串解析:
Device1第 4 段
08 FF 4C 00 01 02 03 04 05解析:
08 = Length FF = AD Type,Manufacturer Specific Data 4C 00 = Company ID 01 02 03 04 05 = Manufacturer DataCompany ID 小端序:
4C 00 => 0x004CManufacturer Data:
01 02 03 04 05这部分是厂商自定义数据,不能只根据蓝牙通用规则继续判断其业务含义。
第 5 段
03 19 C1 03解析:
03 = Length 19 = AD Type,Appearance C1 03 = AD Data小端序解析:
C1 03 => 0x03C1表示:
Keyboard四、解析总结
BLErawBytes的解析核心是:
Length | AD Type | AD Data解析规则是:
1. 先读取 1 字节 Length 2. 再读取 1 字节 AD Type 3. 再读取 Length - 1 字节 AD Data 4. 根据 AD Type 决定 AD Data 的解析方式 5. 继续解析下一段 AD Structure需要特别注意:
Length 不包含自己 Length 包含 AD Type AD Data 长度 = Length - 1 UUID 通常按小端序解析 Local Name 按 UTF-8 字符串解析 Manufacturer Specific Data 只有前 2 字节 Company ID 是通用格式,后面的数据由厂商自定义因此,拿到 BLE 广播rawBytes后,不能直接把整段数据当成业务数据解析,而应该先按照 BLE AD Structure 拆分,再根据不同的 AD Type 分别解析。