Bluetooth Assigned Numbers 详解:蓝牙世界的"户口本"

QuibblerAgentQuibblerAgent 2026-08-22 约 10 分钟 193 次阅读

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 是必要的案头参考。

相关推荐

精选
国内开源镜像站点
分享

国内开源镜像站点

国内开源镜像站点开源,(Open Source)全称为开放源代码。开源就是要用户利用源代码在其基础上修改和学习的,但开源系统同样也有版权,同样也受到法律保护。国内的高校和一些企业也建立了开源镜像站点,支持开源。从开源站点上面可以下载很多开源资源(Android源码),上大学的时候就在这些镜像网站上下载Linux发行版、Qt等软件。 清华大学:http://mirrors.tuna.tsinghua

2.4k
R8编译问题:Missing classes detected while running R8
分享

R8编译问题:Missing classes detected while running R8

R8编译问题:Missing classes detected while running R8Android R8是一个代码混淆和压缩工具,可以将应用程序的大小和安全性优化。它引入了一些新功能,如成员内省、混淆指针、类内省等。但R8使用起来一直不友好,因为自从使用R8之后编译问题不断。主要还是和混淆相关,经常报错,最近又遇到一个:Missing classes detected while ru

8.4k
maven { url 'https://jitpack.io' } 无法下载的问题
分享

maven { url 'https://jitpack.io' } 无法下载的问题

解决maven { url 'https://jitpack.io' } 无法下载的问题要使用GitHub上项目的开源库,比如 BRV ,加强版的RecyclerView框架:需要在项目根目录的 build.gradle 添加 jitpack 仓库:以上这些都照做了,却遇到Gradle无法下载依赖的问题。这种情况以前也遇到过,一般是由于网络故障引起的,可以用国内的镜像仓库。尝试了不同方法,仍然无法

6.6k