【问题标题】:Using two instances of Qt's `QLowEnergyController` to connect to two BLE devices使用 Qt 的 `QLowEnergyController` 的两个实例连接到两个 BLE 设备
【发布时间】:2018-04-08 23:54:05
【问题描述】:

问题

我想用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 的包 noble 时也可以使用。

问题

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

【问题讨论】:

  • 这似乎是 Qt 的 BLE 实现中的一个错误。 BlueZ 可以处理与多个设备的连接。
  • bluez 和多个连接中存在一些错误,但我的版本显然适用于多个连接,是的。我试图找出这是否是错误的行为,并会报告回来。
  • 我在 Ubuntu 17.10、Qt 5.10 上遇到了同样的问题。马库斯你的问题解决了吗?
  • @DenysRogovchenko 很遗憾没有,仍在进行中
  • @Marcus 我在 Ubuntu 17.10、Qt 5.10 上遇到了同样的问题。显然,Qt 尚不支持 bluez dbus API,根据此评论:bugreports.qt.io/browse/… 此处跟踪了在同一设备上维护多个连接所需的 bluez dbus API:bugreports.qt.io/browse/QTBUG-46819 似乎中心角色将是与 Qt 5.11 一起出现。我们应该注意这一点。

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


【解决方案1】:

现在已修复此问题(QT 5.11、BlueZ 5.50、Raspian,使用 RPi 4 进行了测试)。我可以轻松创建QLowEnergyController 的两个实例。

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

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

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多