iOS 之前绑定的 BLE 设备

Posted

技术标签:

【中文标题】iOS 之前绑定的 BLE 设备【英文标题】:iOS Previously Bonded BLE Devices 【发布时间】:2018-01-20 21:46:50 【问题描述】:

我到处寻找这个问题的答案,但还没有找到明确的答案...请帮助...

我创建了一个应用程序,该应用程序可以连接并绑定到需要 pin 的 BLE 设备。在触发 ios 蓝牙绑定对话框之前,会务实地创建并显示给用户。到现在为止还挺好。如果用户在绑定对话框中正确输入了 pin,则手机和 BLE 设备现在已绑定,每个人都很高兴。

现在用户关闭应用并终止蓝牙连接。

当应用再次启动并发现 BLE 设备时,有没有办法知道绑定已经发生?基本上,如果设备已经绑定,我不想向用户重新显示 pin。

我目前正在保存 BLE 设备的标识符并调用 RetrievePeripheralsWithIdentifiers 以查看该设备之前是否已连接。这可行,但如果用户转到蓝牙列表并选择“忘记此设备”,RetrievePeripheralsWithIdentifiers 仍会返回该外围设备。我试过重启手机,卸载并重新安装应用程序。似乎没有什么能让 iOS 忘记在过去的某个时候,那个标识符是连接的......

救命!

【问题讨论】:

【参考方案1】:

iOS 没有任何用于配对或绑定的 API。 iOS 只会根据其他设备的请求或读取需要安全的特征时提示配对对话框。您的应用甚至不知道正在显示配对对话框、配对完成时或当前链接何时/是否已加密。

如果设备已经绑定,并且可以使用iOS在之前的配对过程中存储的LTK(从设备也有),那么链接将自动加密,因此不会显示新的配对对话框。

以前连接的设备列表与绑定的设备无关。这只是以前已知设备的列表。

【讨论】:

【参考方案2】:

我认为您有点混淆了概念。绑定本质上意味着“拥有相同的长期密钥”。

因此,如果您有两台设备,并且希望它们打开加密连接,则两台设备只需检查它们是否具有与相应设备关联的密钥,并尝试使用此密钥来加密消息。

这就是为什么设备无法真正检查绑定是否仍然存在的原因。每个设备都可以检查自己的密钥是否仍然存在,但它如何知道其他设备是否仍然拥有密钥?一旦一方忘记了钥匙,就失去了联系。

我对 iOS 没有太多经验,但我认为它们应该是获取存储的长期密钥以检查是否存在与蓝牙地址关联的 LTK 的功能。或者,应该可以 使用外部存储,这样您就可以定义一个存储所有密钥的文件,而不是堆栈为您执行此操作,并在需要时为堆栈提供密钥。 (至少,这适用于其他实现。)在这种情况下,您可以直接查看文件以检查设备是否已绑定。

注意输入pin对应“配对”的过程。此过程的成功执行和随后的连接加密并不能证明设备已绑定。断开连接后,配对信息会丢失,设备需要重新配对 - 除非您存储了密钥,这会使配对成为绑定。

【讨论】:

【参考方案3】:

我在我的应用中遇到了类似的问题,如果用户从设置中选择“忘记此设备”,那么我的应用将不知道。

您可以使用retrieveConnectedPeripherals(withServices: [CBUUID]) 来检查您的设备是否已连接到操作系统。如果是,则继续您的其他功能,否则再次显示 PIN(或任何您想要的)。

retrievePeripherals(withIdentifiers:) 将返回之前连接到您的操作系统的设备。

我正在我的应用程序中执行此操作。希望这会有所帮助。

【讨论】:

以上是关于iOS 之前绑定的 BLE 设备的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中自动删除 BLE 设备绑定

在 Android 上无需绑定的 BLE 配对

BLE在Android上没有绑定的配对

使用 MAC ios 连接到 BLE 设备

未调用 BLE 外设委托

iOS 与配对的 BLE 设备进行安全通信