Как выбрать локальный адаптер при подключении к услуге с QBluetoothSocket

При наличии нескольких адаптеров Bluetooth можно указать, какой локальный адаптер использовать при создании QBluetoothSocket или звонит QBluetoothSocket::connectToService()? Меня интересует Linux/BlueZ, а также Android (где даже неясно, поддерживается ли множество Bluetooth-адаптеров стеком Bluetooth).

1 ответ

Решение

Начиная с Qt 5.6.2 такой функциональности пока нет, кроме QBluetoothLocalDevice(QBluetoothAddress), QBluetoothDeviceDiscoveryAgent(QBluetoothAddress), QBluetoothServiceDiscoveryAgent(QBluetoothAddress) а также QBluetoothServer::listen(QBluetoothAddress), Это имело бы смысл только в Linux, а не в Android, так как стек Android Bluetooth не поддерживает несколько ключей, по крайней мере, пока.

Однако в Linux с BlueZ можно выбрать локальный адаптер с помощью API BlueZ c:

#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

Соответствующий запрос функции для возможной интеграции этого в API Qt: https://bugreports.qt.io/browse/QTBUG-57382

Другие вопросы по тегам