我有一个 iOS 应用程序。我可以成功连接到配对的 EAAccessory (Bluetooth Classic)。我能够从通过 EAAccessory 对象公开的设备中提取信息。我注意到的一件事是配对的设备名称(在我的设置 -> 蓝牙 -> 我的设备列表中)与我的 EAAccessory 对象公开的设备名称不匹配。我觉得这很奇怪。
有什么方法可以通过我的 iOS 应用程序获取设备的实际名称(设置页面中的那个)?
我有一个 iOS 应用程序。我可以成功连接到配对的 EAAccessory (Bluetooth Classic)。我能够从通过 EAAccessory 对象公开的设备中提取信息。我注意到的一件事是配对的设备名称(在我的设置 -> 蓝牙 -> 我的设备列表中)与我的 EAAccessory 对象公开的设备名称不匹配。我觉得这很奇怪。
有什么方法可以通过我的 iOS 应用程序获取设备的实际名称(设置页面中的那个)?
你没有提到这是蓝牙经典还是 BLE?,我下面的答案是蓝牙经典,我记得我以前见过类似的东西,这是我到目前为止的发现:
请查看附件设计指南、部分2.1.5
和2.1.8
具体内容。
2.1.5:
在蓝牙发现过程中,Apple 产品更喜欢显示已发现配件的友好名称。在蓝牙规范的 2.1 版本之前,Apple 产品必须建立与配件的连接并执行远程名称请求,这需要电源、天线时间和用户时间。蓝牙 2.1 中引入的扩展查询响应功能允许附件发送其本地名称和其他信息作为查询响应的一部分,从而提高发现过程的速度和效率。本地名称应与配件的标记和包装相匹配,并且不包含“:”或“;”。
另请查看设备类别部分
2.1.8:
每个与 Apple 产品兼容的配件都必须使用蓝牙 SIG 定义的主要设备类别和次要设备类别准确设置其设备类别。请参阅蓝牙核心规范 5.0 版中的第 3 卷 C 部分第 3.2.4 节。例如,打算在车辆中运行的音频/视频配件应将主要设备类别设置为音频/视频,将次要设备类别设置为汽车音频。
您的情况可能只是配件有一个友好名称的事实,而 iOS 没有在设置时清除该名称的缓存,或者它可能是固件方面的错误实现。
如果这不能回答您的问题,请告诉我您在设置和应用程序中看到的名称,以及固件版本的配件类型(如果适用),我会尝试进一步研究。
如果您有广告 UUID,则可以获得配对/连接设备的列表。
var centralQueu = DispatchQueue(label: "A_NAME")
centralManager = CBCentralManager(delegate: self, queue: centralQueu, options: [CBCentralManagerOptionRestoreIdentifierKey: "RESTORE_KEY", CBCentralManagerOptionShowPowerAlertKey: true])
ServiceUUIDs = [CBUUID(string: "THE_UUID")]
//the array of CBUUIDs which you are looking for
您需要找到您感兴趣的服务 UUID:
var options = [
CBCentralManagerScanOptionAllowDuplicatesKey : (1)
]
centralManager.scanForPeripherals(withServices: [CBUUID(string: SERVICE_UUID)], options: options)
centralManager.retrieveConnectedPeripherals(withServices: ServiceUUIDs)
这样处理 didDiscoverperipheral :
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
discoveredPeripheral = peripheral
if !mRemoteDevices.contains(discoveredPeripheral) {
let peripherels = centralManager.retrievePeripherals(withIdentifiers: [discoveredPeripheral.identifier])
mRemoteDevices.append(peripherels[0])
}
}
如果您熟悉目标 C,则此代码将从目标 C 转换为 swift,那么原始代码就在这里。