我们希望Android能够自动连接到我们定制的BLE外围设备。
我们的外围设备应该定期(但不经常(做广告,并尝试向手机指示一些时间敏感的传感器数据。因此,我们希望手机能够随时连接。
一般来说,你可以将智能手表与安卓系统配对,然后安卓系统会在智能手表处于范围内时自动连接到它。所以我们相信我们的用例应该是可行的。
我读了很多建议设置";自动连接";参数设置为true。我已经尝试过了,但在重新启动后,甚至在禁用并重新启用Android上的蓝牙后,重新连接都不会持续。Brian的回答说我应该在后台扫描,但Android让这变得不现实。如果我使用前台服务,我的用户会讨厌这个应用程序。如果我使用后台服务,我可能会在Android的Doze期间错过外围设备的连接尝试,代码变得容易出错。
理想情况下,我想做一些类似埃米尔在这里回答时所说的事情。请阅读后续问题和回答。
然而,我们无法通过Android的蓝牙设置查看我们的应用程序。我们只能使用我们的应用程序(或nrf connect(连接到外围设备并与其配对。在绝望中,我试着修改外围设备的广告标志。然后我可以在安卓的蓝牙设置中看到它。但当我尝试使用Android的设置配对时,尝试失败了,因为外围设备不在";配对模式";。
我们正在构建应用程序和外围设备,因此我们可以同时更改两者。我想知道我们的用例是否可行,以及我们需要做些什么才能让它发挥作用。我们正在使用STM32WB作为外围设备。
使用以下技术的组合:
-
粘合设备。这可能是由于糟糕的Android蓝牙LE API设计而需要的;地址类型";作为连接到设备时的额外参数。当您使用蓝牙设备地址进行连接时,它会在绑定信息中查找具有此地址的设备,并使用相应的地址类型(随机或公共(。
-
在
autoConnect
设置为true的情况下使用connectGatt
。这意味着没有超时,并且在连接断开时自动重新连接。即使外围设备需要几天或几周的时间才能开始广告,它仍然可以工作。 -
听https://developer.android.com/reference/android/bluetooth/BluetoothAdapter#ACTION_STATE_CHANGED并在重新启动蓝牙时重新启动连接。
-
在应用程序的进程中使用前景服务,以防止操作系统破坏进程。如今,如果用户愿意,他们可以在Android设置中隐藏恼人的通知。
-
听https://developer.android.com/reference/android/content/Intent#ACTION_BOOT_COMPLETED启动后启动您的应用程序,包括您的Foreground服务。
-
听https://developer.android.com/reference/android/content/Intent#ACTION_PACKAGE_REPLACED以在应用程序更新后自动重新启动您的应用程序。看见https://stackoverflow.com/a/2134443/556495获取一些说明。
最好的方法是确保外围设备可以绑定。一旦你与它绑定,你就可以随时使用自动连接,因为Android存储了绑定设备的信息,你不必再扫描它了。因此,您可以避免后台扫描的问题。
尽管这解决了扫描的需要,但一旦你的应用程序在后台,你仍然需要处理它被杀死的问题。据我所知,使用前台服务仍然是最好的解决方案。我不认为你的用户会因为它而讨厌你的应用程序…