1. 问题现象与背景解析
第一次用CoreBluetooth框架获取外设名称时,很多开发者都会遇到这样的困惑:为什么peripheral.name和广播数据中的Local Name字段显示的内容不一样?这个看似简单的命名问题,实际上涉及BLE协议栈的多层设计逻辑。
在iOS开发中,当我们扫描到蓝牙设备并尝试获取其名称时,通常会遇到三种不同的名称来源:
- 广播数据包中的
Local Name字段(完整或缩写) - 扫描响应数据中的
Local Name字段 - 通过
CBPeripheral对象获取的name属性
这些名称差异并非系统bug,而是蓝牙协议设计时就考虑到的不同应用场景。举个例子,某健身手环在广播时可能发送缩写的Local Name"FitBand-1A",但连接后通过GATT读取设备名称特征值却返回完整的"FitBand Pro 2024 Edition"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BLE名称体系架构详解
2.1 广播数据中的名称规范
根据蓝牙核心规范v5.3第6章,广播数据中的设备名称有两种存在形式:
-
完整设备名称(Complete Local Name)
- 类型值:0x09
- 最大长度:31字节(减去AD Type和Length字段)
- 特点:必须包含完整可读的设备名称
-
缩写设备名称(Shortened Local Name)
- 类型值:0x08
- 最大长度:同上
- 特点:当完整名称超过剩余广播包空间时使用
广播包的Payload长度限制导致了一个典型现象:当设备同时广播其他信息(如服务UUID、发射功率等)时,可能会优先截断名称字段。这就是为什么我们常看到设备广播的是缩写名称。
2.2 GATT层的设备名称特征
在GATT服务中,设备名称被明确定义为Device Name特征(UUID: 0x2A00),位于Generic Access服务(UUID: 0x1800)下。这个特征值才是iOS的CoreBluetooth框架中peripheral.name属性的数据来源。
关键差异点在于:
- 广播名称侧重快速识别
- GATT名称侧重正式标识
- 广播名称受长度限制
- GATT名称最长可达248字节
