每个连接请求都被视为直接连接请求 + android ble

Posted

技术标签:

【中文标题】每个连接请求都被视为直接连接请求 + android ble【英文标题】:Every connection request is being treated as direct connect request + android ble 【发布时间】:2014-12-03 19:50:14 【问题描述】:

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

但是每当我们尝试这样做时,我们的重新连接都会失败,并显示

12-02 21:47:11.865: D/BluetoothGatt(31963): onClientConnectionState() - status=133 clientIf=6 device=******** callback.

因为我们的连接请求在 nexus 5 lollipop 上被视为直接连接请求

这是日志

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.

【问题讨论】:

在 Marshmallow 上面临同样的问题,但我将 autoConnect 标志设置为 false。我可以使用下面提供的相同修复(反射)来解决问题吗? 【参考方案1】:

该问题已在 2016 年 5 月的 master android 分支中得到修复。关于它是否最终出现在 Nougat 中的报告不一,可能取决于设备,但它绝对仍然是 Marshmallow 中的一个错误。

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

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

https://github.com/Polidea/RxAndroidBle/blob/master/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/util/BleConnectionCompat.java

使用这个类,只需要调用:

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

而不是

mBluetoothGatt = device.connectGatt(context, autoConnect, callback);

它对我来说很好用。这一点我不相信,这完全是uKL的工作

另外,请注意它在 Apache License 2.0 版权所有 2016 Polidea Sp。 z o.o

【讨论】:

【参考方案2】:

问题是此处描述的竞争条件:https://code.google.com/p/android/issues/detail?id=69834

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

【讨论】:

是的,你是对的,这是因为竞争条件,但是使用反射来解决这样的问题似乎不是一个正确的解决方案。 除非他们修复它,否则您有更好的主意吗? 是的,但并非适用于所有用例,如果您可以接受第一个直接连接请求,则发出直接连接请求并在下次第一次断开连接后调用 connect() 方法以使自动连接随后工作。

以上是关于每个连接请求都被视为直接连接请求 + android ble的主要内容,如果未能解决你的问题,请参考以下文章

如何在apache中设置每个连接的最大请求数

是否应该为所有请求使用单个 Mongoose 连接?或者每个请求都有不同的连接?

HTTP 请求之间具有持久状态的模型

每个连接的线程与每个请求的线程有啥区别?

每个 HTTP 请求都使用一个单独的 TCP 连接

Angular - 每个请求都被 CORS 阻止