Android BLE 堆栈缓存服务?

Android BLE stack caching services?

我正在开发第一个使用低功耗蓝牙的应用程序。我控制着两端——服务器 运行 在 Arduino Nano 33 BLE 上运行——它有一个 nRF 芯片组。

服务器有点奇怪 - 它实际上 运行 是两组代码之一,具体取决于它的启动方式(主要是因为我只有一个 Nano BLE)。所以它可以是两个服务器之一(相同的 MAC 地址),但是服务器 A 支持一个服务及其特征集,服务器 B 支持另一个服务及其特征。这两种服务显然都有唯一的 UUID。

问题是,当应用程序已连接到 - 比如说 - A,并且服务器以伪装 B 关闭并重新打开时,在连接和发现服务时,应用程序仍然 'discovers' A 服务 UUID,而不是 B.

反复重启服务器没有任何区别,在 Android 设备上禁用和重新启用蓝牙,或重新启动应用程序也没有任何区别。唯一有效的方法是 Android 设备完全重启。

在我看来,BLE 堆栈正在缓存它认为特定服务器 MAC 地址的功能。

找不到解决这个问题的方法(不要认为我可以更改 Nano BLE MAC 地址),但是当我 运行 nRF 诊断 Android 应用程序时,它确实找到合适的服务,所以它必须是可能的。不过,它所做的总是首先通过 BLE 扫描过程,因此可能会刷新任何缓存。

但是,我真的不想强制执行扫描,因此如果您有任何意见或有关如何清除任何缓存的详细信息,我将不胜感激。

停止按下:

找到了这个问题的答案:'Android Bluetooth not discovering the characteristic after changing UUID'

似乎 BLE 堆栈在不确定的时间内缓存服务等,以加快未来的服务发现。如果 MAC 地址的服务确实发生了变化(就像我的),那就有点问题了,但我想这并不是真正预期的行为(尽管据我所知并没有被禁止)。不知道它被缓存了多长时间,但我注意到它在一夜之间自行整理出来 - 当然在下一次更改时出错了。

有一个清除缓存的内部 BluetoothGatt.refresh() 方法 - 但未发布。 link 展示了如何通过反射来实现它,它似乎确实有效。在旧的 Nexus 7 2013 运行 6.0.1 上,即。不确定后来的操作系统,因为最近 Google 似乎不赞成反射。即将在 Pixel 2 上试用 运行 Android 11.