Skip to content

蓝牙广播

本文档说明蓝牙低功耗(BLE)设备的广播格式、UUID结构以及APP扫描规范。

广播类型

本项目使用BLE广播来发送设备信息,支持两种UUID格式:

UUID格式广播类型特点长度
32位UUIDLegacy广播(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 1has_new_event有新事件记录0=无新事件
1=有新事件待上报
bit 2~7保留保留位-

字节2 [1] - status_flags_2:

Bit位名称说明取值
bit 0pair_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 1has_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位UUID0x75XXXXXX保留字节4(MSB)为0x75的设备
128位UUID01758824-...保留字节[13]~[15]为24 88 75的设备

公版与厂商设备隔离

UUID前缀分配

为了区分不同厂商的设备,使用不同的UUID前缀:

厂商32位前缀128位前缀规则
公版0x750x24 0x88 0x75 0x01基准值
芯连0x760x24 0x88 0x76 0x01公版+1
鑫泓佳0x770x24 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名称说明
0x01Flags设备类型标志
0x05Complete List of 32-bit Service UUIDs完整32位UUID列表
0x07Complete List of 128-bit Service UUIDs完整128位UUID列表
0x09Complete Local Name完整设备名称
0xFFManufacturer 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

鑫泓佳智能硬件通信协议文档