簡體   English   中英

使用QBluetoothSocket連接到服務時如何選擇本地適配器

[英]How to choose local adapter when connecting to service with QBluetoothSocket

在存在多個藍牙適配器的情況下,可以在創建QBluetoothSocket或調用QBluetoothSocket::connectToService()時指定使用哪個本地適配器? 我對Linux / BlueZ和Android(在藍牙堆棧是否支持多個藍牙適配器的情況下甚至還不清楚)感興趣。

從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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM