Qt Bluetooth зависает при подключении к устройству Classi c Bluetooth - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время я пытаюсь считывать сигналы Bluetooth с периферийных устройств, используя classi c BT для управления моим приложением Qt. Позже я мог бы использовать небольшой джойстик BT, но сейчас я пытаюсь подключиться к кнопкам на моих парных наушниках.

Ранее я

  1. .. сканировал на удаленные устройства через QBluetoothDeviceDiscoveryAgent, который вернул QBluetoothDeviceInfo моих наушников.
  2. ... сканировал службы на этом устройстве, используя QBluetoothServiceDiscoveryAgent, который возвратил QBluetoothServiceInfo с QBluetoothUuid::AV_RemoteControl
  3. ... добавлен сокет, который должен подключаться к устройству, например:

    socket0 = new QBluetoothSocket(QBluetoothServiceInfo::L2capProtocol);
    
    connect(socket0, &QBluetoothSocket::stateChanged, this , &BluetoothController::socketStateChanged);
    connect(socket0, &QBluetoothSocket::readyRead, this, &BluetoothController::readSocket);
    connect(socket0, &QBluetoothSocket::connected, this, &BluetoothController::serverConnected);
    connect(socket0, &QBluetoothSocket::disconnected, this, &BluetoothController::serverDisconnected);
    connect(socket0, QOverload<QBluetoothSocket::SocketError>::of(&QBluetoothSocket::error),
        this, &BluetoothController::serverError);
    
    
    QBluetoothAddress address = info.device().address();
    QIODevice::ReadOnly);
    socket0->connectToService(address, QBluetoothUuid::AV_RemoteControl, QIODevice::ReadOnly);
    

    В этот момент состояние сокета меняется на ConnectingState , а не через ошибка, но также не вызывает мою функцию readyRead().

Я новичок в Bluetooth и, возможно, неправильно понимаю концепцию, как именно работает соединение, поэтому любая помощь будет принята с благодарностью .

PS .: Я работаю над Linux Ubuntu 18.04, и журнал приложений также выдает:

qt.bluetooth.bluez: Отсутствует разрешение CAP_NET_ADMIN. Не удается определить, является ли найденный адрес случайным или общедоступным c типом.

1 Ответ

0 голосов
/ 02 апреля 2020

Вы пытаетесь запустить свое программное обеспечение как пользователь, не являющийся root. Стек протоколов Bluetooth для Linux проверяет две возможности, которые необходимы для операций, подобных тем, которые указаны в вашем журнале ошибок - CAP_NET_RAW и CAP_NET_ADMIN. Возможности являются альтернативой подходу «все или ничего» с привилегированным пользователем (root). Это дает более детальный контроль над разрешениями непривилегированному пользователю, поэтому он может получить только часть привилегий root. Для получения более подробной информации читайте man 7 capabilities.

. Существует несколько методов использования возможностей, один из которых - файловые возможности. Вы можете достичь желаемого эффекта с помощью setcap(8) следующим образом:

sudo setcap 'cap_net_raw,cap_net_admin+eip' yourapplication

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...