【问题标题】:How to refresh services / clear cache?如何刷新服务/清除缓存?
【发布时间】:2018-11-17 05:49:01
【问题描述】:

在某些安卓设备上(无论操作系统或蓝牙版本),BLE 设备连接后出现问题。 服务/特性不是最新的。这通常发生在外围设备更改其服务时。 (应用未连接时)

在这种状态下,无法使用该设备。要验证此问题,您可以发现所有特征,并且您会看到从 android 设备的缓存中加载了过时(不再存在)的特征。

当前解决方案(不是以编程方式) 在 android 的 os 系统设置中重置蓝牙启用状态。 (关闭和打开蓝牙状态)

nRF Connect 应用程序中还有一个名为 Refresh services 的功能

(忽略“解析已知特征”这不是问题) 这个项目(nRF Connect)不是开源的。我不知道如何“刷新服务”/“清除缓存”以避免在连接时加载错误的服务/特征。

如何在android(java)中实现这个?

背景:我正在使用带有本机 ble 插件的 ionic。我可以直接在插件中实现本机代码。

【问题讨论】:

    标签: android caching bluetooth


    【解决方案1】:

    通常,Android 不应缓存未绑定的设备。但它忽略了规则。 要刷新缓存,请使用反射调用隐藏方法。

    import java.lang.reflect.Method;
    

    在方法中这样做:

    try {
      // BluetoothGatt gatt
      final Method refresh = gatt.getClass().getMethod("refresh");
      if (refresh != null) {
        refresh.invoke(gatt);
      }
    } catch (Exception e) {
      // Log it
    }
    

    用法示例:

    如果您发现特征缓存有问题。

    1. 调用清除缓存的方法。 (等待几秒钟)。
    2. 重新连接(断开 -> 连接)。

    现在应该修复了。

    注意:刷新方法没有完整的回调。

    【讨论】:

    • 感谢您提供此信息。我会检查一下...您在 Android 9 上仍有缓存问题吗?我还没有测试过这个版本。
    • 经过一番调查,我们得出结论,我们的问题是导致缓存问题的 BLE 外围设备。根据 BLE 规范,没有静态 GATT 服务集的设备应声明一个名为 Service 的服务已更改:bluetooth.com/specifications/gatt/…
    • BLE 规范还声明不得缓存未绑定的设备。但无论如何Android都会这样做。那是一个错误。但无论如何。我不知道什么时候会修复缓存错误。 Android 上的 BLE 仍然有点实验性。
    • 我现在对此进行了调查并得出结论,这适用于 Android 9 和 10。显然 refresh() 是“不受限制的灰名单”(注释 @UnsupportedAppUsage),这意味着它应该可以工作
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2020-09-05
    • 2023-01-29
    • 2013-05-08
    • 2019-05-06
    相关资源
    最近更新 更多