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

标签 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中的此描述:

    It is important to mention that some platforms such as a BlueZ based Linux cannot maintain two connected instances of QLowEnergyController to the same remote device



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

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

    问题
  • 应该像我上面所做的那样工作吗? (先连接BLE0,再连接BLE1)?
  • 我当时在考虑使用第二个适配器,QBluetooth只能使用一个适配器(默认适配器)是否正确?
  • 有人可以考虑任何解决方法吗?
  • 最佳答案

    现在已解决此问题(QT 5.11,BlueZ 5.50,Raspian,已通过RPi 4测试)。我可以轻松地创建QLowEnergyController的两个实例。

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

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

    关于c++ - 使用Qt的 `QLowEnergyController`的两个实例连接到两个BLE设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46973968/

    相关文章:

    C++迭代器循环与索引循环

    qt - 有没有办法使用 Qt Designer 定义带有按钮和弹出菜单的 QToolbar?

    ios - BLE 设备应该在不扫描的情况下连接

    .net - 适用于 Windows 7.0 的低功耗蓝牙 API

    c++ - 合格的 friend 功能模板实例化

    c++ - 如何使用 emscripten 和 cmake 项目生成位码(.bc 文件)?

    c++ - 如何使用 OpenCV 和 C++ 检测车牌中的数字?

    multithreading - C++11 线程在构造函数中初始化以执行方法

    qt - 在没有GUI的情况下获取字体指标(控制台模式)

    bluetooth-lowenergy - 如何在后台运行连接到 BLE 外设的 watchOS 应用程序?