Android BLE:“扫描失败,原因是应用程序注册UUID失败”

sta*_*man 6 android bluetooth bluetooth-lowenergy android-bluetooth rxandroidble

我正在使用该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
Run Code Online (Sandbox Code Playgroud)

是否有人对导致此问题的原因有任何想法,或者可以采取什么措施加以解决?

小智 8

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

总体而言,在较旧的 Android 设备中完全避免该问题在某种程度上是不可避免的,但您可以通过仔细计时扫描/停止扫描/连接/断开连接/循环来缓解该问题。

  • 你救了我的命。这应该是一个可以接受的答案。您确实无法在“BluetoothAdapter.STATE_ON”状态后直接开始扫描。你得等几秒钟。我不知道具体要多久,但似乎等待 5 秒对我来说是有效的。 (3认同)
  • 惊人的发现大卫。尝试在断开连接后立即重新连接确实会导致此“应用程序注册失败”错误...然后可以通过 GattCallback 的 onScanFailed() 方法捕获该错误。这不仅适用于旧设备,尽管在旧设备上更常见,但在我使用最新操作系统的 Galaxy S10 上也发生过这种情况。 (3认同)

Ale*_*nin 5

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

close()在断开所有设备的连接后,在对对象启动新的扫描调用之前BluetoothGatt