Android 每个连接请求都被视为直接连接请求+;安卓ble

Android 每个连接请求都被视为直接连接请求+;安卓ble,android,bluetooth-lowenergy,android-bluetooth,Android,Bluetooth Lowenergy,Android Bluetooth,我们正在编写一个ble应用程序,其中希望与要连接的外围设备建立持久连接。出于同样的目的,我们希望在失去现有连接时重新连接外围设备。因此,我们的android应用程序作为一个中心,只是试图通过调用bluetoothdevice.connectgatt(自动连接为true)创建新的bluetoothgatt对象来重新连接 但每当我们尝试这样做时,我们的重新连接就会失败 12-02 21:47:11.865: D/BluetoothGatt(31963): onClientConnectionStat

我们正在编写一个ble应用程序,其中希望与要连接的外围设备建立持久连接。出于同样的目的,我们希望在失去现有连接时重新连接外围设备。因此,我们的android应用程序作为一个中心,只是试图通过调用bluetoothdevice.connectgatt(自动连接为true)创建新的bluetoothgatt对象来重新连接

但每当我们尝试这样做时,我们的重新连接就会失败

12-02 21:47:11.865: D/BluetoothGatt(31963): onClientConnectionState() - status=133 clientIf=6 device=******** callback.
因为我们的连接请求在nexus 5棒棒糖上被视为直接连接请求

这是日志

12-03 11:46:12.804: D/BluetoothGatt(6902): connect() - device: 58:EB:14:3D:2A:38, auto: true
12-03 11:46:12.804: D/BluetoothGatt(6902): registerApp()
12-03 11:46:12.804: D/BluetoothGatt(6902): registerApp() - UUID=b8f9298b-4a95-41be-80d6-22d82c498c5c
12-03 11:46:12.807: D/BtGatt.GattService(31817): registerClient() - UUID=b8f9298b-4a95-41be-80d6-22d82c498c5c
12-03 11:46:12.808: D/BtGatt.GattService(31817): onClientRegistered() - UUID=b8f9298b-4a95-41be-80d6-22d82c498c5c, clientIf=6
12-03 11:46:12.808: D/BluetoothGatt(6902): onClientRegistered() - status=0 clientIf=6
12-03 11:46:12.808: D/BtGatt.GattService(31817): clientConnect() - address=58:EB:14:3D:2A:38, isDirect=true
12-03 11:46:12.809: D/BtGatt.btif(31817): btif_get_device_type: Device [58:eb:14:3d:2a:38] type 2, addr. type 0
12-03 11:46:12.811: D/BLEManager(6902): Trying to create a new connection.

问题是此处描述的竞争条件:


在他们修复之前(他们会吗?)一个可能的解决方案是使用反射手动构造gatt对象,将mAutoConnect标志设置为true并调用connect。

该问题已在2016年5月的主android分支中修复。关于它是否最终出现在牛轧糖中的报道有好有坏,可能与设备有关,但它肯定仍然是棉花糖中的一个虫子

由于IBluetoothManager和IBluetoothGatt类在用户代码中不可用,因此执行解决方案所需的反射代码很快变得复杂

幸运的是,有人已经编写了一个非常小的、清晰的库,它为我们完成了这个精确的例程

使用此类,只需调用:

mBluetoothGatt = (new BleConnectionCompat(context)).connectGatt(device, autoConnect, callback)
而不是

mBluetoothGatt = device.connectGatt(context, autoConnect, callback);
它对我来说工作得很好。我不认为这是什么功劳,这完全是我的工作


另外,请注意,这是根据Apache许可证2.0版权所有2016 Polidea Sp.z o.o

是的,您是对的,这是因为种族条件,但使用反射来解决此类问题似乎不是一个正确的解决方案。除非他们修复它,否则您有更好的想法吗?是的,但不是针对每个用例,如果您可以接受第一个直接连接请求,那么下次第一次断开连接后,请发出一个直接连接请求并调用connect()方法以使自动连接随后工作。在棉花糖上面临相同的问题,但我将自动连接标志设置为false。我可以使用下面提供的相同修复(反射)来修复问题吗?