Bluetooth UUID 是 Bluetooth 中用于标识服务、特征、描述符和协议类型的唯一类型标识符;在 GATT 中,它告诉 client 某个 attribute 代表哪类 service、characteristic 或 descriptor。
核心问题
设备上的 handle 是局部索引,不同设备和固件版本可能不同。客户端需要一种跨设备、跨版本的稳定类型标识来知道“这是电池服务”“这是电量特征”“这是 CCCD 描述符”。Bluetooth UUID 解决的就是类型识别问题。
核心机制
Bluetooth 常见 UUID 有两类:
| UUID 类型 | 例子 | 用途 |
|---|---|---|
| 16-bit Assigned Number | 0x180F、0x2A19、0x2902 | Bluetooth SIG 标准服务、特征、描述符 |
| 128-bit Vendor UUID | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 厂商自定义服务或数据类型 |
Bluetooth 有一个 base UUID:
00000000-0000-1000-8000-00805F9B34FB16-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。