Bluetooth UUID 是 Bluetooth 中用于标识服务、特征、描述符和协议类型的唯一类型标识符;在 GATT 中,它告诉 client 某个 attribute 代表哪类 service、characteristic 或 descriptor。

核心问题

设备上的 handle 是局部索引,不同设备和固件版本可能不同。客户端需要一种跨设备、跨版本的稳定类型标识来知道“这是电池服务”“这是电量特征”“这是 CCCD 描述符”。Bluetooth UUID 解决的就是类型识别问题。

核心机制

Bluetooth 常见 UUID 有两类:

UUID 类型例子用途
16-bit Assigned Number0x180F0x2A190x2902Bluetooth SIG 标准服务、特征、描述符
128-bit Vendor UUIDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx厂商自定义服务或数据类型

Bluetooth 有一个 base UUID:

00000000-0000-1000-8000-00805F9B34FB

16-bit assigned number 会嵌入到 base UUID 中。例如:

0x180F -> 0000180F-0000-1000-8000-00805F9B34FB
0x2A19 -> 00002A19-0000-1000-8000-00805F9B34FB

这意味着标准 Battery Service 可以用短 UUID 0x180F 表示,也可以扩展成完整 128-bit 形式;两者表达的是同一个 Bluetooth 类型。厂商自定义服务通常应使用独立 128-bit UUID,避免撞到 SIG assigned numbers。

工程用途

  • 在广播包中声明设备可能支持的服务类型。
  • 在 GATT discovery 中识别 service、characteristic 和 descriptor。
  • 在 App 或网关中按 UUID 选择要读写或订阅的数据。
  • 为自定义设备协议划分 vendor service 和 characteristic。

边界与常见坑

  • UUID 不是设备实例 ID:它标识类型,不标识某台具体设备或某个具体 attribute 实例。
  • handle 不应代替 UUID:handle 可能变,UUID 才是发现和解释数据的稳定入口。
  • 自定义服务不要乱用 16-bit UUID:16-bit assigned numbers 由 Bluetooth SIG 管理,私有协议应使用 128-bit vendor UUID。
  • 同一 UUID 可以出现多次:一个 server 可以有多个相同 service UUID 的实例,客户端仍要结合 handle range 和上下文处理。
  • UUID 只定义类型,不定义所有值编码:具体 characteristic value 的字节结构可能还需要 service spec 或 GATT Specification Supplement。

相关术语

外部参考