使用Qt的`QLowEnergyController`的两个实例连接到两个BLE设备

时间:2017-10-27 11:28:36

标签: c++ qt bluetooth-lowenergy qt5 bluez

问题

我想使用Qt的Bluetooth Low Energy来连接两个BLE设备。

系统

  • 操作系统: Arch Linux 4.13.8
  • bluez版本: 5.47
  • BLE适配器: Cambridge Silicon Radio,Ltd蓝牙适配器(HCI模式)

解决方案

我使用了两个QLowEnergyControllers个实例,如下所示:

controller0 = QLowEnergyController::createCentral(qBluetoothDeviceInfoBLE0, this));
controller1 = QLowEnergyController::createCentral(qBluetoothDeviceInfoBLE1, this));

如果然后成功与BLE0联系,并且在信号connected()被发出后,我会发起与BLE1的连接。与BLE0的连接将被中止:

qt.bluetooth.bluez: Cannot connect due to pending active LE connections
qt.bluetooth.bluez: void QBluetoothSocketPrivate::_q_readNotify() 17 error: -1 "Software caused connection abort"

...并且将成功建立与BLE1的连接。

实测值

我在QLowEnergyControllers中找到了这个描述:

  

重要的是要提到一些平台,例如基于BlueZ的平台   Linux无法维护QLowEnergyController的两个连接实例   到同一个远程设备

注意:BLE0BLE1是不同的远程设备。

我还可以确认连接到相同的设备适用于我的bluez版本。它在使用nodejs的包贵族时也有效。

问题

  1. 它应该像我上面那样工作吗? (连接到BLE0,之后是BLE1)?
  2. 我在考虑使用第二个适配器,QBluetooth只能使用一个适配器(默认适配器)是否正确?
  3. 有人可以想到任何解决方法吗?

1 个答案:

答案 0 :(得分:0)

现在已修复(QT 5.11,BlueZ 5.50,Raspian,已通过RPi 4测试)。我可以轻松创建两个QLowEnergyController的实例。

但是,一次只能有一个QBluetoothDeviceDiscoveryAgent处于活动状态。这意味着必须先发现所有设备,然后再通过为每个外围设备创建一个单独的QLowEnergyController对象来连接它们。

这是一个很好的简短示例https://bugreports.qt.io/browse/QTBUG-73809