Android蓝牙:"Scan failed, reason app registration failed for UUID"

Android BLE: "Scan failed, reason app registration failed for UUID"

我正在使用 RxAndroidBle 库开发一个应用程序,该库大约每 30 秒定期执行 BLE 扫描,每分钟左右执行一些 BLE 操作。几个小时后,通常在 5 到 24 小时之间,扫描停止工作。每次应该开始扫描时,我都会得到:

09-05 09:08:37.160 8160-8160/myapp D/BluetoothAdapter: startLeScan(): null
09-05 09:08:37.165 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:37.165 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:37.165 8160-8160/myapp D/BluetoothLeScanner: Start Scan
09-05 09:08:37.165 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:37.165 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:37.170 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:37.170 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:37.210 8160-12850/myapp D/BluetoothLeScanner: onClientRegistered() - status=133 clientIf=0
09-05 09:08:37.210 8160-12850/myapp D/BluetoothLeScanner: Registration failed, unregister clientIf = 0
09-05 09:08:37.215 8160-8160/myapp D/BluetoothLeScanner: Scan failed, reason app registration failed for UUID = 4c321920-a2b7-449a-bc24-ea4361f7a255
09-05 09:08:44.150 8160-8160/myapp V/myapp.debug: unsubscribing scan
09-05 09:08:44.150 8160-8160/myapp V/myapp.debug: Clearing scan subscription
09-05 09:08:44.150 8160-8160/myapp D/BluetoothAdapter: stopLeScan()
09-05 09:08:44.150 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:44.155 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:44.155 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:44.155 8160-8160/myapp D/BluetoothAdapter: STATE_ON
09-05 09:08:44.155 8160-8160/myapp D/BluetoothLeScanner: could not find callback wrapper

有没有人知道是什么原因导致了这个问题,或者可以采取什么措施来解决这个问题?

问题是,经过几次连接后,您达到了 BluetoothGatt 个对象的最大数量。

在对 BluetoothGatt 对象开始新的扫描调用 close() 之前断开所有设备之后。

在 Android 的旧实现中,蓝牙适配器启用时间和扫描速度之间似乎存在竞争条件。您可以通过尝试使用禁用的蓝牙适配器或正在转换的蓝牙适配器(或具有打开的连接并正在尝试读取)进行扫描来触发此错误。在我的应用程序中导致它的根本问题是蓝牙子系统无法获得新的蓝牙插座。上面的答案(关贸总协定资源中的运行)可能是其中的一部分。在较旧的 Android 设备中避免此问题的总体逻辑是:1. 确保每 5 次扫描一次 disable/enable 蓝牙适配器。这似乎有助于清除旧的缓存数据。 2. 确保在未启用蓝牙适配器时不要尝试启动扫描(如果您经常 disabling/enabling,则可以这样做)。 3. 确保在断开 GATT 接口和进行下一次扫描之间有延迟。 4. 请勿尝试同时读取超过 3 个设备的 GATT 特性。

总体而言,在较旧的 Android 设备中完全避免该问题是不可避免的,但您可以通过仔细安排 scan/stop scan/connect/disconnect/ 周期来缓解它。