首页 > 解决方案 > Android 信标库 - 扩展 BluetoothMedic 以进行无条件重置?

问题描述

我有一个华硕 P00A 平板电脑(Android 7.0,API24),BLE 在几个小时后停止。(这会影响任何 BLE 应用程序,而不仅仅是我使用 Android 信标库的应用程序)。如果我手动关闭 BLE,然后重新打开,应用程序将重新开始工作。

BluetoothMedic 自动修复系统不适用于我的平板电脑。它每 15 分钟运行一次,但不会发现故障,因此不会“重启”蓝牙。但是,我破解了 BluetoothMedic 类,添加了以下内容:

公共无效循环蓝牙(上下文上下文){...}

并将其附加到按钮上。我发现这将恢复 BLE 功能。所以我想知道如果我每 15 分钟无条件地重置 BLE 会发生什么。我补充说:

公共静态最终 int ALWAYS_RESET = 4;

然后调用 medic.enablePeriodicTests(context, BluetoothMedic.ALWAYS_RESET);

并在 BluetoothTestJob.onStartJob() 中添加代码,然后调用 BluetoothMedic.cycleBluetooth()。这符合预期,到目前为止,我的应用程序已经完美运行了 18 个小时。

我对任何建议都感兴趣,例如:

1 除了BluetoothMedic 中的两个测试之外,我是否可以运行任何测试来检测平板电脑的蓝牙已停止?(我很乐意尝试)。

2 对我上面描述的黑客有任何评论吗?每15分钟无条件重置蓝牙应该可以吗?

3 如果蓝牙被重置(“电源循环”),那么 Android 蓝牙库的其余部分是否可以接受?也就是说,它会继续之前设置的监控和测距,还是应用程序代码需要设置采取任何行动才能让事情重新开始?请注意,这将适用于通过现有 enablePowerCycleOnFailures() 代码以及我上面的 ALWAYS_RESET hack 进行的重置。(如果电源循环出现在错误的时间,可能会发生一些崩溃?)。

4 我可以建议添加一个回调,以便应用程序可以了解蓝牙是否已循环?也许作为 enablePowerCycleOnFailures() 的参数

5 我知道操作系统可以停止后台活动,尤其是在 Android 8 中。这是否也会影响 enablePeriodicTests() 设置的常规 15 分钟测试?

标签: androidibeaconaltbeaconibeacon-androidandroid-ibeacon

解决方案


当前构建的 Android Beacon LIbraryBluetoothMedic依赖于扫描失败(或广告失败)返回的操作系统错误代码来确定蓝牙堆栈是否处于需要重启电源的不良状态。

对于扫描,如果使用值为 2onScanFailed的错误代码调用回调,则模块认为它值得重新启动。.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED

对于广告,如果onStartFailed调用回调时错误代码的ADVERTISE_FAILED_INTERNAL_ERROR值为 4,则模块认为它值得重新上电。.

这些值是通过实验确定的,见证了在某些设备上,一旦使用这些值调用错误回调,设备上的蓝牙将无法再次工作,除非将其关闭并重新打开。您可以在此线程中看到对此的讨论。

您可能想查看华硕 P00A 上是否有其他错误代码表明存在值得循环蓝牙的问题。为此,请等待失败,然后查看是否尝试开始扫描调用带有不同错误代码的 onScanFailed 回调。如果存在此类错误代码,这将是比定期循环电源到蓝牙更好的解决方案,因为循环电源到蓝牙确实会中断 BLE GATT 连接和蓝牙经典功能(如扬声器)的操作。Android 信标库本身从这些电源循环中恢复得很好,尽管在蓝牙重新打开之前它显然不会检测到信标。

由于 BluetoothMedic 使用 Android Job Scheduler 进行定期测试,因此不受 Android 8+ 的后台限制的影响。

如果您有兴趣在库中增加这些功能,请随时在 Github 存储库中打开一个问题,如果您有代码要共享,请发出请求请求。


推荐阅读