【问题标题】:EAAccessory.Name is not matching the paired device nameEAAccessory.Name 与配对的设备名称不匹配
【发布时间】:2018-11-22 12:56:04
【问题描述】:

我有一个 iOS 应用程序。我可以成功连接到我配对的 EAAccessory (Bluetooth Classic)。我能够从通过 EAAccessory 对象公开的设备中提取信息。我注意到的一件事是配对设备的名称(在我的设置 -> 蓝牙 -> 我的设备列表中)与我的 EAAccessory 对象公开的设备名称不匹配。我觉得这很奇怪。

有什么方法可以通过我的 iOS 应用获取设备的实际名称(设置页面中的那个)?

【问题讨论】:

  • 如何使用 UIDevice.current.name 获取设备名称和 UIDevice.current.model 获取设备型号。
  • @KeyurTailor UIDevice 不是我当前的设备而不是蓝牙连接的设备吗?

标签: ios swift xcode bluetooth eaaccessory


【解决方案1】:

你没有提到这是蓝牙经典还是 BLE?,我下面的答案是蓝牙经典,我记得我以前见过类似的东西,这是我到目前为止的发现:

具体看一下Accessory Design Guidelines2.1.52.1.8 部分。

2.1.5:

在蓝牙发现过程中,Apple 产品倾向于 显示发现的配件的友好名称。 2.1之前 Apple 产品必须符合的蓝牙规范版本 建立与附件的连接并执行远程名称请求, 这需要功率、天线时间和用户时间。扩展查询 响应功能,在蓝牙 2.1 中引入,让配件发送 其本地名称和其他信息作为查询响应的一部分 从而提高发现的速度和效率 过程。本地名称应与配件的标记相匹配,并且 包装并且不包含':'或';'。

同时查看设备类别部分

2.1.8:

与 Apple 产品兼容的每个配件都必须 使用定义的蓝牙 SIG 准确设置其设备类别 主要设备类和次要设备类。见第 3 卷 C 部分, 蓝牙核心规范 5.0 版中的第 3.2.4 节。为了 例如,用于在车辆中操作的音频/视频附件 应将主要设备类设置为音频/视频,将次要设备类设置为 汽车音响。

您的情况可能只是配件有一个友好的名称,而 iOS 没有在设置时清除该名称的缓存,或者它可能是固件方面的错误实现。

如果这不能回答您的问题,请告诉我您在设置和应用程序中看到的名称,以及固件版本的配件类型(如果适用),我会尝试进一步查看进入它。

【讨论】:

  • 对不起,我以为我的推杆“EAAccessory”会表示它是经典的。是的,确实是蓝牙经典。遗憾的是,它适用于没有太多文档的自定义 MFi 设备。在 Android 上,使用 RFComm,它能够看到正确的设备名称。我问了这个问题,我得到的只是这条消息——“这个名字是蓝牙广告的一部分。”。我不确定是否可以通过 EAAccessory 框架访问“广告”数据。
  • 另外,我不希望赏金点白白浪费掉。我会给予你帮助,但如果你能继续给予任何帮助,我们将不胜感激。
  • 非常感谢您的赏金:)。您是否有机会使用蓝牙嗅探器?还有,它是什么配件?显示的“友好”名称是什么?
  • 如果可以的话,我会在帖子外给你发消息。
【解决方案2】:

如果您有广告 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])
    }
}

这个代码是从objective-C转换成swift的,如果你熟悉objective C那么原始代码是here.

【讨论】:

  • 对不起,我想我需要指定它是否是蓝牙经典。我认为这只适用于 BLE 正确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2017-10-04
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2010-09-06
  • 2016-08-02
相关资源
最近更新 更多