2016-11-23 2 views
0

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

ответ

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