
这部分属于 GAP 规范中关于"用户界面表达"的说明,重点不是讲 BLE 空口通信流程,也不是讲 GAP 的广播、扫描、连接参数,而是在规定:
当蓝牙相关术语、参数、数值出现在用户能看到的地方时,应该使用什么样的通用表达方式。
一、原文大意翻译
3. User interface aspects
3. 用户界面方面
3.1. The user interface level
3.1 用户界面层级
在本规范的语境中,用户界面层级指的是用户在使用蓝牙设备时,会看到蓝牙术语、参数名称、参数值、数字表示方式的地方。
这些地方包括但不限于:
- 显示屏
- 对话框
- 用户手册
- 包装
- 广告宣传材料
- 其他用户能接触到的展示位置
本 Profile 规定了在用户界面层级上应该使用的通用术语。
二、这段话想表达什么?
它想表达的是:
GAP 不只是规定设备之间怎么发现、怎么连接、怎么广播,它还规定了一些蓝牙相关信息在"用户可见层面"应该如何表达。
也就是说,蓝牙规范不仅关心底层通信,也关心用户看到的名称、参数、术语是否统一。
比如用户在 App、系统设置、产品说明书、包装盒上看到:
- Bluetooth
- Bluetooth device
- discoverable
- connectable
- pairing
- bonded
- device name
- passkey
- PIN
- address
这些词应该怎么写、怎么显示、怎么解释,规范会给出通用要求。
三、关键信息
1. "user interface level" 不是指 App 的 UI 层代码
这里的 user interface level 不要理解成 iOS / Android App 开发里的 View 层、Controller 层、界面层代码。
它在规范里的意思是:
凡是用户能看到蓝牙相关信息的地方,都属于 user interface level。
所以它包括 App 界面,但不只包括 App 界面。
例如:
手机蓝牙设置页面
蓝牙耳机说明书
蓝牙模块包装盒
设备屏幕上的蓝牙状态提示
App 扫描到设备后显示的设备名称
配对弹窗
产品广告中的蓝牙功能描述
这些都属于规范这里说的用户界面层级。
2. 这部分主要关注"术语统一"
这段话最后一句很关键:
This profile specifies the generic terms that should be used on the user interface level.
意思是:
GAP 会规定在用户界面层级应该使用哪些通用术语。
也就是说,后面的内容很可能会告诉你:
- 某个蓝牙概念在用户界面上应该叫什么
- 某些术语应该避免混乱
- 不同蓝牙设备在展示名称、状态、参数时应该保持一致
- 用户看到的表达应尽量符合蓝牙规范的通用说法
这对底层协议理解不是最核心的,但对做蓝牙 App、产品说明、调试工具界面很有价值。
3. 它强调的是"用户看到的名称、值、数字表示"
原文中提到:
names, values, and numeric representations
这三个词很重要。
分别表示:
names:名称
例如:
Bluetooth device name
Local Name
Device Name
在 App 或文档中应该怎么叫,不能随便乱写。
比如 BLE 广播数据里面可能有:
Complete Local Name
Shortened Local Name
App 展示时就要注意这是"广播中的本地名称",不一定等同于系统缓存的设备名称,也不一定等同于 GATT Device Name Characteristic。
values:值
例如某些状态值:
discoverable
connectable
bonded
paired
用户界面上应该用清晰、统一的方式表达。
比如一个设备当前是否可被发现、是否可连接、是否已经配对,这些状态展示给用户时不能乱用术语。
numeric representations:数字表示方式
例如:
Bluetooth address
UUID
Appearance value
Class of Device
Company Identifier
这些数字在用户界面上怎么显示,也会涉及规范表达。
比如 BLE 地址通常是 48 bit,常见显示方式是:
AA:BB:CC:DD:EE:FF
UUID 可能是 16-bit、32-bit、128-bit,不同场景显示方式也要注意。
四、对学习 BLE 的具体提醒
这部分可以这样理解:
它不是 BLE 通信机制的核心章节,但它是做蓝牙 App、蓝牙调试工具、蓝牙产品说明时非常有用的规范内容。
如果你的目标是理解 BLE 的广播、扫描、连接、GATT 通讯,那么这一节不需要花太多时间深挖。
但是你做蓝牙 App,尤其是类似 nRF Connect、LightBlue 这种工具类 App,就很值得关注。
因为你的 App 里会大量展示:
设备名称
设备地址
广播数据
RSSI
Tx Power
UUID
Service
Characteristic
Descriptor
Notify
Indicate
Read
Write
Pairing
Bonding
Connection
Advertising
Scanning
这些内容展示给用户时,如果术语不规范,容易造成误解。

这部分讲的是 Bluetooth Device Address(蓝牙设备地址,BD_ADDR)在用户界面上应该怎么称呼、怎么显示。
它不是在重点讲地址分类,而是在讲:
当蓝牙地址出现在用户能看到的地方时,应该用什么名称,以及应该用什么格式展示。
一、原文大意翻译
3.2 Bluetooth 参数的表示方式
3.2.1 Bluetooth Device Address,BD_ADDR
3.2.1.1 定义
BD_ADDR 是蓝牙设备使用的地址,具体定义见 Section 15.1。
在设备发现过程中,可以从远端设备那里接收到这个地址。
3.2.1.2 用户界面层级上的术语
当在 UI 层面提到 Bluetooth address 时,应该使用术语:
Bluetooth Device Address
也就是:
蓝牙设备地址
3.2.1.3 表示方式
在 Baseband 层面,BD_ADDR 表示为 48 bit。
在 Link Layer 层面,Public Device Address 和 Random Device Address 也都表示为 48-bit address。
在 UI 层面,Bluetooth address 应该表示为 12 个十六进制字符 ,可以选择用冒号 : 分成几个部分。
例如:
000C3E3A4B69
或者:
00:0C:3E:3A:4B:69
在 UI 层面,任何数字都应该按照 MSB → LSB 的自然顺序显示,也就是从左到右显示高位到低位。
二、这部分想表达什么?
这部分主要想表达 3 件事:
第一,蓝牙设备地址在规范中的正式术语是:
Bluetooth Device Address
第二,蓝牙设备地址本质上是一个:
48-bit address
第三,如果要在 App、说明书、界面、日志、包装、广告中显示蓝牙地址,推荐显示成:
00:0C:3E:3A:4B:69
或者:
000C3E3A4B69
而不是随便换顺序、随便加分隔符、或者用低位在前的方式展示。
三、关键信息 1:BD_ADDR 是什么?
BD_ADDR 的全称是:
Bluetooth Device Address
可以翻译为:
蓝牙设备地址
它是蓝牙设备用来标识自己的地址。
在设备发现过程中,本地设备可以从远端设备那里得到这个地址。
比如你的手机作为中心设备扫描 BLE 外设时,扫描结果里通常会包含类似这样的地址:
DC:0D:30:00:06:F6
这个地址就是远端设备在广播/发现过程中暴露出来的设备地址。
不过要注意:
在 BLE 里面,不要简单粗暴地把它都叫成"MAC 地址"。
更规范的说法应该是:
Bluetooth Device Address
或者:
Device Address
因为 BLE 地址还涉及地址类型,例如:
Public Device Address
Random Device Address
Resolvable Private Address
Non-resolvable Private Address
Static Random Address
所以只看到一个地址值还不够,很多时候还要结合 Address Type 一起看。
四、关键信息 2:UI 上应该叫 Bluetooth Device Address
这一句很关键:
When the Bluetooth address is referred to on the UI level, the term 'Bluetooth Device Address' should be used.
意思是:
在用户界面层面,如果你要提到蓝牙地址,推荐使用:
Bluetooth Device Address
而不是只写:
Bluetooth Address
MAC Address
Device MAC
BLE MAC
当然,在实际 App 里,很多用户更熟悉"MAC 地址"这个说法,所以可以根据产品面向的人群调整。
如果是面向普通用户,可以写:
蓝牙地址
如果是面向开发者或调试工具,可以写得更规范一些:
Bluetooth Device Address
Device Address
Address + Address Type
如果是 BLE 调试工具类 App,我更建议界面上拆成:
Address: DD:2D:31:00:06:F6
Address Type: Random / Public
这样比单独显示一个"MAC 地址"更严谨。
五、关键信息 3:BD_ADDR 是 48 bit
规范明确说:
BD_ADDR is represented as 48 bits
也就是说,蓝牙设备地址长度是:
48 bit = 6 byte
因为 1 byte = 8 bit,所以:
6 byte × 8 bit = 48 bit
而一个 byte 用两个十六进制字符表示,所以 6 个 byte 就是:
12 个十六进制字符
例如:
00:0C:3E:3A:4B:69
拆开来看:
00 0C 3E 3A 4B 69
1字节 1字节 1字节 1字节 1字节 1字节
一共 6 个字节,也就是 48 bit。
六、关键信息 4:UI 上用 12 个十六进制字符显示
规范说 UI 层面应该显示成:
12 hexadecimal characters
也就是 12 个十六进制字符。
可以不加冒号:
000C3E3A4B69
也可以加冒号:
00:0C:3E:3A:4B:69
实际开发中,冒号分隔的方式更常见,也更易读。
所以在 App 界面、日志、文档中更推荐:
00:0C:3E:3A:4B:69
而不是:
000C3E3A4B69
后者虽然符合规范,但阅读体验差一些。
七、关键信息 5:显示顺序是 MSB → LSB
这一句很重要:
On the UI level any number shall have the MSB → LSB natural ordering.
意思是:
在用户界面上,数字应该按照自然顺序显示,也就是:
最高有效位 MSB 在左边
最低有效位 LSB 在右边
例如:
00:0C:3E:3A:4B:69
这里左边的 00 是更高位,右边的 69 是更低位。
这和底层协议、内存存储、HCI 数据包里的字节顺序可能不是一回事。
你要特别注意:
规范这里说的是 UI 显示顺序,不一定等同于底层传输顺序。
也就是说,用户界面上看到的是:
00:0C:3E:3A:4B:69
但是在某些底层数据包、HCI Event、控制器返回数据中,可能会看到字节顺序是反过来的,例如:
69 4B 3A 3E 0C 00
这不是地址变了,而是底层数据的字节序和 UI 展示习惯不同。
八、结合 BLE 开发怎么理解?
对于做 BLE App 开发来说,这部分最有用的地方是:
1. App 展示地址时,尽量使用规范格式
例如扫描结果列表中显示:
Name: TWS876
Address: DD:2D:31:00:06:F6
Address Type: Random
RSSI: -63 dBm
这样比下面这种更清楚:
MAC: DC0D300006F6
尤其是 BLE 里面有随机地址、私有地址、可解析私有地址等概念,只写 MAC 容易让人误以为这是一个固定不变的硬件地址。
2. 不要只保存 Address Value,最好同时保存 Address Type
在 BLE 中,地址值本身不一定足够。
例如:
Address: DD:2D:31:00:06:F6
Address Type: Public
和:
Address: DD:2D:31:00:06:F6
Address Type: Random
它们在规范语义上不是完全一样的。
所以更规范的设备标识信息应该包含:
Address Value + Address Type
这也是你之前总结"BLE 地址不是只有一个固定类型,而是要同时看 Address Value + Address Type"的原因。
这个理解是对的。
3. HCI 日志里看到的地址顺序,可能和 UI 显示相反
你用 ATS 查看 btsnoop 日志时,可能会看到 HCI Event 里地址字段是类似这样的:
F6 06 00 30 0D DC
但是 App 或系统 UI 里显示成:
DD:2D:31:00:06:F6
这时候不要以为是两个地址。
这是因为:
HCI 数据中的字段顺序
和:
UI 层面自然显示顺序
可能不同。
所以分析日志时,看到地址字段一定要结合具体协议字段说明,看它是按什么字节序放置的。
九、这一节你应该怎么记?
可以直接记成下面这几句话:
BD_ADDR 是 Bluetooth Device Address,也就是蓝牙设备地址。
在 UI 层面,规范建议使用 Bluetooth Device Address 这个术语。
蓝牙设备地址是 48 bit,也就是 6 字节。
UI 上应该显示为 12 个十六进制字符,可以写成 000C3E3A4B69,也可以写成 00:0C:3E:3A:4B:69。
UI 显示时采用 MSB → LSB 的自然顺序,也就是高位在左、低位在右。
BLE 开发中不要只看地址值,还要结合 Address Type 一起判断。
十、对当前学习 BLE 的提醒
这部分内容虽然属于 GAP,但它更偏向 显示规范,不是 BLE 通信流程的核心。
不过它对做 App 非常实用,因为做蓝牙 App 时经常要展示:
设备名称
设备地址
地址类型
广播数据
RSSI
Tx Power
Service UUID
Characteristic UUID
其中设备地址是最容易被写错、理解错的内容之一。
重点记住两点就够了:
1. UI 上显示蓝牙地址,推荐用 12 位十六进制字符,常见格式是 XX:XX:XX:XX:XX:XX。
2. BLE 中更严谨的说法不是单独的"MAC 地址",而是 Device Address,并且要结合 Address Type 理解。

这部分讲的是 Bluetooth Device Name(蓝牙设备名称),也就是用户平时在手机蓝牙列表、App 扫描列表、设备说明中看到的那个"人类容易识别的名字"。
它的重点不是广播数据里的 Local Name,而是更通用地规定:
蓝牙设备应该有一个用户友好的设备名称,并且在 UI 层面应该称为 Bluetooth Device Name。
一、原文大意翻译
3.2.2 Bluetooth Device Name
蓝牙设备名称,也就是用户友好的名称
3.2.2.1 Definition
定义
Bluetooth Device Name 是蓝牙设备暴露给远端设备的用户友好名称。
对于 只支持 BR/EDR 的实现 ,这个名称是在收到 LMP_NAME_REQ 请求后,通过 LMP_NAME_RES 返回的字符串。
对于 只支持 LE 的实现 ,这个名称保存在 Device Name Characteristic 中,也就是 GATT 的 Device Name 特征值。
3.2.2.1.1 Bluetooth Device Name in a BR/EDR/LE implementation
BR/EDR/LE 双模实现中的蓝牙设备名称
一个同时支持 BR/EDR 和 LE 的设备,应该只有一个 Bluetooth Device Name。
这个名称不应该因为使用不同物理信道进行名称发现而不同。
也就是说:
- 通过 BR/EDR 查到的名称
- 通过 LE 查到的名称
应该是同一个名字。
对于 BR/EDR 物理信道,名称通过 LMP_NAME_RES 获得。
对于 LE 物理信道,名称可以通过读取 Device Name Characteristic 获得。
注意:如果本地设备支持 ATT over BR/EDR,那么远端设备也可以通过 ATT over BR/EDR 读取本地设备的 Device Name Characteristic。
3.2.2.2 Term on user interface level
用户界面层级上的术语
当在 UI 层面提到 Bluetooth Device Name 时,应该使用术语:
Bluetooth Device Name
也就是:
蓝牙设备名称
3.2.2.3 Representation
表示方式
Bluetooth Device Name 最多可以是 248 字节。
它应该使用 UTF-8 编码。
因此,如果名称中使用了超出 U+0000 到 U+007F 范围的字符,那么在 UI 层面输入的名称可能会被限制到最少 62 个字符。
一个设备不能假设普通远端设备一定能处理超过 Bluetooth Device Name 前 40 个字符 的内容。
如果远端设备显示能力有限,它可能只使用前 20 个字符。
二、这部分想表达什么?
这部分主要表达的是:
Bluetooth Device Name 是蓝牙设备暴露给其他设备看的"用户友好名称",不同类型的蓝牙实现获取这个名称的方式不同,但 UI 层面应该统一称为 Bluetooth Device Name。
对于 BLE 学习来说,你要重点理解:
Bluetooth Device Name 不是一个随便显示的名字;
它在规范中有明确来源、编码方式和长度限制。
尤其是 BLE 开发中,很多人会把几个"名字"混在一起:
广播数据里的 Local Name
GATT 里面的 Device Name Characteristic
手机系统缓存的 peripheral.name
App 扫描列表里显示的 name
这几个东西有关联,但不一定完全等同。
三、关键信息 1:Bluetooth Device Name 是"用户友好的名称"
原文说:
the user-friendly name that a Bluetooth device exposes to remote devices
意思是:
Bluetooth Device Name 是设备暴露给远端设备的、便于用户识别的名称。
例如:
AirPods Pro
BLE Sensor
Heart Rate Monitor
My Keyboard
这些都属于用户容易理解的名字。
它和设备地址不同。
设备地址类似:
DB:3C:19:00:06:F6
这个是机器识别更方便。
设备名称类似:
TWS876
这个是人识别更方便。
所以可以这样理解:
Bluetooth Device Address:设备的地址,偏机器识别
Bluetooth Device Name:设备的名称,偏用户识别
四、关键信息 2:BR/EDR-only 和 LE-only 获取名称的方式不同
规范分别说了两种情况。
1. BR/EDR-only 实现
对于经典蓝牙 BR/EDR-only 设备,名称通过:
LMP_NAME_REQ
LMP_NAME_RES
获得。
也就是说,本地设备向远端设备请求名称,远端设备通过 LMP_NAME_RES 返回名称字符串。
这是经典蓝牙链路层/基带相关的名称发现方式。
2. LE-only 实现
对于 BLE-only 设备,名称保存在:
Device Name Characteristic
也就是 GATT 的 Device Name 特征值 中。
它属于 GAP Service 里的一个 Characteristic。
常见 UUID 是:
GAP Service UUID: 0x1800
Device Name UUID: 0x2A00
Appearance UUID: 0x2A01
所以对于 BLE 来说,规范意义上的 Bluetooth Device Name 可以通过读取:
Generic Access Service / Device Name Characteristic
获得。
也就是:
Service: 0x1800
Characteristic: 0x2A00
五、关键信息 3:双模设备应该只有一个 Bluetooth Device Name
这句话很重要:
A BR/EDR/LE implementation shall have a single Bluetooth Device Name
意思是:
如果一个设备同时支持经典蓝牙和 BLE,那么它应该只有一个 Bluetooth Device Name。
不能出现:
经典蓝牙名称:TWS876-SPP
BLE 名称:TWS876-BLE
从规范要求看,双模设备的 Bluetooth Device Name 应该保持一致。
也就是说,无论通过 BR/EDR 物理信道还是 LE 物理信道进行名称发现,发现到的 Bluetooth Device Name 应该是同一个。
不过在实际产品中,很多厂商可能会在广播 Local Name、系统显示名称、GATT Device Name 中使用不同名字,这就会造成 App 侧看到的名称不一致。
所以你在实际开发中要区分:
规范意义上的 Bluetooth Device Name
实际广播包里的 Local Name
系统扫描回调里的 name
GATT 0x2A00 读取到的 Device Name
六、关键信息 4:UI 层面应该叫 Bluetooth Device Name
规范明确说:
当 UI 层面提到这个名称时,应该使用:
Bluetooth Device Name
中文可以翻译为:
蓝牙设备名称
如果你做蓝牙调试工具 App,可以这样显示:
Bluetooth Device Name: TWS876
或者中文界面:
蓝牙设备名称:TWS876
但如果你要做得更严谨,尤其是在 BLE 扫描结果中,建议区分不同来源:
Local Name: TWS876
Device Name: TWS876
System Name: TWS876
因为扫描阶段拿到的名称,通常可能来自广播数据或扫描响应数据中的 Local Name,而不一定是通过 GATT 读取到的 Device Name Characteristic。
七、关键信息 5:Bluetooth Device Name 最多 248 字节
规范说:
The Bluetooth Device Name can be up to 248 bytes
也就是说,Bluetooth Device Name 最大长度是:
248 bytes
注意,这里是 字节 bytes,不是字符 characters。
这点很关键。
因为它使用 UTF-8 编码,不同字符占用的字节数不同。
例如:
A
通常占 1 个字节。
蓝
通常占 3 个字节。
某些 emoji 可能占 4 个字节。
所以不能简单理解成"最多 248 个字符"。
更准确地说:
最多 248 字节,具体能输入多少个字符取决于字符编码后占几个字节。
八、关键信息 6:Bluetooth Device Name 使用 UTF-8 编码
规范说:
It shall be encoded according to UTF-8
也就是:
Bluetooth Device Name 必须按照 UTF-8 编码。
这意味着它理论上可以支持非英文字符,例如中文、日文、韩文等。
例如:
蓝牙温度计
智能手环
键盘
但是,由于 UTF-8 中中文字符通常占 3 个字节,所以可用字符数会减少。
例如:
蓝牙温度计
5 个中文字符,通常占 15 字节。
九、为什么原文说可能少到 62 个字符?
原文说:
therefore the name entered on the UI level may be restricted to as few as 62 characters if codepoints outside the range U+0000 to U+007F are used
意思是:
如果使用了超出 U+0000 到 U+007F 范围的字符,UI 层面输入的名称可能会被限制到最少 62 个字符。
原因是:
U+0000到U+007F基本对应 ASCII 范围- ASCII 字符在 UTF-8 中通常占 1 字节
- 超出这个范围的字符可能占多个字节
- 某些 Unicode 字符在 UTF-8 中最多可能占 4 字节
所以:
248 bytes ÷ 4 bytes = 62 characters
这就是 62 个字符的来源。
也就是说,如果 UI 要保证任何 Unicode 字符都能输入,那么为了不超过 248 字节,可能要限制到 62 个字符。
十、关键信息 7:远端设备不一定能处理完整名称
规范最后两句话非常实用:
A device cannot expect that a general remote device is able to handle more than the first 40 characters of the Bluetooth Device Name.
意思是:
一个设备不能假设普通远端设备一定能处理 Bluetooth Device Name 的前 40 个字符之后的内容。
也就是说,虽然规范允许最多 248 字节,但你不能指望所有远端设备都能完整显示或处理这么长的名称。
后面又说:
If a remote device has limited display capabilities, it may use only the first 20 characters.
意思是:
如果远端设备显示能力有限,它可能只使用前 20 个字符。
这对产品命名很关键。
如果设备名称很长,比如:
MyDevice Bluetooth Low Energy Temperature Sensor Version 2026
有些设备或 App 可能只显示:
MyDevice Bluetooth
甚至更短。
因此,设备名称的关键信息应该尽量放在前面。
十一、结合 BLE App 开发怎么理解?
做 BLE App 时,这部分非常有价值。
因为 App 中经常会显示设备名称,但名称来源可能不止一种。
1. 广播数据中的 Local Name
BLE 广播包或扫描响应包中可以带:
Complete Local Name
Shortened Local Name
比如广播数据中可能有:
09 09 41 54 46 22 42 58 35 32 31
其中 09 是 AD Type,表示 Complete Local Name。
这个是广播/扫描响应里的 Local Name。
2. GATT 中的 Device Name Characteristic
连接设备后,可以读取:
Service UUID: 0x1800
Characteristic UUID: 0x2A00
得到 Device Name。
这个才是规范这里说的 LE-only 实现中持有的 Device Name Characteristic。
3. 系统 API 返回的 name
在 iOS / Android 中,扫描回调里可能也会返回设备名称。
但是这个名称可能来自:
广播数据
扫描响应数据
系统缓存
历史连接记录
GATT Device Name
不同平台、不同系统版本、不同设备行为可能有差异。
所以做调试工具类 App 时,建议不要只显示一个笼统的 name,而是尽量区分:
Advertised Local Name
GATT Device Name
System Device Name
这样用户更容易理解为什么有时"名称不一致"。
十二、这部分和广播 Local Name 的关系
这里要特别注意:
Bluetooth Device Name 不等于广播数据里的 Local Name,但两者通常会有关联。
广播数据中可以携带:
Shortened Local Name
Complete Local Name
它是广播数据的一部分,用于扫描阶段让中心设备看到一个名字。
而 Bluetooth Device Name 在 BLE-only 实现中,是 GAP Service 中 Device Name Characteristic 的值。
理想情况下,它们应该一致。
但实际中可能出现:
广播 Local Name: TWS876
GATT Device Name: nRF BLE Module
系统显示 Name: nRF-TWS876
所以在分析问题时,要问清楚:
你说的"设备名称",是扫描广播里解析出来的 Local Name?
还是连接后读取 0x2A00 得到的 Device Name?
还是手机系统 API 返回的 name?
这个区分非常重要。
十三、这一节应该怎么记?
可以直接记成下面这些话:
Bluetooth Device Name 是蓝牙设备暴露给远端设备的用户友好名称。
在 UI 层面,规范建议使用 Bluetooth Device Name 这个术语。
对于 BR/EDR-only 设备,名称通过 LMP_NAME_REQ / LMP_NAME_RES 获取。
对于 LE-only 设备,名称保存在 GAP Service 的 Device Name Characteristic 中,也就是 0x1800 服务下的 0x2A00 特征。
对于 BR/EDR/LE 双模设备,应该只有一个统一的 Bluetooth Device Name,不应该因为经典蓝牙和 BLE 通道不同而显示不同名称。
Bluetooth Device Name 最多 248 字节,使用 UTF-8 编码。
由于 UTF-8 中非 ASCII 字符可能占多个字节,所以 248 字节不等于 248 个字符。
普通远端设备不一定能处理超过前 40 个字符的名称,显示能力有限的设备可能只使用前 20 个字符。
因此设备名称不要太长,关键信息应该尽量放在前面。
十四、对当前学习 BLE 的提醒
这部分虽然在 GAP 里,但它对做 BLE App 很实用。
重点不是记 BR/EDR 的 LMP_NAME_REQ 和 LMP_NAME_RES,那是经典蓝牙相关内容,可以先不用深挖。
应该重点记 BLE 相关的 3 点:
1. LE-only 设备的 Bluetooth Device Name 来自 Device Name Characteristic,也就是 GAP Service 0x1800 里的 0x2A00。
2. 扫描阶段看到的 Local Name 和连接后读取的 Device Name Characteristic,不一定完全一样。
3. 设备名称是 UTF-8 编码,最大 248 字节,但实际产品命名要尽量短,前 20~40 个字符最好能表达核心信息。
对于现在理解 BLE 来说,这一节可以不用死磕,但是要建立一个很重要的概念:
"设备名称"不是一个单一来源的东西。
BLE 开发中要区分:广播名称、GATT Device Name、系统缓存名称、UI 显示名称。

这部分讲的是 Bluetooth Passkey(蓝牙配对码 / 蓝牙 PIN) 在配对过程中的作用、在 UI 上应该怎么叫、以及它的表示方式。
它的核心不是讲完整的蓝牙安全机制,而是规定:
蓝牙配对过程中用于认证的 PIN / Passkey,在用户界面上应该统一称为 Bluetooth Passkey,并说明不同配对机制下 Passkey/PIN 的格式限制。
一、这部分想表达什么?
这部分主要表达 4 件事:
- Bluetooth Passkey 可以用于两个蓝牙设备在配对时进行认证。
- 用户界面上不要叫 Bluetooth PIN,应该叫 Bluetooth Passkey。
- 在 Secure Simple Pairing / Security Manager 中,Bluetooth Passkey 是 6 位数字。
- 在 Legacy Pairing 中,PIN 的表示更复杂,可能是字符形式,也可能转换成底层使用的字节形式。
可以先简单理解成:
Bluetooth Passkey / Bluetooth PIN 都是配对认证时用到的"配对码"。
但在 UI 层面,规范推荐统一叫 Bluetooth Passkey。
对于现代 BLE 配对,通常看到的是 6 位数字 Passkey,例如 000000 ~ 999999。
对于传统 Legacy Pairing,PIN 可能涉及字符、编码、长度、字节转换等问题。
二、原文大意翻译
3.2.3 Bluetooth Passkey(Bluetooth PIN)
3.2.3.1 定义
Bluetooth Passkey 可以在配对过程中用于两个蓝牙设备之间的相互认证,也就是在创建共同链路密钥时使用。
Passkey 可以在配对过程中用于生成初始链路密钥。
PIN 可以由用户在 UI 层面输入,也可以预先存储在设备中。
例如,有些设备没有输入和显示数字的界面,这种设备可能会把 PIN 固定存储在设备内部。
3.2.3.2 用户界面层级上的术语
当在 UI 层面提到 Bluetooth PIN 时,应该使用术语:
Bluetooth Passkey
也就是:
蓝牙配对码
或者:
Bluetooth Passkey
3.2.3.3 表示方式
Bluetooth Passkey 有多种不同表示方式。
从高层来看,主要有两类:
1. 用于 Secure Simple Pairing 和 Security Manager 的表示方式
2. 用于 Legacy Pairing 的表示方式
在 Legacy Pairing 中,它通常被称为 Bluetooth PIN。
对于 Secure Simple Pairing 和 Security Manager,Bluetooth Passkey 是一个 6 位数字值。
它用整数表示,范围是:
0x00000000 ~ 0x000F423F
也就是十进制:
000000 ~ 999999
菜单值可以用作:
Authentication stage 1 的输入值
或者用作:
Security Manager 中的 TK 值
对于 Legacy Pairing,Bluetooth PIN 在不同层级有不同表示。
其中:
PINBB:Baseband 层使用
PINUI:用户界面层使用
PINBB 用于 Pairing 过程中的初始化密钥计算。
PINUI 是用户在 UI 上输入的 PIN 字符表示形式。
从 PINUI 转换到 PINBB 时,应按照 UTF-8 编码转换。
PINBB 最大可以是:
128 bit = 16 bytes
PIN code 最多可以是 16 个字符。
为了达到完整安全等级,所有 PIN 都应该是 16 个字符长。
可变 PIN 应该由 Basic Latin 范围内的字母数字字符组成,也就是 Unicode 范围:
U+0000 ~ U+007F
如果 PIN 中包含十进制数字,那么这些数字应该使用 Unicode Basic Latin 字符编码,也就是:
U+0030 ~ U+0039
为了兼容带数字键盘的设备,固定 PIN 应该只由十进制数字组成,可变 PIN 也应该只由十进制数字组成。
如果设备支持输入 Basic Latin 之外的字符,也可以使用其他 Unicode 字符,但不应该使用 Halfwidth and Fullwidth Forms 范围:
U+FF00 ~ U+FFEF
三、关键信息 1:Bluetooth Passkey 用于配对认证
原文说:
The Bluetooth Passkey may be used to authenticate two Bluetooth devices with each other during the creation of a mutual link key via the pairing procedure.
意思是:
Bluetooth Passkey 可以在配对过程中,用于两个蓝牙设备之间的认证。
通俗说,就是:
设备 A 和设备 B 要建立可信关系时,需要确认"你确实是我要配对的那个设备"。
这个确认过程里,可能会用到 Passkey。
例如手机连接某个蓝牙设备时,可能出现:
请输入配对码:123456
或者:
请确认另一台设备上显示的数字是否为 123456
这里的 123456 就属于 Passkey 相关内容。
四、关键信息 2:UI 上应该叫 Bluetooth Passkey,不建议叫 Bluetooth PIN
这一句很关键:
When the Bluetooth PIN is referred to on the UI level, the term 'Bluetooth Passkey' should be used.
意思是:
在用户界面上,如果要提到 Bluetooth PIN,应该使用:
Bluetooth Passkey
也就是说,规范更推荐在 UI 上叫:
蓝牙配对码
Bluetooth Passkey
而不是:
Bluetooth PIN
PIN code
PIN
当然,实际产品中很多系统和 App 仍然会说"PIN 码"或"配对码",这是历史习惯。
如果你做蓝牙 App,我建议中文界面写:
蓝牙配对码
英文界面写:
Bluetooth Passkey
如果面向开发者,也可以写成:
Bluetooth Passkey / PIN
这样兼顾规范术语和用户理解。
五、关键信息 3:Secure Simple Pairing / Security Manager 中是 6 位数字
这部分对 BLE 最重要。
原文说:
For Secure Simple Pairing and Security Manager, the Bluetooth Passkey is a 6-digit numeric value.
也就是:
对于 Secure Simple Pairing 和 Security Manager,Bluetooth Passkey 是一个 6 位数字值。
范围是:
000000 ~ 999999
规范里用十六进制写成:
0x00000000 ~ 0x000F423F
这里的 0x000F423F 换成十进制就是:
999999
所以 BLE 配对时经常看到的 6 位数字码,比如:
000000
123456
654321
999999
都属于这个范围。
六、关键信息 4:这个 6 位 Passkey 和 BLE Security Manager 有关
原文中提到:
Security Manager
TK value
这对 BLE 很关键。
在 BLE 里,配对、安全、加密相关流程主要由:
SMP:Security Manager Protocol
处理。
在 Legacy Pairing 阶段,可能会用到:
TK:Temporary Key,临时密钥
Passkey 可以作为 Security Manager 流程中的 TK 值参与后续密钥生成。
现在不需要立刻把 SMP 的所有细节啃完,但要知道:
BLE 里面看到的 6 位配对码,不只是 UI 上的数字,它会参与安全配对过程中的密钥生成或认证。
七、关键信息 5:Legacy Pairing 里的 PIN 更复杂
原文说:
For legacy pairing, the Bluetooth PIN has different representations on different levels.
意思是:
在 Legacy Pairing 中,Bluetooth PIN 在不同层级有不同表示。
主要有两个:
PINUI:用户界面层看到/输入的 PIN
PINBB:Baseband 层使用的 PIN
可以这样理解:
PINUI 是人输入的形式,比如 "1234" 或 "0196554200906493"。
PINBB 是底层计算配对初始化密钥时使用的字节序列。
二者之间需要转换,转换方式按:
UTF-8
八、关键信息 6:PINBB 最大 128 bit,也就是 16 字节
原文说:
PINBB may be 128 bits (16 bytes).
也就是说,Legacy Pairing 中底层使用的 PINBB 最大是:
128 bit = 16 bytes
这里要注意:
16 bytes 不一定等于 16 个字符
如果 PINUI 全是 ASCII 数字或英文字母,那么:
1 个字符 = 1 byte
所以最多可以是 16 个字符。
例如:
0196554200906493
这是 16 个数字字符,每个数字 1 字节,刚好 16 字节。
但如果包含非 ASCII 字符,比如:
Børnelitteratur
其中 ø 在 UTF-8 中占 2 个字节,所以虽然看起来字符数可能没有超过 16,但编码后字节数可能已经达到 16 字节。
九、关键信息 7:为了完整安全性,PIN 最好是 16 个字符
原文说:
In order to take advantage of the full level of security all PINs should be 16 characters long.
意思是:
为了利用完整的安全等级,PIN 应该是 16 个字符长。
这是 Legacy Pairing 时代的说法,主要是因为 PIN 会参与密钥计算,PIN 越短,被猜测或暴力破解的空间越小。
例如下面这种固定 PIN:
0000
1234
虽然兼容性好,但安全性很弱。
而 16 位 PIN:
0196554200906493
安全性更高。
不过在实际消费电子设备里,很多经典蓝牙设备为了方便,仍然使用:
0000
1234
8888
这就是典型的兼容性优先、安全性较弱的设计。
十、关键信息 8:固定 PIN 和可变 PIN 的推荐组成
规范提到两种 PIN:
Fixed PIN:固定 PIN
Variable PIN:可变 PIN
1. 固定 PIN
固定 PIN 是设备预置好的 PIN,例如:
0000
1234
8888
用户不能改,或者通常不需要输入复杂内容。
规范为了兼容带数字键盘的设备,建议固定 PIN 只由十进制数字组成。
也就是:
0 ~ 9
2. 可变 PIN
可变 PIN 是可以变化的 PIN,可能由用户输入或设备动态生成。
规范也建议为了兼容性,可变 PIN 也尽量只由十进制数字组成。
所以从实际产品角度看:
最兼容的 Passkey / PIN 形式就是纯数字。
这也是为什么蓝牙配对码常见形式是:
6 位数字
而不是复杂密码。
十一、关键信息 9:数字应该使用 Basic Latin 的数字字符
规范特别说:
如果 PIN 中包含十进制数字,这些数字应该使用 Unicode Basic Latin 字符编码:
U+0030 ~ U+0039
也就是普通 ASCII 数字:
0 1 2 3 4 5 6 7 8 9
不要使用其他看起来像数字的字符。
例如不要用全角数字:
123456
虽然肉眼看起来像数字,但它们不是 Basic Latin 范围内的数字字符。
这是为了避免兼容性问题。
十二、关键信息 10:不应该使用 Halfwidth and Fullwidth Forms
规范说:
不应该使用 Unicode 的 Halfwidth and Fullwidth Forms 范围:
U+FF00 ~ U+FFEF
原因是这些字符容易和普通 ASCII、日文片假名、韩文、标点符号等产生兼容性问题。
例如:
A
这是全角 A。
它看起来像:
A
但编码和码点完全不同。
同样:
1
这是全角数字 1。
它看起来像:
1
但不是同一个字符。
蓝牙 PIN / Passkey 涉及配对认证,不能出现"看起来一样、编码不一样"的情况,否则用户输入正确但设备不认,或者不同设备解析不一致。
十三、表格示例在说明什么?
截图中的表格给了两个例子。
示例 1
用户输入:
0196554200906493
对应 PINBB:
length = 16
value = 0x30 0x31 0x39 0x36 0x35 0x35 0x34 0x32 0x30 0x30 0x39 0x30 0x36 0x34 0x39 0x33
这里每个数字字符都是 ASCII 编码。
例如:
'0' -> 0x30
'1' -> 0x31
'9' -> 0x39
所以 16 个数字字符正好转换成 16 个字节。
示例 2
用户输入:
Børnelitteratur
对应 PINBB 长度也是 16。
原因是其中的 ø 不是 Basic Latin 字符,它在 UTF-8 中不是 1 个字节,而是 2 个字节:
ø -> 0xC3 0xB8
所以这个字符串虽然字符数少于或等于 16,但编码成 UTF-8 后占用 16 字节。
这个例子是为了说明:
PIN 的限制最终看的是字节长度,不只是字符数量。
十四、结合 BLE 开发怎么理解?
对于你现在学习 BLE,最应该关注的是 Secure Simple Pairing / Security Manager 这一块,而不是经典蓝牙 Legacy PIN 的所有细节。
你可以这样分层理解:
经典蓝牙 BR/EDR:
更容易遇到 PIN、0000、1234、LMP、Baseband 这些概念。
BLE:
主要关注 Security Manager、Pairing、Passkey、TK、LTK、加密、绑定等概念。
在 BLE App 开发中,你通常会遇到几种配对方式:
Just Works
Passkey Entry
Numeric Comparison
Out of Band
其中和这节最相关的是:
Passkey Entry
例如:
外设显示 123456,手机输入 123456
或者:
手机显示 123456,用户在外设上输入 123456
这就是典型的 Passkey 参与认证。
十五、这部分和做 App 有什么关系?
如果做蓝牙 App,尤其是 BLE 调试工具 App,需要注意:
1. UI 上尽量叫"配对码"或 "Bluetooth Passkey"
中文用户更容易理解:
请输入蓝牙配对码
英文界面更规范:
Enter Bluetooth Passkey
不要只写:
PIN
因为 PIN 在传统蓝牙和 UI 规范里容易产生历史混淆。
2. BLE Passkey 通常是 6 位数字
所以输入框应该限制为:
只能输入数字
长度 6 位
范围 000000 ~ 999999
注意:
000000 是合法的 6 位表示
不要因为转成整数后变成 0,就把前导 0 丢掉。
例如用户看到的 Passkey 是:
001234
App UI 上就应该显示:
001234
不能显示成:
1234
因为 Passkey 在用户界面上是 6 位数字表达。
3. 对 Legacy PIN,不要随便支持复杂 Unicode 字符
如果做经典蓝牙相关工具,最好优先支持纯数字 PIN,例如:
0000
1234
8888
如果要支持字符 PIN,也要注意:
UTF-8 编码
最大 16 bytes
不是简单最大 16 characters
不过如果当前主要目标是 BLE,可以暂时不深挖 Legacy PIN 的复杂编码问题。
十六、这节容易混淆的点
1. Passkey 和 PIN 是不是一回事?
可以这样理解:
历史上很多地方叫 PIN;
规范在 UI 层面推荐叫 Bluetooth Passkey;
在 Legacy Pairing 中,PIN 这个叫法更常见;
在 Secure Simple Pairing / BLE Security Manager 中,更常说 Passkey。
所以它们高度相关,但语境不同。
2. Passkey 是不是一定用于所有配对?
不是。
Bluetooth Passkey may be used,也就是"可能被使用"。
蓝牙配对不一定都要用户输入 Passkey。
例如 BLE 中的:
Just Works
通常就没有用户输入 6 位配对码的过程。
而:
Passkey Entry
才会涉及用户输入或显示 6 位 Passkey。
3. 6 位 Passkey 是字符串还是整数?
规范说它是一个:
6-digit numeric value
同时又说它用整数表示,范围是:
0 ~ 999999
但是在 UI 展示上,应该把它当成 6 位数字码 来处理。
比如:
000123
底层数值是 123,但 UI 上必须保留 6 位:
000123
否则用户会误解。
十七、这一节你应该怎么记?
可以直接记成下面这段:
Bluetooth Passkey 是蓝牙配对过程中可能用于认证的配对码。
在 UI 层面,规范推荐使用 Bluetooth Passkey,而不是 Bluetooth PIN。
对于 Secure Simple Pairing 和 BLE Security Manager,Bluetooth Passkey 是 6 位数字,范围是 000000 到 999999。
在 Legacy Pairing 中,PIN 的表示更复杂,用户界面输入的是 PINUI,底层 Baseband 使用的是 PINBB,PINUI 到 PINBB 按 UTF-8 转换,PINBB 最大 16 字节。
Legacy PIN 为了完整安全性建议 16 个字符;为了兼容性,固定 PIN 和可变 PIN 都建议使用十进制数字。
对于 BLE App 开发,重点关注 6 位数字 Passkey,不要把前导 0 丢掉。
十八、对你当前学习 BLE 的建议
这部分里面有很多经典蓝牙 Legacy Pairing 的内容,现在可以先不用死磕。
现在重点记 BLE 相关的这几条就够了:
1. UI 上应该叫 Bluetooth Passkey,中文可以叫"蓝牙配对码"。
2. BLE Security Manager 里的 Passkey 是 6 位数字,范围 000000 ~ 999999。
3. Passkey 不一定每次配对都会用,只有某些配对方式才会涉及,例如 Passkey Entry。
4. 处理 Passkey 时要保留 6 位显示,不要把 001234 显示成 1234。
5. Legacy PIN 的 PINUI / PINBB / UTF-8 / 16 bytes 这些内容,属于经典蓝牙兼容细节,可以先快速看过。
一句话总结:
这一节主要是告诉你:蓝牙配对码在 UI 上应该叫 Bluetooth Passkey;在 BLE 安全管理中,它通常是 6 位数字;而传统蓝牙 PIN 的表示和编码规则更复杂。

这部分讲的是 Class of Device(设备类别,CoD)。
不过要先注意一个重点:这一节主要偏 经典蓝牙 BR/EDR,不是 BLE-only 的核心内容。
它想说明的是:
Class of Device 是在 BR/EDR 设备发现过程中获得的一个参数,用来粗略描述设备类型和服务类型;但它不能被当成判断设备具体支持哪些服务的可靠依据。
一、原文大意翻译
3.2.4 Class of Device
设备类别
3.2.4.1 Definition
定义
Class of Device 是在 BR/EDR 物理传输 的设备发现过程中接收到的一个参数,用来表示设备类型。
Class of Device 参数只用于:
使用 BR/EDR 物理传输的 BR/EDR 设备
以及使用 BR/EDR 物理传输的 BR/EDR/LE 双模设备
也就是说,它不是 BLE-only 设备的核心参数。
3.2.4.2 Term on user interface level
用户界面层级上的术语
Class of Device 参数中的信息,在 UI 层面应该称为:
Bluetooth Device Class
也就是:
蓝牙设备类别
这里主要指:
Major Device Class
Minor Device Class
也就是主设备类别和次设备类别。
Class of Device 中的 service class 字段,在 UI 层面应该称为:
Bluetooth Service Type
也就是:
蓝牙服务类型
如果 UI 上把 Bluetooth Device Class 和 Bluetooth Service Type 的信息混合起来使用,那么应该称为:
Bluetooth Device Type
也就是:
蓝牙设备类型
3.2.4.3 Representation
表示方式
Class of Device 是一个 bit field,也就是位字段。
它的具体定义在规范引用的章节中。
在 UI 层面,Class of Device 信息如何展示,由具体实现决定。
也就是说,规范没有强制要求 App 或系统界面必须按某一种固定格式显示。
3.2.4.4 Usage
用途
有些设备会提供多个服务,而同一个服务也可能由不同类型的设备提供。
所以,设备类型和设备支持的服务之间不是一一对应关系。
因此,不能通过 Major Device Class 和 Minor Device Class 来判断某个设备是否支持某个具体服务。
Class of Device 可以用作一种指示信息:
1. 指示哪些设备最可能支持目标服务
2. 在进行服务发现请求之前,先粗略筛选设备
3. 当多个设备支持同一个服务时,帮助用户选择设备
但是它不能替代真正的服务发现。
二、这部分想表达什么?
这部分主要想表达:
Class of Device 是经典蓝牙设备发现阶段用来描述设备大致类型的参数,但它只是一个粗略分类,不能拿它来准确判断设备支持哪些服务。
比如一个设备的 Class of Device 显示它是:
Audio/Video Device
Headset
这能说明它大概率是音频设备,但不能严格证明它一定支持某个具体 Profile 或服务。
再比如一个设备看起来像:
Phone
Computer
Keyboard
Mouse
Speaker
这些只是设备类别层面的信息,不等于完整的服务能力列表。
真正要知道它支持什么服务,仍然需要做服务发现。
三、关键信息 1:Class of Device 主要用于 BR/EDR
原文第一段很关键:
Class of Device is a parameter received during the device discovery procedure on the BR/EDR physical transport
意思是:
Class of Device 是在 BR/EDR 物理传输上的设备发现过程 中接收到的参数。
所以它主要属于经典蓝牙语境。
你现在学习 BLE 时要注意:
Class of Device 不是 BLE-only 设备的核心概念。
BLE 里面更常见的是:
Advertising Data
Appearance
Service UUID
Local Name
Manufacturer Specific Data
Service Data
而不是 Class of Device。
所以如果你的目标是理解 BLE 广播、扫描、连接、GATT,这一节可以快速看过,不需要深挖。
四、关键信息 2:Class of Device 用来表示设备类型
Class of Device 的作用是表示设备类型。
比如经典蓝牙设备发现时,可能通过这个字段知道远端设备大致是:
Computer
Phone
Audio/Video
Peripheral
Imaging
Wearable
Toy
Health
进一步还可以有更细的分类,例如:
Keyboard
Mouse
Joystick
Headset
Loudspeaker
Smartphone
Laptop
不过这里要强调:它是"类别信息",不是"能力清单"。
也就是说,它更像是设备的标签,而不是设备的完整功能描述。
五、关键信息 3:UI 上有三个术语要区分
这一节最容易混的是几个 UI 术语。
1. Bluetooth Device Class
这个对应 Class of Device 里面的:
Major Device Class
Minor Device Class
也就是设备大类和设备小类。
可以理解为:
这个设备是什么类型?
例如:
Phone
Computer
Audio/Video
Peripheral
Keyboard
Mouse
所以 UI 上可以显示为:
Bluetooth Device Class: Keyboard
或者中文:
蓝牙设备类别:键盘
2. Bluetooth Service Type
这个对应 Class of Device 里面的:
Service Class field
可以理解为:
这个设备声称自己大概提供什么类型的服务?
例如可能和下面这些服务类别相关:
Audio
Rendering
Capturing
Object Transfer
Networking
Telephony
Information
所以 UI 上可以显示为:
Bluetooth Service Type: Audio
或者:
蓝牙服务类型:音频
3. Bluetooth Device Type
如果 UI 同时混合使用了设备类别和服务类型,那么应该叫:
Bluetooth Device Type
也就是:
蓝牙设备类型
例如 UI 上综合显示:
Bluetooth Device Type: Audio Headset
这里可能既包含设备类别信息,也包含服务类型信息,所以用 Bluetooth Device Type 更合适。
六、关键信息 4:Class of Device 是 bit field
原文说:
The Class of Device is a bit field
意思是:
Class of Device 不是一个普通字符串,而是一个按 bit 位划分含义的字段。
它内部可能包含:
Service Class
Major Device Class
Minor Device Class
Format Type
你可以简单理解成:
Class of Device 是一个数字;
这个数字的不同 bit 位代表不同含义;
解析后才能得到设备类别和服务类型。
例如某个经典蓝牙设备的 CoD 可能是一个十六进制值:
0x240404
这个值本身不直观,需要按 bit 位解析,才能知道它表示什么设备类别和服务类别。
七、关键信息 5:UI 怎么显示由实现决定
原文说:
The UI-level representation of the information in the Class of Device is implementation specific.
意思是:
Class of Device 在 UI 上怎么显示,规范没有强制统一格式,由具体实现决定。
所以不同系统或 App 可能显示成:
Audio Device
Headset
Bluetooth Audio
Unknown Device
Phone
Computer
Peripheral
也可能完全不显示 CoD 解析结果。
这和前面 BD_ADDR 的显示要求不同。
BD_ADDR 规范明确说 UI 上用 12 个十六进制字符表示,例如:
00:0C:3E:3A:4B:69
但 Class of Device 这里没有给出固定 UI 格式。
八、关键信息 6:不要用设备类别判断具体服务支持
这是本节最重要的一句话:
The major and minor device class field should not be used to determine whether a device supports any specific service(s).
意思是:
不能用 Major Device Class 和 Minor Device Class 来判断设备是否支持某个具体服务。
原因是:
设备类型 和 服务支持 不是一一对应关系。
比如:
一个手机可以支持音频、文件传输、网络共享、HID 等多个服务。
一个音频服务也可能由耳机、音箱、车机、电脑等不同设备类型提供。
一个键盘类设备可能支持 HID,但不能只凭 Keyboard 类别就完全替代服务发现。
一个设备类别显示为 Audio/Video,也不代表它一定支持你想要的具体音频 Profile。
所以 CoD 只能作为粗略参考,不能作为最终判断依据。
九、Class of Device 的正确用途
Class of Device 可以用于"预筛选",但不能用于"最终确认"。
可以做的事情
比如你在经典蓝牙扫描结果里看到很多设备,可以用 Class of Device 帮用户快速识别:
这个看起来像耳机
这个看起来像手机
这个看起来像电脑
这个看起来像键盘
或者在服务发现之前,先猜测:
这个设备更可能支持音频相关服务
这个设备更可能是输入设备
这个设备更可能是电话类设备
也可以在多个候选设备中帮助用户选择:
用户要连接耳机时,优先展示 Audio/Video 类设备。
不能做的事情
不能写死逻辑说:
只要 Class of Device 是 Keyboard,就一定支持某个 HID 服务。
只要 Class of Device 是 Audio,就一定支持某个具体音频协议。
只要 Class of Device 不是某个类别,就一定不支持目标服务。
因为最终能力还是要靠真正的服务发现确认。
经典蓝牙里要看 SDP 等服务发现结果。
BLE 里则要看广播中的 Service UUID,或者连接后进行 GATT Service Discovery。
十、和 BLE 里的 Appearance 有点像,但不是一回事
如果你学习 BLE,这里可以顺便建立一个对比:
经典蓝牙 BR/EDR:Class of Device
BLE:Appearance
它们都有点像"设备外观/设备类别提示"。
BLE 的 Appearance 也可以告诉远端设备:
Generic Phone
Generic Computer
Generic Watch
Heart Rate Sensor
Keyboard
Mouse
但是 Appearance 同样不能完全替代服务发现。
比如 BLE 设备的 Appearance 显示为 Heart Rate Sensor,说明它看起来像心率设备,但真正是否支持 Heart Rate Service,还是要看广播的 Service UUID 或连接后的 GATT 服务发现结果。
所以你可以这样理解:
Class of Device 是 BR/EDR 设备发现里的设备类别提示;
Appearance 是 BLE/GAP 中用于描述设备外观/类别的提示;
二者都不能替代真正的服务发现。
十一、结合你做蓝牙 App 怎么理解?
如果你做的是 BLE 调试工具,比如类似 nRF Connect / LightBlue,那么这一节不是重点。
因为 BLE 扫描结果里,你更应该关注:
Address
Address Type
RSSI
Advertising Data
Local Name
Service UUIDs
Manufacturer Specific Data
Service Data
Tx Power
Appearance
而不是 Class of Device。
但如果你的 App 同时支持经典蓝牙,比如:
SPP
A2DP
HFP
HID over BR/EDR
双模设备发现
那么 Class of Device 就有参考价值。
你可以在界面中显示:
Bluetooth Device Class: Audio/Video - Headset
Bluetooth Service Type: Audio
Bluetooth Device Type: Audio Headset
但是不要只靠这个字段决定能不能连接或能不能通信。
十二、学习优先级建议
对于你当前目标是理解 BLE,可以这样处理:
Class of Device:快速了解即可,不需要深挖。
因为它主要属于:
BR/EDR discovery
经典蓝牙设备发现
双模设备使用 BR/EDR 传输时的发现参数
如果你现在主要学习:
BLE Advertising
BLE Scanning
BLE Connection
GATT
GAP
HCI LE Commands
那么更应该优先学习:
Advertising Data
AD Type
Local Name
Service UUID
Appearance
Manufacturer Specific Data
Service Data
Address Type
Filter Policy
GATT Service Discovery
十三、这一节你应该怎么记?
可以直接记成下面这段:
Class of Device 是 BR/EDR 设备发现过程中获得的一个参数,用来粗略表示设备类型。
它只用于使用 BR/EDR 物理传输的 BR/EDR 设备或 BR/EDR/LE 双模设备,不是 BLE-only 的核心参数。
UI 层面上,设备类别信息应称为 Bluetooth Device Class;服务类别字段应称为 Bluetooth Service Type;如果混合使用设备类别和服务类别信息,则称为 Bluetooth Device Type。
Class of Device 是 bit field,UI 如何展示由具体实现决定。
Class of Device 只能用于辅助判断和预筛选,不能用来确定设备是否支持某个具体服务。真正的服务支持情况必须通过服务发现确认。
一句话总结:
这一节主要告诉你:Class of Device 是经典蓝牙设备发现中的"设备类别提示",可以帮助用户粗略识别设备类型,但不能替代真正的服务发现。

这部分讲的是 Appearance characteristic(外观特征值)。
它属于 BLE / GATT / GAP 相关内容,比上一节 Class of Device 更贴近 BLE。
它想表达的是:
BLE 设备可以通过 GAP Service 里的 Appearance characteristic,用一个 16-bit 数值告诉远端设备:我"看起来像什么设备"。远端设备可以把这个数值映射成图标或文字,帮助用户从视觉上识别设备类型。
一、原文大意翻译
3.2.5 Appearance characteristic
外观特征值
3.2.5.1 Definition
定义
Appearance characteristic 包含一个 16-bit 数值。
这个 16-bit 数值可以被映射成一个图标或字符串,用来描述设备在设备发现过程中的物理表现形式。
Appearance characteristic 是设备 GATT Server 上 GAP Service 的一个 Characteristic。
3.2.5.2 Usage at user interface level
用户界面层级上的使用
Appearance characteristic 的值应该被映射成一个图标、字符串,或者类似的内容,用来向用户传达设备的视觉描述。
这样用户就可以根据外观判断当前发现的是什么设备。
如果显示字符串,这个字符串应该被翻译成用户设备所选择的语言。
3.2.5.3 Representation
表示方式
Appearance characteristic 的值应该设置为 Bluetooth SIG 分配并定义的某一个 16-bit 数值。
在 UI 层面,Appearance characteristic 的值如何展示,由具体实现决定。
二、这部分想表达什么?
这部分主要表达的是:
Appearance 是 BLE 设备用来描述自己"外观类别"的一个 GAP 特征值。
比如一个 BLE 设备可以通过 Appearance 表示自己是:
Generic Phone
Generic Computer
Generic Watch
Generic Clock
Generic Display
Generic Remote Control
Generic Thermometer
Heart Rate Sensor
Blood Pressure Sensor
Keyboard
Mouse
Joystick
Gamepad
这些值本质上不是字符串,而是一个 16-bit 数字。
远端设备拿到这个数字后,可以把它显示成:
一个图标
一个设备类型文字
一个本地化后的名称
比如:
Appearance value: 0x03C1
UI 显示:Keyboard
中文 UI 显示:键盘
三、关键信息 1:Appearance 是 BLE 中 GAP Service 的 Characteristic
原文说:
It is a characteristic of the GAP Service located on the device's GATT Server.
意思是:
Appearance characteristic 是设备 GATT Server 上 GAP Service 的一个特征值。
在 BLE 里,GAP Service 通常是:
Generic Access Service
UUID: 0x1800
其中常见的 Characteristic 包括:
Device Name
UUID: 0x2A00
Appearance
UUID: 0x2A01
所以 Appearance 对应的是:
Service: 0x1800
Characteristic: 0x2A01
这点非常重要。
也就是说,Appearance 不是广播包里随便写的字段,而是 GAP Service 里的一个标准 Characteristic。
四、关键信息 2:Appearance 是一个 16-bit 数值
Appearance characteristic 里面存的是:
16-bit number
也就是:
2 bytes
这个数值由 Bluetooth SIG 统一分配和定义。
也就是说,它不是厂商自己随便定义的。
例如,某个 Appearance 值可能表示:
Generic Phone
Generic Computer
Generic Watch
Keyboard
Mouse
Heart Rate Sensor
Thermometer
远端设备读取到这个数值后,再根据 Bluetooth SIG 定义的表进行解释。
你可以这样理解:
Appearance 本身是数字;
数字背后对应一个设备外观类别;
UI 可以把它转换成图标或文字。
五、关键信息 3:Appearance 用来描述设备"看起来像什么"
原文说:
describes the physical representation of the device
意思是:
Appearance 用来描述设备的物理表现形式,或者说设备外观类别。
通俗理解就是:
这个 BLE 设备从外观上看像什么?
例如:
它像手机?
它像手表?
它像键盘?
它像鼠标?
它像心率传感器?
它像温度计?
它不是用来描述设备完整功能的。
比如一个设备 Appearance 是:
Keyboard
只能说明它的外观或类别像键盘,不能完全替代 GATT 服务发现。
真正要判断它是否支持 HID over GATT,还要看它是否有相关 GATT Service。
六、关键信息 4:UI 上应该映射成图标或字符串
原文说:
The Appearance characteristic value should be mapped to an icon or string or something similar
意思是:
UI 不应该直接把 Appearance 原始数值丢给普通用户看。
比如不建议普通用户界面只显示:
Appearance: 0x03C1
更好的显示方式是:
Appearance: Keyboard
或者中文:
外观类型:键盘
甚至直接显示一个键盘图标。
对于调试工具 App,可以同时显示:
Appearance: Keyboard
Value: 0x03C1
这样既方便普通理解,也方便开发者调试。

七、关键信息 5:如果显示字符串,应该做语言本地化
原文说:
If a string is displayed, this string should be translated into the language selected by the user for the device.
意思是:
如果 UI 用文字显示 Appearance,那么这个文字应该翻译成用户设备选择的语言。
比如英文系统可以显示:
Keyboard
Mouse
Heart Rate Sensor
Thermometer
中文系统可以显示:
键盘
鼠标
心率传感器
温度计
这说明 Appearance 是偏用户界面的信息,不只是开发者调试信息。
八、关键信息 6:UI 展示方式由具体实现决定
原文最后说:
The UI-level representation of the Appearance characteristic value is implementation specific.
意思是:
Appearance 在 UI 上到底怎么展示,规范没有强制规定。
可以显示成:
图标
文字
图标 + 文字
原始数值 + 解析含义
比如不同 App 可以这样显示:
方式一:
⌨️ Keyboard
方式二:
Appearance: Keyboard
方式三:
Appearance: 0x03C1 (Keyboard)
方式四:
设备类型:键盘
对于你做 BLE 调试工具 App,我建议使用:
Appearance: Keyboard
Appearance Value: 0x03C1
这样更适合开发者。
九、Appearance 和 Class of Device 的区别
这一节可以和上一节 Class of Device 对比理解。
Class of Device:
主要用于 BR/EDR 设备发现,也就是经典蓝牙场景。
Appearance:
属于 BLE GAP Service 中的 Characteristic,更贴近 BLE。
可以简单记成:
经典蓝牙 BR/EDR:Class of Device
BLE:Appearance characteristic
它们都可以帮助用户粗略判断设备类型,但都不能完全代表设备实际支持的服务。
例如:
Appearance = Keyboard
这只能说明设备外观类别是键盘。
但真正是否支持键盘输入相关功能,还需要看 GATT 服务,例如是否支持 HID Service。
十、Appearance 和 GATT Service Discovery 的关系
Appearance 是"外观类别提示",不是"服务能力证明"。
比如一个 BLE 设备的 Appearance 显示为:
Heart Rate Sensor
它大概率是心率设备。
但 App 如果真的要使用心率数据,不能只看 Appearance。
还应该检查它是否真的存在:
Heart Rate Service
UUID: 0x180D
再比如 Appearance 显示:
Keyboard
如果 App 想确认它是否是 BLE HID 键盘,还要看是否存在:
Human Interface Device Service
UUID: 0x1812
所以正确逻辑是:
Appearance:帮助用户识别设备外观/类别
Service UUID / GATT Discovery:确认设备实际支持的服务能力
十一、结合 BLE App 开发怎么理解?
做 BLE 扫描和调试工具时,可以把 Appearance 当作设备展示信息的一部分。
比如设备详情页可以显示:
Device Name: BLE Keyboard
Address: DD:2D:31:00:06:F6
Address Type: Random
RSSI: -62 dBm
Appearance: Keyboard
Appearance Value: 0x03C1
如果是在普通用户 App 中,可以更简单:
设备类型:键盘
如果是在调试工具 App 中,建议同时显示原始值和解析值:
Appearance: Keyboard
Raw Value: 0x03C1
因为开发者有时需要确认设备设置的 Appearance 是否正确。
十二、Appearance 和广播数据的关系
这里要特别注意:
Appearance 是 GAP Service 里的 Characteristic,但 BLE 广播数据中也可以携带 Appearance 相关 AD Type。
所以你可能在两个地方看到 Appearance:
1. 广播数据中的 Appearance AD Structure
2. 连接后读取 GAP Service 0x1800 下的 Appearance Characteristic 0x2A01
这两个值理论上应该表达同一个设备外观类别,但实际产品中不一定总是完全一致。
所以调试时要区分来源:
Advertising Appearance
GATT Appearance Characteristic
如果你做调试工具,可以分别显示:
Advertising Appearance: Keyboard
GATT Appearance: Keyboard
如果两者不一致,也方便定位模块配置问题。
十三、这一节你应该怎么记?
可以直接记成下面这段:
Appearance characteristic 是 BLE GAP Service 里的一个标准特征值,对应 UUID 0x2A01。
它保存的是一个 16-bit 数值,这个数值由 Bluetooth SIG 分配,用来描述设备的外观类别。
远端设备可以把这个数值映射成图标或字符串,让用户知道当前发现的设备大概是什么类型。
如果 UI 显示字符串,应该根据用户设备语言进行本地化。
Appearance 只能作为设备外观/类别提示,不能代替真正的服务发现。
在 BLE 中,它有点类似经典蓝牙 BR/EDR 里的 Class of Device,但它们不是同一个东西。
一句话总结:
Appearance characteristic 主要告诉远端设备:"我这个 BLE 设备从外观或类别上看像什么",方便 UI 显示图标或文字,但不能用它来最终判断设备支持哪些服务。
十四、对当前学习 BLE 的建议
这一节你应该认真记一下,因为它是 BLE GAP / GATT 中比较基础的内容。
不过不用死记所有 Appearance 数值表,先掌握概念即可:
重点掌握:
1. Appearance 是 GAP Service 里的 Characteristic。
2. UUID 是 0x2A01。
3. 它是 16-bit 数值。
4. 它用于描述设备外观类别。
5. UI 可以把它显示成图标或文字。
6. 它不能替代 Service UUID 或 GATT Service Discovery。
后面你如果做 BLE 调试工具,可以考虑在设备详情页增加一项:
Appearance
并把原始值和解析后的设备类型一起展示出来。

这部分讲的是 Broadcast Code ,也就是用于 加密广播音频 BIG 的一段"广播访问/隐私代码"。
它属于比较新的 BLE Audio / Isochronous Broadcast 相关内容,不是普通 Legacy Advertising、普通 GATT 通信的核心内容。
简单说:
Broadcast Code 用来支持加密 BIG。广播源发送加密的广播音频数据时,需要用它参与加密;接收端接收这个 BIG 中的 BIS 时,需要用它参与解密。
一、原文大意翻译
3.2.6 Broadcast Code
3.2.6.1 Definition
定义
Broadcast_Code 参数用于支持一个加密的 BIG。
它会用于两个过程:
1. 发送加密 BIG 时,对数据进行加密
2. 接收该 BIG 中的 BIS 时,对数据进行解密
3.2.6.2 Terms at user interface level
用户界面层级上的术语
当在 UI 层面提到 Broadcast_Code 参数时,应该使用术语:
Bluetooth Privacy Code
也就是可以理解为:
蓝牙隐私码
3.2.6.3 Representation
表示方式
Broadcast_Code 参数在不同层级有不同表示方式。
在 UI 层面,Broadcast Code 应该表示为一个字符串。
这个字符串至少是:
4 octets
也就是至少 4 字节。
并且它需要满足前面 Bluetooth Passkey / PINUI 相关章节里的要求。
例如:
用 UTF-8 编码后不能超过 16 octets
为了更高安全性,推荐使用:
16 octets
在 UI 之外的其他层级,Broadcast Code 应该表示为一个:
128-bit value
也就是:
16 bytes
从字符串转换成数字时,需要先把字符串表示成 UTF-8,然后把得到的字节放入这个 128-bit 值的 8-bit 字段中,从最低有效位开始放;如果需要,则在最高有效位补 0。
例如字符串:
Børne House
会表示成:
0x00000000_6573756F_4820656E_72B8C342
二、这部分想表达什么?
这部分主要表达 4 件事:
1. Broadcast Code 是加密 BIG 使用的参数。
2. 在 UI 层面不要直接叫 Broadcast Code,而应该叫 Bluetooth Privacy Code。
3. UI 上它表现为一个字符串,至少 4 字节,最多按 PINUI 要求通常不超过 16 字节。
4. 在底层协议层面,它表现为一个 128-bit 数值。
你可以先这样记:
Broadcast Code 是给加密广播音频用的"密码/隐私码"。
用户看到的是 Bluetooth Privacy Code;
底层使用的是 128-bit Broadcast_Code。
三、关键信息 1:Broadcast Code 用于加密 BIG
这里有两个重要缩写:
BIG = Broadcast Isochronous Group
BIS = Broadcast Isochronous Stream
在 BLE Audio 里,一个广播源可以发送同步广播音频数据。
例如:
电视机广播音频
公共场所广播音频
助听器接收广播音频
多人同时收听同一个音频广播
这里可能会用到 BIS。
多个 BIS 可以组成一个 BIG。
如果这个 BIG 是加密的,那么接收端想要正确解密,就需要知道对应的 Broadcast Code。
所以它的作用有点像:
加入这个加密广播音频流所需的访问码/隐私码
但规范在 UI 上建议叫:
Bluetooth Privacy Code
四、关键信息 2:它不是普通 BLE 广播的广播数据
看到 Broadcast Code 这个名字,很容易误解为普通 BLE Advertising 里的广播数据字段。
但这里不是普通 Legacy Advertising 的内容。
它和下面这些不是一个层面的东西:
Advertising Data
Scan Response Data
Local Name
Manufacturer Specific Data
Service UUID
Tx Power
Appearance AD Type
这节讲的 Broadcast Code 更偏向:
LE Audio
Isochronous Broadcast
BIG / BIS
Encrypted Broadcast
所以如果你当前正在学习:
BLE Legacy 广播
LE Set Advertising Parameters
LE Set Advertising Data
LE Set Scan Response Data
LE Advertising Report
那这一节可以先快速了解,不需要深挖。
五、关键信息 3:UI 上应该叫 Bluetooth Privacy Code
原文说:
When the Broadcast_Code parameter is referred to on the UI level, the term 'Bluetooth Privacy Code' should be used.
意思是:
在用户界面上,如果要显示这个参数,不应该直接写:
Broadcast Code
而应该写:
Bluetooth Privacy Code
中文可以理解成:
蓝牙隐私码
比如用户界面可以显示:
请输入 Bluetooth Privacy Code
或者中文:
请输入蓝牙隐私码
为什么不直接叫 Broadcast Code?
因为 Broadcast Code 是偏协议参数名,而 Bluetooth Privacy Code 更像用户能理解的名称。
对于普通用户来说:
Broadcast Code
可能不知道是什么。
但:
Privacy Code
更容易理解为"访问这个加密广播所需的隐私码"。
六、关键信息 4:UI 层面是字符串
原文说:
On the UI level, the Broadcast Code parameter shall be represented as a string
也就是说,在用户界面上,它不是显示成十六进制大整数,而是显示成字符串。
例如可以是:
1234
BorneHouse
Børne House
MyAudioCode
但它不是随便无限长的字符串。
它有长度要求:
至少 4 octets
建议 16 octets 更安全
这里的 octet 可以理解为 byte。
所以:
4 octets = 4 bytes
16 octets = 16 bytes
注意,和前面 Bluetooth PIN 一样,这里说的是字节,不一定等于字符数量。
七、关键信息 5:至少 4 字节,推荐 16 字节
原文说 UI 层面字符串至少:
4 octets
也就是说,编码后至少要有 4 字节。
例如:
1234
如果用 UTF-8 编码,4 个 ASCII 数字就是 4 字节,所以满足最低要求。
但为了更高安全性,规范建议:
16 octets should be used for higher level of security.
也就是:
为了更高安全性,应该使用 16 字节。
原因很直观:
Broadcast Code 越短,猜测空间越小;
Broadcast Code 越长,安全性越高。
例如:
1234
虽然满足 4 字节,但安全性弱。
而:
A9k2M7q8Z1p4X6r0
如果是 16 个 ASCII 字符,就是 16 字节,安全性会高很多。
八、关键信息 6:底层表示是 128-bit value
原文说:
On all levels other than UI, the Broadcast Code parameter shall be represented as a 128-bit value.
意思是:
除了 UI 层面以外,其他层级的 Broadcast Code 都应该表示为:
128-bit value
也就是:
16 bytes
所以它有两个形态:
UI 层面:
字符串,例如 "Børne House"
底层协议层面:
128-bit 数值,例如 0x00000000_6573756F_4820656E_72B8C342
这和前面的 Passkey / PIN 也有点像:
用户输入的是字符串或数字码;
底层使用的是转换后的二进制值。
九、关键信息 7:字符串如何转换成 128-bit 值?
原文描述了转换规则:
The transformation from string to number shall be by representing the string in UTF-8,
placing the resulting bytes in 8-bit fields of the value starting at the least significant bit,
and then padding with zeros in most significant bits if necessary.
拆开理解:
第一步:字符串先转成 UTF-8 字节
例如:
Børne House
UTF-8 编码后得到一串字节。
其中普通英文字母通常是 1 字节:
B -> 0x42
r -> 0x72
n -> 0x6E
e -> 0x65
空格 -> 0x20
H -> 0x48
o -> 0x6F
u -> 0x75
s -> 0x73
e -> 0x65
但是:
ø
不是 Basic Latin 字符,UTF-8 编码为 2 字节:
ø -> 0xC3 0xB8
所以:
Børne House
对应字节大概是:
42 C3 B8 72 6E 65 20 48 6F 75 73 65
第二步:从最低有效位开始放入 128-bit value
也就是说,这些 UTF-8 字节不是简单按平时阅读顺序写成最高位在前。
它们会从 128-bit 数值的低位开始填。
所以最后原文示例得到:
0x00000000_6573756F_4820656E_72B8C342
把它按 byte 拆开是:
00 00 00 00 65 73 75 6F 48 20 65 6E 72 B8 C3 42
你会发现从右往左看,低位字节就是:
42 C3 B8 72 6E 65 20 48 6F 75 73 65
这正好是 "Børne House" 的 UTF-8 字节序列。
第三步:不足 16 字节时,高位补 0
Børne House 编码后没有占满 16 字节,所以剩余高位补 0。
所以前面有:
0x00000000
最终得到:
0x00000000_6573756F_4820656E_72B8C342
这说明:
UI 字符串不是直接按视觉顺序变成十六进制展示;
而是先 UTF-8 编码,再按低位开始填入 128-bit 数值。
十、为什么这里要引用前面 Bluetooth Passkey / PINUI 的要求?
原文说它要满足 Section 3.2.3.3 里 PINUI 的要求。
这意味着 Broadcast Code 在 UI 字符串上也要注意类似问题:
1. 用 UTF-8 编码
2. 编码后不要超过 16 octets
3. 尽量避免容易造成兼容问题的字符
4. 如果包含数字,最好使用 Basic Latin 的 0~9
5. 不建议使用全角/半角变体等容易混淆的 Unicode 字符
所以实际产品里,最好不要设计成很奇怪的 Unicode 字符串。
比较稳妥的方式是:
纯数字
英文字母 + 数字
Basic Latin 范围内的字符
例如:
12345678
Audio2026
BLEAUDIOCODE1234
十一、结合 BLE 开发怎么理解?
这部分对当前做普通 BLE App 开发,不是最高优先级。
现在如果主要做的是:
BLE 扫描
BLE 连接
GATT Read / Write / Notify
广播数据解析
设备透传
OTA
AT 指令
那么 Broadcast Code 暂时不会经常遇到。
它更可能出现在:
BLE Audio
Auracast
Broadcast Audio
Encrypted BIG
BIS 接收
音频广播共享
助听器 / 耳机 / 电视音频广播
如果未来做 LE Audio 相关 App 或设备调试工具,就需要理解它。
比如用户想加入一个加密的广播音频流,App 可能需要提示用户:
请输入蓝牙隐私码
用户输入后,系统或协议栈会把这个字符串转换为 128-bit Broadcast_Code,用于解密接收到的 BIS 数据。
十二、Broadcast Code 和普通配对码的区别
它很容易和 Bluetooth Passkey 混淆。
可以这样区分:
Bluetooth Passkey:
主要用于两个设备配对时的认证。
常见形式是 6 位数字,例如 123456。
Broadcast Code:
用于加密广播音频 BIG。
UI 上称为 Bluetooth Privacy Code。
它是字符串,底层转换为 128-bit 值。
简单对比:
Bluetooth Passkey:
点对点配对认证
Broadcast Code:
加密广播音频接收/解密
Passkey 常见于:
手机连接蓝牙键盘
手机连接 BLE 外设并配对
Broadcast Code 常见于:
加入一个加密的 LE Audio 广播
接收 Auracast 音频广播
十三、Broadcast Code 和普通广播数据的区别
Broadcast Code 也容易让人误以为是广播包里公开发出来的 Code。
但它不是普通 Advertising Data 里的随便一个字段。
它是用于加密 BIG/BIS 的参数。
可以这样理解:
普通广播数据:
用于发现设备、携带名称、服务 UUID、厂商数据等。
Broadcast Code:
用于加密广播音频的加密/解密过程。
尤其注意:
如果 BIG 是加密的,接收端需要 Broadcast Code 才能解密;
如果没有正确 Broadcast Code,即使能发现广播,也无法正确解密音频数据。
十四、这一节应该怎么记?
可以直接记成下面这段:
Broadcast Code 是 BLE Audio / Isochronous Broadcast 中用于加密 BIG 的参数。
它参与加密 BIG 发送数据的加密,也参与接收端对 BIG 中 BIS 数据的解密。
在 UI 层面,规范要求使用 Bluetooth Privacy Code 这个术语,也就是蓝牙隐私码。
UI 上它表现为字符串,至少 4 字节,推荐 16 字节以获得更高安全性。
在非 UI 层面,它表现为 128-bit value,也就是 16 字节。
字符串转换到底层 128-bit 值时,先按 UTF-8 编码,再从最低有效位开始填入,不足的高位补 0。
一句话总结:
这一节主要告诉你:Broadcast Code 是加密广播音频 BIG 的"隐私码/访问码",用户看到的是 Bluetooth Privacy Code,底层使用的是 128-bit Broadcast_Code。
十五、对当前学习 BLE 的建议
这部分可以先了解,不建议现在深挖。
因为它不是普通 BLE 广播扫描连接的基础内容,而是偏:
LE Audio
Broadcast Isochronous Group
Broadcast Isochronous Stream
Encrypted Broadcast
Auracast
当前如果还在学习 GAP 基础、Legacy Advertising、HCI LE Advertising Commands,那么优先级可以这样排:
高优先级:
Bluetooth Device Address
Bluetooth Device Name
Appearance
Advertising Data
Scanning
Connection
GATT Service / Characteristic
中优先级:
Passkey
Pairing
Bonding
Privacy
Resolvable Private Address
低优先级,暂时了解:
Broadcast Code
BIG / BIS
LE Audio Broadcast
不过要记住它和普通广播的区别:
Broadcast Code 不是普通广播数据;
它是加密 LE Audio 广播 BIG/BIS 用的隐私码。

这一节开始进入 GAP 中非常重要的一部分------Pairing(配对)。
虽然只有短短一段话,但它实际上是在定义 Pairing 在用户视角下是什么意思,以及 Pairing、Bonding、Authentication 三者之间的关系。
对于你后面学习 BLE Security Manager(SMP) 、Just Works 、Passkey Entry 、Numeric Comparison 等内容,这一段就是一个总纲。
一、原文翻译
3.3 Pairing(配对)
对于 BR/EDR(经典蓝牙) ,配对是在 LMP(Link Manager Protocol) 层定义的(参见 Vol 2 Part B)。
对于 LE(BLE) ,配对由 Security Manager(SM)规范 定义(参见 Vol 3 Part H Section 2.3)。
在用户角度来看,通常有两种情况:
第一种情况:
用户主动发起 Bonding(绑定)过程,并输入 Passkey,其明确目的就是为了在两个蓝牙设备之间建立 Bond(绑定关系),同时可能建立一个安全关系(Secure Relationship)。
这种情况下,用户执行的是:
Bonding(with entering of passkey)
输入配对码进行绑定。
第二种情况:
设备之间之前没有共享 Link Key(链路密钥)。
当设备建立连接时,系统要求用户输入 Passkey。
这种情况下,用户执行的是:
Authenticate using the passkey
使用配对码进行身份认证。
二、这一段真正想表达什么?
很多人看到 Pairing,会认为:
Pairing = 输入 6 位数字。
其实规范这里想表达的是:
Pairing 只是整个安全建立过程的统称。
而用户输入 Passkey,只是 Pairing 过程中可能发生的一步。
更重要的是,规范开始区分三个概念:
Pairing
Bonding
Authentication
很多资料把这三个词混着翻译,其实规范里含义不同。
三、关键信息一:BR/EDR 和 BLE 的 Pairing 完全不是同一个协议
原文第一句话:
Pairing over a BR/EDR physical link is defined on LMP level.
意思是:
经典蓝牙:
LMP
(Link Manager Protocol)
负责 Pairing。
而第二句:
Pairing over an LE physical link is defined by the Security Manager specification.
意思是:
BLE:
Security Manager
(SM / SMP)
负责 Pairing。
这意味着:
经典蓝牙 Pairing
│
▼
LMP
BLE Pairing
│
▼
Security Manager(SMP)
所以以后你学习 BLE 时:
不要再去看 LMP Pairing。
因为:
BLE 的 Pairing 全部都在 Vol 3 Part H(Security Manager)里面。
四、关键信息二:Pairing ≠ Bonding
这是 BLE 初学者最容易混淆的地方。
规范这里实际上已经暗示:
Pairing 和 Bonding 不是同一件事。
可以理解成:
Pairing
│
├── 身份认证
├── 密钥协商
├── 加密建立
└── (可能)产生 Bond
而:
Bonding
只是:
保存密钥
建立长期信任关系
例如:
第一次连接:
手机
│
│ Pairing
▼
设备
Pairing 完成以后:
双方得到:
LTK
IRK
CSRK
如果保存这些密钥:
就叫:
Bonding
以后再次连接:
手机
│
│
▼
设备
不用重新输入 Passkey。
因为:
Bond 已存在
所以:
Pairing 是一次安全建立过程。
而:
Bonding 是把这次 Pairing 得到的密钥保存下来。
五、关键信息三:Passkey 有两种使用场景
规范这里举了两个例子。
很多人一直认为:
输入 Passkey 就一定是在 Pairing。
其实不是。
规范说:
有两种情况。
第一种:
用户主动去:
Pair Device
例如:
手机:
蓝牙
↓
添加设备
↓
输入 123456
目的就是:
建立:
Bond
规范叫:
Bonding
(with entering of passkey)
也就是说:
用户的目标就是把设备配成长期可信设备。
例如:
耳机
键盘
鼠标
BLE 门锁
这些都属于这种。
第二种:
设备之间以前没有:
Link Key
或者 BLE 里的:
LTK
但是:
用户只是:
开始使用设备
例如:
第一次连接。
系统突然弹出:
请输入配对码
这里:
用户其实没有想:
我要去配对。
而只是:
我要连接。
于是:
系统为了完成:
Authentication
要求输入 Passkey。
所以规范说:
这种情况叫:
Authenticate
using the passkey
注意:
这里强调的是:
认证(Authentication)
不是:
Bonding。
六、为什么规范要区分这两种情况?
因为:
用户视角不同。
例如:
BLE 门锁。
第一次:
点击连接
手机:
请输入 123456
你可能觉得:
我只是连接。
实际上:
底层:
正在:
Authentication
而:
另一种:
设置
↓
配对新设备
↓
输入 123456
这里:
用户就是:
我要把设备配对。
底层:
可能:
Pairing
+
Bonding
所以:
规范区分:
Authentication
vs
Bonding
是从:
用户行为
来区分。
七、关键信息四:Link Key 是什么?
原文提到:
common link key
这是经典蓝牙的叫法。
对于 BLE:
对应的是:
LTK
(Long Term Key)
可以简单理解:
BR/EDR
Link Key
≈
BLE
LTK
都是:
以后重新连接时:
用于恢复安全连接的长期密钥。
所以:
规范说:
如果:
devices did not share
a common link key
意思就是:
以前没有建立过长期可信关系。
于是:
需要:
重新认证。
八、这一节最容易误解的地方
很多初学 BLE 的人会认为:
Pairing
=
输入密码
其实规范不是这么定义的。
更准确应该理解成:
Pairing
↓
身份认证
↓
协商密钥
↓
建立加密
↓
(可选)
Bonding
输入 Passkey:
只是:
其中某一种认证方式。
例如:
BLE Pairing:
还有:
Just Works
Numeric Comparison
Passkey Entry
Out Of Band
只有:
Passkey Entry
才需要输入:
6 位数字。
所以:
Pairing 不一定需要 Passkey。
例如:
Just Works:
用户:
什么都不用输入。
但是:
仍然完成:
Pairing
九、结合目前学习 BLE,应该如何理解?
目前已经学习了:
-
GAP
-
Advertising
-
Scanning
-
Address
-
Appearance
那么下一步马上会进入:
Security Manager
这一段实际上就是:
整个 BLE 安全章节的导读。
建议建立下面这个知识框架:
BLE Security
│
├── Pairing(建立安全关系)
│
├── Authentication(身份认证)
│ ├── Just Works
│ ├── Passkey Entry
│ ├── Numeric Comparison
│ └── OOB
│
├── Key Distribution(密钥分发)
│ ├── LTK
│ ├── IRK
│ └── CSRK
│
├── Bonding(保存密钥)
│
└── Encryption(后续连接加密)
以后学习 Vol 3 Part H(Security Manager) 时,会发现所有内容都可以放进这个框架里。
十、这一节最值得记住的内容
建议直接记住下面几句话:
1. Pairing 是建立 BLE 安全关系的整个过程,不只是输入配对码。
2. BR/EDR 的 Pairing 由 LMP 定义;BLE 的 Pairing 由 Security Manager(SMP)定义。
3. Pairing 不等于 Bonding。Pairing 是建立安全关系,Bonding 是保存密钥,建立长期信任关系。
4. 用户输入 Passkey 可能是为了建立 Bond(绑定),也可能只是为了完成一次身份认证(Authentication)。
5. Pairing 并不一定需要输入 Passkey,例如 Just Works 配对方式就无需用户输入任何数字。
对当前学习路线的建议
这一节开始,已经从 GAP 的用户界面规范 进入 BLE 安全模型。后续建议不要直接跳进 SMP 的算法细节,而是先把下面几个概念建立起来:
-
Pairing、Bonding、Authentication、Encryption 四者分别是什么、是什么关系。
-
Just Works、Passkey Entry、Numeric Comparison、Out of Band 四种认证方式各自的特点。
-
LTK、IRK、CSRK 分别是什么、什么时候生成、什么时候使用。
这三个知识点弄清楚之后,再去阅读 Security Manager 规范,会容易得多。