Android Beacon库-扩展BluetoothMedic以进行无条件重置吗?

时间:2018-07-22 09:45:22

标签: android ibeacon altbeacon ibeacon-android android-ibeacon

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

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

public void cycleBluetooth(上下文上下文){...}

,并将其附加到按钮上。我发现这将还原BLE功能。因此,我想知道如果每15分钟无条件重置BLE会发生什么情况。我加了:

public static final 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我是否建议添加一个回调,以便应用程序可以了解蓝牙是否已循环使用?也许作为启用PowerCycleOnFailures()的参数

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

1 个答案:

答案 0 :(得分:0)

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

对于扫描,如果使用错误代码onScanFailed调用SCAN_FAILED_APPLICATION_REGISTRATION_FAILED回调,错误代码的值为2,the module considers it worthy of a power cycle.

对于广告,如果使用错误代码onStartFailed调用ADVERTISE_FAILED_INTERNAL_ERROR回调,错误代码的值为4,the module considers it worth of a power cycle.

这些值是通过实验确定的,见证了在某些设备上,一旦使用这些值调用错误回调,设备上的蓝牙如果不关闭然后再打开,将无法再次工作。您可以看到有关此in this thread的讨论。

您可能希望查看Asus P00A上是否还有其他错误代码,这些错误代码表示值得循环蓝牙的问题。为此,请等待失败,然后查看是否尝试开始扫描,并使用不同的错误代码调用onScanFailed回调。如果存在此类错误代码,则这将是比定期重新启动蓝牙电源更好的解决方案,因为重新启动蓝牙电源确实会破坏BLE GATT连接以及蓝牙经典功能(如扬声器)的操作。 Android信标库本身可以从这些电源循环中恢复正常,尽管它显然要等到蓝牙重新启动后才能检测到信标。

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

如果您有兴趣在库中扩展这些功能,请随时在Github存储库中打开一个问题,如果您有共享的代码,则发出“拉取请求”。