Использование двух экземпляров Qt `QLowEnergyController` для подключения к двум устройствам BLE

проблема

Я хочу использовать Bluetooth Low Energy Qt для подключения к двум устройствам BLE.

система

  • ОС: Arch Linux 4.13.8
  • версия bluez: 5.47
  • Адаптер BLE: Bluetooth- адаптер 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:

Важно отметить, что некоторые платформы, такие как Linux на основе BlueZ, не могут поддерживать два подключенных экземпляра QLowEnergyController на одном и том же удаленном устройстве.

Замечания: BLE0 а также BLE1 разные удаленные устройства.

Я также могу подтвердить, что подключение к тем же устройствам работает с моей версией bluez. Это также работает при использовании пакета noblejs Nojjs.

Вопросы

  1. Должно ли это работать, как я сделал это выше? (присоединиться BLE0 и после BLE1)?
  2. Я думал об использовании второго адаптера, правильно ли, что QBluetooth может использовать только один адаптер (по умолчанию)?
  3. Может кто-нибудь придумать какой-нибудь обходной путь?

0 ответов

Сейчас это исправлено (QT 5.11, BlueZ 5.50, Raspian, проверено с RPi 4). Я легко могу создать два экземпляраQLowEnergyController.

Однако может быть только один QBluetoothDeviceDiscoveryAgentактивны одновременно. Это означает, что нужно сначала обнаружить все устройства, а затем подключиться к ним, создав отдельныйQLowEnergyController объект для каждого периферийного устройства.

Вот отличный короткий пример https://bugreports.qt.io/browse/QTBUG-73809

Другие вопросы по тегам