Bluetooth Assigned Numbers 详解:蓝牙世界的"户口本"
做过蓝牙开发的人几乎都遇到过同一个问题:某个 16-bit 的 Service UUID、某个厂商 ID、某个 GATT 单位码,到底代表什么?这些答案全部收录在蓝牙技术联盟(Bluetooth SIG)官方维护的一份文档里——Assigned_Numbers.pdf。它与其发布方 bluetooth.com 一起,构成了蓝牙生态最底层的编号秩序。本文从文档定位、核心内容、使用场景到注册流程,完整拆解。
1、背景概述
蓝牙(Bluetooth)是由 Bluetooth SIG(Special Interest Group,特别兴趣小组)制定并维护的短距离无线通信标准。SIG 成立于 1998 年,由爱立信、诺基亚、英特尔、IBM、东芝联合发起,如今成员超过 4 万家,官网即 bluetooth.com。
为什么需要 Assigned Numbers:
- 蓝牙协议中大量字段是 16-bit / 32-bit 数字(UUID、公司 ID、特性码),裸数字无语义
- 为保证全球互操作性,这些编号必须由 SIG 统一分配、避免冲突
- Assigned Numbers 就是这份"中央注册表",随规范演进持续更新
- 文档免费公开,PDF 与 HTML 版本均可下载
2、文档定位与版本
Assigned Numbers 不是一份独立协议,而是 Core Specification 的配套参考文档,属于"规范体系的附录层"。它由 SIG 不定期更新——每当有新公司注册 Company ID、新服务被采纳,都会发布新版本。
版本要点:
1. 文档版本与 Core Spec 版本(如 5.4、6.0)解耦,按需独立发版
2. 每版首页标注发布日期与版权,正文按编号类型分章节
3. 官方下载入口在 bluetooth.com 的 Specifications 页面,PDF / HTML 双格式
4. 除 Assigned Numbers 外,同层文档还有 GATT Specification Supplement(特性细节)
3、核心内容:都在登记什么
文档正文按"编号类型"分章,覆盖蓝牙协议栈各层的标识符。开发者最常查的是以下几类。
常用章节一览:
- Bluetooth UUID:16-bit 短码对应的服务(Service)与特性(Characteristic),如 0x180F 电量服务、0x2A19 电量特性
- Company Identifier:厂商识别码,广播包 Manufacturer Specific Data 的头两个字节,如 0x004C = Apple、0x000F = Nordic
- ATT Opcode / 错误码:ATT 层操作码,如 0x01 Error Response
- Appearance:设备外观值,影响手机图标显示(手表、心率带、耳机……)
- Units:GATT 数值的计量单位码(摄氏度、百分比、瓦特等)
- SDP / L2CAP / HCI 层各类协议参数与 PSM 编号
查阅要点:
1. UUID 章节分 Service 与 Characteristic 两张表,均按 16-bit 值升序排列
2. Company ID 表数千行,建议用 PDF 搜索直接查公司名或十六进制值
3. 表中 Vendor Specific 条目表示该编号由厂商自定义使用,不在官方语义内
4、与 128-bit UUID 的关系
BLE 中完整的 Service / Characteristic UUID 是 128-bit,但 SIG 采纳的标准服务可用 16-bit 短码表示,两者通过"基础 UUID"换算互通。这也是文档中 UUID 表能保持简洁的原因。
// 16-bit 短码换算为 128-bit 完整 UUID
// 基础 UUID(固定):0000xxxx-0000-1000-8000-00805F9B34FB
short uuid16 = (short) 0x180F; // Battery Service
long msb = 0x0000180F00001000L; // 高 64 位,嵌入短码
long lsb = (long) 0x800000805F9B34FBL; // 低 64 位
UUID uuid = new UUID(msb, lsb);
// 结果:0000180f-0000-1000-8000-00805f9b34fb换算要点:
1. 所有 SIG 标准 UUID 共享同一基础 UUID,仅前 4 位十六进制不同
2. Android 端可用 UUID.fromString 直接得到等价对象
3. 自定义服务(非 SIG 采纳)必须使用随机生成的完整 128-bit UUID,不能占短码
5、典型使用场景
在真实开发与逆向分析中,Assigned Numbers 是高频工具书。
常见场景:
- BLE 应用开发:连接后按标准 UUID 读取电量(0x2A19)、心率(0x2A37)等数据
- 广播包解析:iBeacon / Eddystone 的 Manufacturer Data 依 Company ID 区分(Apple 0x004C、Google 0x00E0)
- 抓包分析:Wireshark 解析 bthci / btatt 报文时,编号名称即来自此文档
- 固件开发:Zephyr、Nordic SDK 中的标准服务宏(BT_UUID_BAS)均与文档对齐
- 安全研究:通过 Company ID 与服务指纹识别设备厂商与型号
实操建议:
1. 下载 PDF 存本地,用十六进制值直接全文搜索最快
2. 写解析器时把常用 UUID 表抽成常量类,避免硬编码裸数字
3. 文档更新频繁,引用时注明所看版本的发布日期
6、如何注册自己的编号
如果公司要在广播中携带厂商数据,或让产品被正确识别,需要向 SIG 申请编号。
注册路径:
1. 加入 SIG 会员(Adopter 级别免费)
2. Company ID:随产品 Listing(资格认证)流程分配,每个成员公司一个
3. 自定义 UUID:无需注册,随机生成 128-bit 并自行保证唯一性即可
4. Vendor Specific 通告格式:提交申请后进入文档附录
注意事项:
1. 16-bit 短码只授予被 SIG 正式采纳的标准服务,个人 / 公司无申请通道
2. 未经认证使用蓝牙商标与协议栈有合规风险,量产前完成 Listing
3. Company ID 表可通过 SIG 网站在线查询,比 PDF 更新更快
7、总结
Assigned Numbers 是蓝牙生态的"中央注册表":UUID 短码、Company ID、Appearance、单位码等所有跨厂商通用标识,全部由 Bluetooth SIG 统一登记并免费公开。它与 Core Specification、GATT Specification Supplement 共同构成蓝牙规范的完整体系;对开发者而言,它是读广播、连设备、抓包分析时最常翻的一本工具书。
落地建议:做 BLE 开发先把这份 PDF 下载到本地,把常用 UUID 换算关系(基础 UUID + 16-bit 短码)搞透;抓包与逆向时以 Company ID 和 Service 指纹快速定位设备身份;产品出海前完成 SIG 认证并拿到自己的 Company ID。对于任何与蓝牙互操作打交道的工程师,Assigned Numbers 是必要的案头参考。
