如何在 iOS 中使用 Core Bluetooth 获取蓝牙设备的唯一 ID

Posted

技术标签:

【中文标题】如何在 iOS 中使用 Core Bluetooth 获取蓝牙设备的唯一 ID【英文标题】:How to get unique ID of Bluetooth Device using Core Bluetooth in iOS 【发布时间】:2020-12-29 21:13:27 【问题描述】:

我正在开发一个应用程序,它需要 ios 设备提供蓝牙 UUID(从扫描/连接的设备获取蓝牙 UUID),然后将其发送到服务器以进行进一步开发。我在互联网上找不到任何答案。

我正在使用核心蓝牙扫描和连接设备并发送设备信息名称和 uuid,但 uuid 每 15-20 分钟更改一次。如何识别之前连接的设备以​​及如何获得唯一的 BLE 设备 UUID 以便我可以将标识符与之前添加的设备列表匹配。 请帮忙...

【问题讨论】:

【参考方案1】:

您可以获取发现的CBPeripheralidentifier 属性并连接到该属性。如果您连接,那么该设备的标识符在很长一段时间内都不会改变(实际上我认为它永远不会改变,但理论上它可以)。

一旦您有了外设标识符,您就可以保存该值,然后通过retrievePeripherals 而不是扫描来获取外设。

您将面临的问题是identifier 特定于发现外围设备的 iOS 设备。另一台 iOS 设备将获得相同外围设备的不同标识符。

如果您需要一个可跨 iOS 设备传输的外围设备的唯一标识符,那么您需要通过外围设备本身的特性公开这样的值,并让您的应用在连接后读取该特性值。

【讨论】:

好的@Paulw11 谢谢。我已将 BLE 标识符保存到后端数据库,并且可以使用 retrievePeripherals 搜索 BLE 设备,但是当我尝试连接它时,出现错误名称为“API MISUSE:取消未使用外围设备的连接 ,您是否忘记保留对它的引用?" 正如错误所说,您需要保持对 CBPeripheral 实例的强引用;即在一个属性中,而不仅仅是一个局部变量。 让 getData = self.centralManager.retrievePeripherals(withIdentifiers: ids) if getData.count > 0 if getData[0].identifier.uuidString == self.carsList[i].bluetooth_identifier getData[ 0].delegate = self // self.centralManager.cancelPeripheralConnection(getData[0]) self.centralManager.connect(getData[0], options: nil) 当我评论 self.centralManager.cancelPeripheralConnection 行时它没有给出任何错误。但没有调用 didConnect 外围函数。 getData 是一个局部变量。一旦该闭包或函数退出,它将被释放,这就是警告告诉你的。您需要在属性中保持对外围设备的强引用。 你能指导我如何做到这一点。

以上是关于如何在 iOS 中使用 Core Bluetooth 获取蓝牙设备的唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中使用 Core Bluetooth 获取蓝牙设备的唯一 ID

如何使用 Core Data 和 iOS 5 存储指南?

如何使用 Core Bluetooth 在 iOS 中设置 BLE 外围设备的名称

iOS Core Data Fetch Request,如何使用

iOS - 如何使用 Core Data 将 2 个实体迁移到 1 个?

如何在 iOS 中禁用 Firebase/Core 调试消息