【问题标题】:Android BLE automatic reconnections after pairingAndroid BLE 配对后自动重新连接
【发布时间】:2021-04-19 17:55:20
【问题描述】:

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

我们的外围设备应定期(但不经常)宣传并尝试向手机指示一些时间敏感的传感器数据。因此,我们希望手机随时准备好连接。

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

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

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

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

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

【问题讨论】:

    标签: android bluetooth bluetooth-lowenergy stm32 android-bluetooth


    【解决方案1】:

    结合使用这些技术:

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

    2. 使用connectGatt 并将autoConnect 设置为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

    【讨论】:

    • 我正在处理这个问题。看起来很有希望。但是设备真的不可能在没有我们的应用干预的情况下自动连接设备吗?
    • Android 永远不会自行连接到设备。它必须是需要连接的应用,或者是通过系统设置绑定的标准配置文件设备(如 HID)。
    • 我刚刚完成了您的建议。有用。谢谢你。展望未来,似乎为外围设备实现像 HID 这样的标准配置文件更接近我们想要的。您能否指导我了解有关 Android 通过系统设置连接到设备的确切期望/需要的更多信息?系统设置如何决定它可以连接到什么,不能连接到什么?例如,蓝牙 SIG 定义的心率配置文件是否会通过 Android 的系统设置进行连接?为什么会起作用?
    【解决方案2】:

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

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

    【讨论】:

    • 您是说建立绑定后,我可以在 Android 启动时启动我的应用程序并尝试 gatt.connect 且 autoconnect 等于 true?这应该允许我的应用程序在外围设备发布广告后立即连接到外围设备。但是不会有超时吗?如果这可行,它应该有望解决扫描问题。如果前台服务仅在外围设备连接时启动,那应该没问题。但是,只要 Android 可以尝试连接,我就必须显示前台服务。
    • 确实,发出自动连接时不会超时,您可以在应用启动后直接进行。有时连接手机需要一点时间,但您可以通过将广告间隔保持在 1000 毫秒以下来解决这个问题。尝试 500 毫秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多