【问题标题】:How to choose local adapter when connecting to service with QBluetoothSocket使用 QBluetoothSocket 连接服务时如何选择本地适配器
【发布时间】:2017-04-07 07:49:07
【问题描述】:

在存在多个蓝牙适配器的情况下,是否可以在创建QBluetoothSocket 或调用QBluetoothSocket::connectToService() 时指定使用哪个本地适配器?我对 Linux/BlueZ 以及 Android 感兴趣(甚至不清楚蓝牙堆栈是否支持多个蓝牙适配器)。

【问题讨论】:

    标签: android qt bluetooth bluez qtbluetooth


    【解决方案1】:

    从 Qt 5.6.2 开始,除了 QBluetoothLocalDevice(QBluetoothAddress)QBluetoothDeviceDiscoveryAgent(QBluetoothAddress)QBluetoothServiceDiscoveryAgent(QBluetoothAddress)QBluetoothServer::listen(QBluetoothAddress)。这些仅在 Linux 上有意义,在 Android 上无效,因为 Android 蓝牙堆栈似乎不支持多个加密狗,至少目前是这样。

    但是,在带有 BlueZ 的 Linux 上,可以使用 BlueZ c API 选择本地适配器:

    #include <sys/socket.h>
    #include <bluetooth/bluetooth.h>
    #include <bluetooth/rfcomm.h>
    
    ...
    
    QBluetoothSocket* socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
    
    struct sockaddr_rc loc_addr;
    loc_addr.rc_family = AF_BLUETOOTH;
    
    int socketDescriptor = ::socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
    if(socketDescriptor < 0){
        qCritical() << strerror(errno);
        return;
    }
    
    const char* localMacAddr = "XX:XX:XX:XX:XX:XX"; //MAC address of the local adapter
    str2ba(localMacAddr, &(loc_addr.rc_bdaddr));
    
    if(bind(socketDescriptor, (struct sockaddr*)&loc_addr, sizeof(loc_addr)) < 0){
        qCritical() << strerror(errno);
        return;
    }
    
    if(!socket->setSocketDescriptor(socketDescriptor, QBluetoothServiceInfo::RfcommProtocol, QBluetoothSocket::UnconnectedState)){
        qCritical() << "Couldn't set socketDescriptor";
        return;
    }
    
    socket->connectToService(...);
    

    项目.pro 必须包含以下内容:

    CONFIG += link_pkgconfig
    PKGCONFIG += bluez
    

    可能将其集成到 Qt API 中的相应功能请求:https://bugreports.qt.io/browse/QTBUG-57382

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多