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

Using two instances of Qt's `QLowEnergyController` to connect to two BLE devices

本文关键字:两个 BLE 设备 连接 QLowEnergyController 使用 Qt 实例      更新时间:2023-10-16

问题

我想使用Qt的蓝牙低能耗连接到两个BLE设备。

系统

  • 操作系统:Arch Linux 4.13.8
  • bluez版本:5.47
  • BLE适配器:剑桥硅无线电有限公司蓝牙软件狗(HCI模式)

解决方案

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

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"

并且将成功地建立到CCD_ 5的连接。

已找到

我在QLowEnergyControllers:中发现了这样的描述

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

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

我还可以确认,连接到相同的设备适用于我的bluez版本。当使用nodejs的package noble时,它也可以工作。

问题

  1. 它应该像我上面做的那样工作吗?(连接BLE0,然后连接BLE1)
  2. 我正在考虑使用第二个适配器,QBluetooth只能使用一个适配器(默认适配器)是正确的吗
  3. 有人能想出什么变通办法吗

目前已修复(QT 5.11,BlueZ 5.50,Raspian,用RPi 4测试)。我可以很容易地创建两个QLowEnergyController实例。

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

下面是一个很好的例子https://bugreports.qt.io/browse/QTBUG-73809