При наличии нескольких адаптеров Bluetooth можно указать, какой локальный адаптер использовать при создании QBluetoothSocket
или звоните QBluetoothSocket::connectToService()
? Меня интересуют Linux/BlueZ, а также Android (где даже не ясно, поддерживаются ли несколько Bluetooth-адаптеров стекю Bluetooth).Как выбрать локальный адаптер при подключении к сервису с QBluetoothSocket
0
A
ответ
0
По Qt 5.6.2, нет такой функциональности пока отдельно от QBluetoothLocalDevice(QBluetoothAddress)
, QBluetoothDeviceDiscoveryAgent(QBluetoothAddress)
, QBluetoothServiceDiscoveryAgent(QBluetoothAddress)
и QBluetoothServer::listen(QBluetoothAddress)
. Это будет иметь смысл только в Linux, а не на Android, поскольку пакет Android Bluetooth, похоже, пока не поддерживает несколько ключей.
Однако на Linux с Bluez, ниже можно выбрать локальный адаптер с помощью 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
Соответствующей запрос возможности интегрировать это в API Qt: https://bugreports.qt.io/browse/QTBUG-57382