如何刷新服务/清除缓存?

Dom*_*nik 8 android caching bluetooth

在某些 Android 设备上(无论操作系统或蓝牙版本如何),BLE 设备连接后会出现问题。服务/特性不是最新的。当外围设备改变其服务时,通常会发生这种情况。(当应用程序未连接时)

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

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

该应用程序中还有一个功能,nRF Connect称为Refresh services

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

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

背景:我将 ionic 与本机 ble 插件一起使用。我可以直接在插件中实现本机代码。

Dom*_*nik 13

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

import java.lang.reflect.Method;
Run Code Online (Sandbox Code Playgroud)

在方法中执行此操作:

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

使用示例:

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

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

现在应该修复了。

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

  • 经过一番调查后,我们得出结论,我们的问题是导致缓存问题的 BLE 外设。根据 BLE 规范,没有静态 GATT 服务集的设备应声明一个名为 Service Changed 的​​服务:https://www. bluetooth.com/species/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.gatt.service_changed.xml (3认同)