连接到经典蓝牙设备时,Qt蓝牙卡滞



我目前正在尝试使用经典BT从外围设备读取蓝牙信号,以控制我的Qt应用程序。稍后我可能会使用一个小的BT操纵杆,但现在我正在尝试连接我配对耳机上的按钮。

我以前有

  1. 。。通过QBluetoothDeviceDiscoveryAgent扫描远程设备,返回了我耳机的QBluetoothDeviceInfo
  2. 。。。使用QBluetoothServiceDiscoveryAgent扫描该设备上的服务,返回QBluetoothServiceInfoQBluetoothUuid::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()函数。

我是蓝牙的新手,可能误解了连接的确切工作原理,因此我们将非常感谢您的帮助。

PS.:我在Linux Ubuntu 18.04上工作,应用程序日志也显示:

qt.bluetooth.bluez:缺少CAP_NET_ADMIN权限。无法确定所找到的地址是随机类型还是公共类型。

您正试图以非root用户身份运行软件。Linux的蓝牙协议栈检查两种功能,这两种功能对于错误日志中提到的操作是必需的——CAP_NET_RAWCAP_NET_ADMIN。功能是特权用户(root("要么全有要么全无"方法的替代方案。这为无特权用户提供了更细粒度的权限控制,因此它只能获得root用户的一部分权限。有关更多详细信息,请阅读man 7 capabilities

有几种利用功能的技术,其中之一就是文件功能。使用setcap(8)可以达到预期效果,如下所示:

sudo setcap 'cap_net_raw,cap_net_admin+eip' yourapplication

最新更新