1. iOS BLE 设备名称的迷思与真相
作为一名从事蓝牙开发多年的工程师,我经常被问到这样一个问题:"为什么我的iOS设备上显示的蓝牙设备名称和实际广播的名称不一样?"这确实是一个让很多开发者困惑的现象。今天我们就来彻底剖析这个问题背后的技术原理。
在iOS蓝牙开发中,设备名称的显示并不是我们想象的那么简单。CoreBluetooth框架实际上通过两条独立的路径获取设备名称:
- GAP Name:存储在设备的Generic Access服务中(UUID: 0x2A00)
- Local Name:包含在设备的广播数据包中
这两者虽然都表现为"设备名称",但它们的来源、更新机制和使用场景都有本质区别。理解这个差异对于开发稳定的蓝牙应用至关重要。
关键提示:当你在iOS上看到设备名称不一致时,很可能是因为系统同时显示了来自不同来源的名称数据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. GAP Name:设备的"身份证"
2.1 GAP Name的技术本质
GAP Name是蓝牙协议中定义的设备标准名称,它存储在Generic Access Profile服务中。具体来说:
- 服务UUID:0x1800(Generic Access)
- 特征UUID:0x2A00(Device Name)
这个名称相当于设备的"正式名称",具有以下特点:
- 存储在设备的GATT服务中
- 需要建立连接后才能读取
- 通常被iOS系统缓存
- 变更后可能需要重新连接才能更新
2.2 GAP Name的读取流程
在iOS中,获取GAP Name的过程是这样的:
- 设备与iOS建立蓝牙连接
- iOS发现Generic Access服务(0x1800)
- 读取Device Name特征(0x2A00)
- 将获取的名称缓存到系统中
这个过程解释了为什么GAP Name的更新会有延迟——因为iOS不会在每次扫描时都重新读取这个值。
3. Local Name:设备的"名片"
3.1 Local Name的广播机制
与GAP Name不同,Local Name是通过蓝牙广播包传输的。它有两种形式:
- Complete Local Name(AD Type 0x09)
- Shortened Local
