Bluetooth GATT - onServicesDiscovered(BluetoothGatt gatt,int status)不包含所有服务

时间:2015-04-16 12:06:41

标签: android bluetooth-lowenergy android-bluetooth

我有连接到的代码,然后尝试发现自定义BLE服务器设备广告自定义服务所提供的所有服务。

上的代码有效
  • 使用Android 5.1的Nexus 5
  • Samsung SM-T320 with Android 4.4.2
  • 中兴Blade Vec 4G与Android 4.4.2

上的代码不起作用
  • 三星SM-T360与Android 4.4.4
  • Samsung GT-I9195与Android 4.4.2

在发生故障的设备上,它经常发现一个(两个)广告相同BLE服务的设备上的所有BLE服务。重新启动Android设备和/或摆弄wifi / bt使其发现其他BLE设备上的所有服务但不是第一个(!)。

有人知道三星设备在BLE服务发现方面存在突出问题吗?

拥有所有服务:

04-16 13:28:00.999: V/ScanningState(9741): onServicesDiscovered()
04-16 13:28:00.999: I/ScanningState(9741): The device has service 00001800-0000-1000-8000-00805f9b34fb
04-16 13:28:00.999: I/ScanningState(9741): The device has service 0000180a-0000-1000-8000-00805f9b34fb
04-16 13:28:00.999: I/ScanningState(9741): The device has service 0000180f-0000-1000-8000-00805f9b34fb
04-16 13:28:00.999: I/ScanningState(9741): The device has service f0ba0000-c6b5-11e2-8b8b-0800200c9a66
04-16 13:28:00.999: I/ScanningState(9741): The device has service f0ba0100-c6b5-11e2-8b8b-0800200c9a66
04-16 13:28:00.999: I/ScanningState(9741): The device has service f0ba1100-c6b5-11e2-8b8b-0800200c9a66

缺少服务:

04-16 14:05:31.179: V/ScanningState(10710): onServicesDiscovered()
04-16 14:05:31.179: I/ScanningState(10710): The device has service 00001800-0000-1000-8000-00805f9b34fb
04-16 14:05:31.179: I/ScanningState(10710): The device has service 0000180a-0000-1000-8000-00805f9b34fb
04-16 14:05:31.179: I/ScanningState(10710): The device has service 0000180f-0000-1000-8000-00805f9b34fb
04-16 14:05:31.179: I/ScanningState(10710): The device has service f0ba0000-c6b5-11e2-8b8b-0800200c9a66
04-16 14:05:31.179: W/ScanningState(10710): Device is missing sensor service
04-16 14:05:31.179: W/ScanningState(10710): Device is missing storage service
04-16 14:05:31.179: I/ScanningState(10710): Candidate did not support required services

对于第二次(失败)扫描,我也看到以下日志:

04-16 14:24:26.310: D/BtGatt.GattService(2856): onGetCharacteristic() - address=00:07:80:13:14:33, status=133, charUuid=00000000-0000-0000-0000-000000000000, prop=0
04-16 14:24:26.310: D/BtGatt.btif(2856): btif_gattc_get_included_service
04-16 14:24:26.310: D/BtGatt.btif(2856): btgattc_handle_event: Event 1011
04-16 14:24:26.310: E/bt-btif(2856): No server cache available
04-16 14:24:26.310: E/BtGatt.btif(2856): bta_to_btif_uuid: Unknown UUID length 25104!

更新

进一步调查表明,如果一次只有一个BLE服务设备,onServicesDiscovered(BluetoothGatt gatt,int status)将返回所有BLE服务。下层有哪些资源泄漏?

2 个答案:

答案 0 :(得分:5)

好的,所以简短的回答是不要在主线程的任何其他线程上调用connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)

如果我在连接到设备时遇到onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord),我会在与第一个设备断开连接后缓存该引用,然后在回调connectGatt()内调用onConnectionStateChange(BluetoothGatt gatt, int status, int newState)。这导致了这个问题中描述的问题。

答案 1 :(得分:1)

我尝试在UI上运行,有更多机会发现,但还不够(工作1/10时间)。

此问题在Nexus 5 4.4.2或5.1和Nexus 4 4.4上没有发生,但在Samsung S5(4.4.2)上(至少)。

技巧(在许多主题中解释)是在调用SystemClock.sleep(3000);之后在我的服务中设置一个睡眠mBluetoothGatt.discoverServices()。我试着把它放在前面,但没有改变。

希望可以帮助别人。