在 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 Data
0x06 转成二进制:
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 Supported
2. 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 Data
16-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 => 0x180A
3. 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 Data
AD Data 按 UTF-8 字符串解析:
Device1
其中:
44 = D
65 = e
76 = v
69 = i
63 = c
65 = e
31 = 1
4. Tx Power Level:0x0A
示例:
02 0A EC
解析:
02 = Length
0A = AD Type,表示 Tx Power Level
EC = AD Data
Tx Power 是 1 字节有符号整数。
0xEC => -20
所以表示:
Tx Power = -20 dBm
5. 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 Data
Appearance 是 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 Data
Company 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 Data
0x06 表示:
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 Data
Company ID 小端序:
4C 00 => 0x004C
Manufacturer 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
四、解析总结
BLE rawBytes 的解析核心是:
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 分别解析。