Android BLE 配对后自动重连

Android BLE automatic reconnections after pairing

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

我们的外围设备应该定期(但很少)发布广告并尝试向 phone 指示一些时间敏感的传感器数据。因此我们希望 phone 随时准备好连接。

通常,您可以将智能手表与 Android 配对,然后 Android 会在智能手表处于范围内时自动连接到智能手表。所以我们相信我们的用例应该是可行的。

我读了很多建议在连接时将“autoconnect”参数设置为 true 的答案。我已经尝试过了,重新连接不会通过重启持续存在,甚至在 Android 上禁用并重新启用蓝牙后也不会持续。 says I should scan in the background, but Android made this . If I use a foreground service, my users will hate the app. If I use a background service, I may miss the peripheral's attempts to connect during Android's Doze 代码变得容易出错。

理想情况下,我想做类似 Emil said in his answer here 的事情。请阅读后续问题和回复。

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

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

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

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

结合使用这些技巧:

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

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

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

  4. 在您的应用程序进程中使用前台服务以防止 OS 终止进程。现在,用户可以根据需要在 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 to automatically restart your app after an app update. See 了解一些说明。