配对后Android BLE自动重新连接

问题描述

我们希望 Android 自动连接到我们定制的 BLE 外设。

我们的外围设备应该定期(但很少)做广告并尝试向手机指示一些时间敏感的传感器数据。因此,我们希望手机随时可以连接。

一般情况下,您可以将智能手表与安卓设备配对,只要在范围内,安卓系统就会自动连接到智能手表。所以我们相信我们的用例应该是可行的。

我阅读了很多建议在连接时将“自动连接”参数设置为 true 的答案。我已经尝试过了,重新连接不会在重启后持续,甚至在 Android 上禁用和重新启用蓝牙后也不会持续。 This answer by Brian 说我应该在后台扫描,但 Android 做了这个 unrealistic。如果我使用前台服务,我的用户会讨厌该应用程序。如果我使用后台服务,我可能会错过 Android's Doze 期间外围设备的连接尝试,并且代码容易出错。

理想情况下,我想做一些类似于 Emil 在他的 answer here 中所说的。请阅读后续问题和回复

但是,我们无法通过 Android 的蓝牙设置看到我们的应用。我们只能使用我们的应用程序(或 nrf Connect)连接到外围设备并与之配对。无奈之下,我尝试修改外围设备的广告标志。然后我可以在Android的蓝牙设置中看到它。但是当我尝试使用 Android 的设置进行配对时,尝试失败,因为外围设备未处于“配对模式”。

我们正在构建应用程序和外围设备,因此我们可以更改两者。我想知道我们的用例是否可行,以及我们需要做什么才能使其正常工作。我们的外设使用的是 STM32WB。

解决方法

最好的方法是确保您的外围设备可以绑定。与它绑定后,您可以始终使用自动连接,因为 Android 存储有关绑定设备的信息,您不必再扫描它。因此,您可以避免在后台扫描的问题。

虽然这解决了扫描的需要,但您仍然需要处理应用程序在后台被杀死的情况。使用前台服务仍然是我所知的最佳解决方案。我不认为您的用户会因此讨厌您的应用...

,

结合使用这些技术:

  1. 绑定设备。由于蹩脚的 Android 蓝牙 LE API 设计在连接到设备时不将“地址类型”作为额外参数,因此可能需要这样做。当您使用蓝牙设备地址连接时,它会在绑定信息中查找具有此地址的设备,并使用相应的地址类型(随机或公共)。

  2. 使用 argType 并将 connectGatt 设置为 true。这意味着没有超时,以及如果连接断开则自动重新连接。即使外围设备开始广播需要数天或数周的时间,它仍然可以工作。

  3. https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#ACTION_STATE_CHANGED 并在蓝牙重新启动时重新启动连接。

  4. 在应用程序的进程中使用前台服务来防止操作系统终止进程。现在,用户可以根据需要在 Android 设置中隐藏烦人的通知。

  5. 在启动后听 https://developer.android.com/reference/android/content/Intent#ACTION_BOOT_COMPLETED 启动您的应用程序,包括您的前台服务。

  6. https://developer.android.com/reference/android/content/Intent#ACTION_PACKAGE_REPLACED 以在应用更新后自动重启您的应用。有关说明,请参阅 https://stackoverflow.com/a/2134443/556495