首页 > 解决方案 > BLE:将 Android 中心重新连接到 iOS 外围设备

问题描述

经过几天的研究和反复试验,我和我的同事们不得不希望 StackOverflow 社区有一个可行的解决方案。

我们有一个安卓智能手表。我们开发了一个充当 BLE 中心的应用程序。该应用程序显示一个 QR 码,编码一个 UUID,每个智能手表都是唯一的。在显示 QR 码时,它正在积极扫描使用该 UUID 广告服务的设备。

我们还开发了一个 iOS 应用程序,它可以扫描该二维码并使用它收到的服务 UUID 开始广告。然后,Android Smartwatch 会非常快速地连接到 iOS 设备。

Smartwatch 的用途之一是显示来自 iOS 设备的推送通知。所以当连接建立成功时,Smartwatch-App 会订阅 ANCS 数据源和通知源特性。这将启动“Just Works”配对,因此您只需在 iOS 设备上单击“配对”。之后,您必须允许将 iOS 通知共享到 Smartwatch,然后 Smartwatch 才能成功接收通知。ANCS 也是 iOS 设备必须扮演外围角色的原因。

直到这里一切正常。

当用户离开蓝牙范围或在 iOS 设备上禁用并启用蓝牙时,应触发自动重新连接。当 iOS 应用程序处于前台时,它会重新连接。不幸的是,当 iOS 应用程序在后台时它不起作用。这可能与以下事实有关,即当应用程序处于后台时,iOS 设备未使用所需的 UUID 进行广告,如 CoreBluetooth 文档中所述:

All service UUIDs contained in the value of the CBAdvertisementDataServiceUUIDsKey advertisement key are placed in a special “overflow” area; they can be discovered only by an iOS device that is explicitly scanning for them.

我们尝试了许多不同的方法来从 Android Smartwatch 重新连接到 iOS。据我了解,它应该在使用 autoConnect=false 进行第一个 connectGatt 以及连接丢失时使用 autoConnect=true 在丢失的设备上调用 connectGatt 时工作,但它永远不会重新连接。至少不会在 15 分钟内。再次扫描也不起作用,因为 UUID 不再在后台公布。

我们还尝试让 Android 设备作为外围设备,以便 iOS 可以连接到它。连接后,我们将数据写入“INITIATE_ANCS”-characteristic 并让 Android 设备在传递给 onCharacteristicWrite 的设备上调用 connectGatt。这导致了有趣
的行为: - 连接正常,我们可以从 iOS 读取 Smartwatch-Characteristic。
- 当订阅 ANCS 特性时,它会启动配对。但不是“Just Works”配对,而是在 iOS 设备上显示了一个 6 位代码,我们必须在 Smartwatch 上输入该代码。
- 每次新连接时都会启动配对,它总是在 Android 和 iOS 的系统设备管理器中创建一个新设备。
- 当 iOS 应用程序处于后台时,配对未启动。

我们确实进行了彻底的研究,但找不到解决方案。我们是否理解 BLE for iOS 和 Android 的工作方式有什么问题?我们真的希望在这里找到一位专家,他知道如何才能使重新连接正常工作。

编辑:Android 设备在 Android 5.1.1 上运行,目前没有更新选项。iOS 测试设备运行 iOS 13.3,应兼容 iOS 13+

标签: bluetooth-lowenergycore-bluetoothandroid-ble

解决方案


推荐阅读