iOS 以前绑定的 BLE 设备



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

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

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

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

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

帮助!

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

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

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

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

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

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

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

请注意,输入引脚对应于"配对"的过程。此过程的成功执行和随后的连接加密并不能证明设备已绑定。断开连接后,配对信息将丢失,设备需要再次配对 - 除非您存储了密钥,这使配对成为绑定。

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

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

如果设备之前已连接到操作系统,retrievePeripherals(withIdentifiers:)将返回设备。

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

最新更新