蓝牙广播
本文档说明蓝牙低功耗(BLE)设备的广播格式、UUID结构以及APP扫描规范。
广播类型
本项目使用BLE广播来发送设备信息,支持两种UUID格式:
| UUID格式 | 广播类型 | 特点 | 长度 |
|---|---|---|---|
| 32位UUID | Legacy广播(BLE 4.x) | 兼容性好,广播数据包最大31字节 | 4字节 |
| 128位UUID | 扩展广播(BLE 5.0) | 功能丰富,BK7258方案下安卓无法扫描 | 16字节 |
兼容性提示
128位UUID在BK7258方案下,安卓设备无法扫描到,建议使用32位UUID格式以保证兼容性。
32位UUID广播
字节结构
32位UUID由4个字节组成,采用小端序(LSB在前):
| 字节位置 | 索引 | 字段名 | 说明 | 取值范围 |
|---|---|---|---|---|
| 字节1(LSB) | [0] | status_flags_1 | 状态标志位1 | 见下方状态标志位说明 |
| 字节2 | [1] | status_flags_2 | 状态标志位2 | 见下方状态标志位说明 |
| 字节3 | [2] | RestoreCounter | 恢复计数器 | 0x00~0xFF(0~255) |
| 字节4(MSB) | [3] | 厂商标识 | 区分设备厂商 | 请查看厂商UUID前缀分配表 |
状态标志位说明
字节1 [0] - status_flags_1:
| Bit位 | 名称 | 说明 | 取值 |
|---|---|---|---|
| bit 0 | !sleep_flag | 睡眠状态 | 0=睡眠1=唤醒 |
| bit 1 | has_new_event | 有新事件记录 | 0=无新事件1=有新事件待上报 |
| bit 2~7 | 保留 | 保留位 | - |
字节2 [1] - status_flags_2:
| Bit位 | 名称 | 说明 | 取值 |
|---|---|---|---|
| bit 0 | pair_flag | 配对状态 | 0=未配对1=已配对 |
| bit 1~7 | 保留 | 保留位 | - |
向后兼容
现有设备广播值 0x01(唤醒) 或 0x00(睡眠) 的 bit 1 均为 0,不会触发事件读取,完全兼容。
示例解析
UUID: 0x750F0001
├─ 字节1 [0]: 0x01 → status_flags_1 (bit0=1唤醒, bit1=0无新事件)
├─ 字节2 [1]: 0x00 → status_flags_2 (bit0=0未配对)
├─ 字节3 [2]: 0x0F → 恢复计数器=15
└─ 字节4 [3]: 0x75 → 厂商标识(公版)提示
32位广播无法区分设备类型(如门锁/网关)。
128位UUID广播
字节结构
128位UUID由16个字节组成,采用小端序(LSB在前):
| 字节位置 | 索引 | 字段名 | 说明 | 取值范围 |
|---|---|---|---|---|
| 字节1(LSB) | [0] | 固定值 | 无意义占位 | 0x01 |
| 字节2 | [1] | !sleep_flag | 睡眠状态 | 0x00=睡眠0x01=唤醒 |
| 字节3 | [2] | pair_flag | 配对状态 | 0x00=未配对0x01=已配对 |
| 字节4 | [3] | connect_type | 连接类型 | 0x03=短连接0x04=长连接 |
| 字节5~10 | [4]~[9] | MAC[0~5] | MAC地址 | 设备MAC地址(6字节) |
| 字节11 | [10] | RestoreCounter | 恢复计数器 | 0x00~0xFF(0~255) |
| 字节12 | [11] | status_flags | 状态标志位 | 见下方状态标志位说明 |
| 字节13~16 | [12]~[15] | 厂商标识 | 区分设备厂商 | 请查看厂商UUID前缀分配表 |
状态标志位 (字节12)
字节12为状态标志位字段,各bit定义如下:
| Bit位 | 名称 | 说明 | 取值 |
|---|---|---|---|
| bit 0 | 保留 | 保留位 | - |
| bit 1 | has_new_event | 有新事件记录 | 0=无新事件1=有新事件待上报 |
| bit 2~7 | 保留 | 保留位 | - |
网关事件读取
当网关扫描到门锁的128位UUID广播时,会检查字节12的bit 1:
- 若
(uuid[11] & 0x02) >> 1 == 1,表示门锁有新的事件记录 - 网关将主动连接门锁并读取事件记录,然后上报到业务系统
示例解析
设备MAC地址: b1:09:2b:8c:47:c8
UUID: 01758824-660f-c847-8c2b-09b104000101
↓ 拆解为字节序列(小端序)
01 01 00 04 B1 09 2B 8C 47 C8 0F 66 24 88 75 01
├─ [0]: 0x01 → 固定值
├─ [1]: 0x01 → 设备唤醒
├─ [2]: 0x00 → 未配对
├─ [3]: 0x04 → 长连接
├─ [4~9]: B1:09:2B:8C:47:C8 → MAC地址
├─ [10]: 0x0F → 恢复计数器=15
├─ [11]: 0x66 → 状态标志位(bit1=1,有新事件)
└─ [12~15]: 24 88 75 01 → 厂商标识(公版)APP扫描规范
扫描要求
- ✅ 扫描BLE设备,而非经典蓝牙(Classic Bluetooth)
- ✅ 使用UUID列表过滤(Complete List of Service UUIDs)
- ❌ 不使用服务数据过滤(Service Data: UUID + custom data)
- ❌ 不依赖设备名称过滤(如
TMH_、T9A_等前缀)
过滤规则
必须支持公版UUID并保留符合以下规则的设备:
| UUID格式 | 过滤规则 | 说明 |
|---|---|---|
| 32位UUID | 0x75XXXXXX | 保留字节4(MSB)为0x75的设备 |
| 128位UUID | 01758824-... | 保留字节[13]~[15]为24 88 75的设备 |
公版与厂商设备隔离
UUID前缀分配
为了区分不同厂商的设备,使用不同的UUID前缀:
| 厂商 | 32位前缀 | 128位前缀 | 规则 |
|---|---|---|---|
| 公版 | 0x75 | 0x24 0x88 0x75 0x01 | 基准值 |
| 芯连 | 0x76 | 0x24 0x88 0x76 0x01 | 公版+1 |
| 鑫泓佳 | 0x77 | 0x24 0x88 0x77 0x01 | 公版+2 |
兼容性说明
重要提示
- 已出厂设备: 广播公版UUID(
0x75),可被所有厂商APP添加 - 新生产设备: 必须广播各自厂商专属UUID,不再使用公版UUID
- APP扫描: 需同时保留公版和本厂商的设备
广播示例
实际案例
设备信息:
- 芯片: BK7258锁板
- MAC地址:
b1:09:2b:8c:47:c8 - 设备名称:
XB7_b1092b8c47c8
32位UUID广播
Complete List of 32-bit Service UUIDs: 0x750F0001
广播原始数据(HEX):
02 01 06 05 05 01 00 0F 75 11 09 58 42 37 5F 62
31 30 39 32 62 38 63 34 37 63 38 03 FF F0 05
(共31字节)UniApp扫描结果:
json
{
"deviceId": "C8:47:8C:2B:09:B1",
"name": "XB7_b1092b8c47c8",
"rssi": -44,
"advertisData": {},
"localName": "XB7_b1092b8c47c8",
"serviceUUIDs": [
"750F0001-0000-1000-8000-00805F9B34FB"
]
}128位UUID广播
Complete List of 128-bit Service UUIDs:
01758824-660f-c847-8c2b-09b104000101
广播原始数据(HEX):
02 01 06 11 07 01 00 00 04 B1 09 2B 8C 47 C8 0B
66 24 88 75 01 11 09 58 42 37 5F 62 31 30 39 32
62 38 63 34 37 63 38 03 FF F0 05
(共43字节)兼容性问题
BK7258方案下,使用128位UUID时:
- ❌ 安卓APP和小程序均无法扫描到设备
- ❓ iOS未测试
- ✅ 建议使用32位UUID以确保兼容性
数据包结构说明
广播数据包格式
BLE广播数据包采用Length-Type-Value(LTV)格式:
[Length][AD Type][AD Data]
1B 1B 变长常见AD Type:
| AD Type | 名称 | 说明 |
|---|---|---|
0x01 | Flags | 设备类型标志 |
0x05 | Complete List of 32-bit Service UUIDs | 完整32位UUID列表 |
0x07 | Complete List of 128-bit Service UUIDs | 完整128位UUID列表 |
0x09 | Complete Local Name | 完整设备名称 |
0xFF | Manufacturer Specific Data | 厂商自定义数据 |
32位广播数据包解析
02 01 06 ← Flags: 0x06(LE General Discoverable, BR/EDR Not Supported)
05 05 01000F75 ← 32-bit UUID: 0x750F0001
11 09 584237... ← Local Name: "XB7_b1092b8c47c8"
03 FF F005 ← Manufacturer Data