BLE 广播 rawBytes 解析说明

在 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 分别解析。