1

我目前正在尝试使用经典 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 权限。无法确定找到的地址是随机地址还是公共地址。

4

1 回答 1

1

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

有几种利用功能的技术,其中之一是文件功能。您可以通过以下方式达到预期的效果setcap(8)

sudo setcap 'cap_net_raw,cap_net_admin+eip' yourapplication

于 2020-04-02T11:34:53.643 回答