Qt:5.10, Linux Ubuntu 17.10, Bluez 5.4x
我正在使用QBluetooth连接多个蓝牙低功耗设备。对于一个连接,一切正常。但是当我用 QLowEnergyController :: connectToDevice()连接到第二个设备时,我收到以下错误,第一个连接被中止:
qt.bluetooth.bluez: Cannot connect due to pending active LE Connections
qt.bluetooth.bluez: void QBluetoothSocketPrivate::_q_readNotify() 21 error: -1 "Software caused Connection abort"
之后第二个连接建立。
我在每个连接的中央模式中使用了一个QLowEnergyController实例。
经过研究后,我认为应该可以使用Bluez蓝牙协议栈创建多个与BLE外设的连接。但我不确定QBluetooth是否支持此功能...
感谢您的帮助!
答案 0 :(得分:1)
问题不在于BLE,而在于它的Qt实现。文档说任何使用QLowEnergyController同时连接到两个BLE设备的尝试都将失败。检查一下:http://doc.qt.io/qt-5/qlowenergycontroller.html; “详细说明”一节,第5段: “基于BlueZ的Linux无法将两个连接的QLowEnergyController实例维护到同一个远程设备。在这种情况下,第二次调用connectToDevice()可能会失败。”
根据这一点,应该可以使用该类的两个实例建立与两个不同远程设备的连接,但它根本不起作用。如果你继续阅读文档,你会发现“这个限制可能在将来的某个阶段消失。”。
我尝试在连接到第二个设备(两个TI SensorTag)之前断开与第一个设备的连接,但是因为我必须重新发现服务并重新启用传感器(请参阅文档中的disconnectFromDevice())每次我重新连接程序都变得太慢了。
如果要使用Qt连接到两个设备,则必须通过D-Bus使用Bluez API和Qt的D-Bus类。
编辑:
我设法使用D-Bus类连接到多个设备。我的程序的架构并不复杂,只是语法变得有点棘手。唯一的大问题是BlueZ版本:D-Bus接口在不支持低能耗(实验......)和更高版本的5.3x(默认Ubuntu 16.04)之间发生了很大变化。我认为这就是Qt的D-Bus蓝牙尚未启用的原因。由于BLE在BlueZ 5.42之后未被标记为实验性,因此您应该使用当前版本的D-Bus。为了记录,我完全可以使用D-Bus和Raspbian的默认5.9 BlueZ。