Qt蓝牙低功耗多重连接

时间:2018-02-22 10:44:59

标签: linux qt bluetooth-lowenergy

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是否支持此功能...

  1. 有人知道有关QBluetooth的多个LE连接吗?
  2. 这是建立第二个连接的正确方法吗?
  3. 有人知道一个好的解决方法吗?
  4. 感谢您的帮助!

1 个答案:

答案 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。