2016-11-23 5 views
0

複数のBluetoothアダプタがある場合、QBluetoothSocketを作成するとき、またはQBluetoothSocket::connectToService()を呼び出すときに使用するローカルアダプタを指定できますか?私はLinux/BlueZだけでなく、Android(複数のBluetoothアダプタがBluetoothスタックでサポートされているかどうかは明らかではありません)に興味があります。 Qtの5.6.2のようQBluetoothSocketでサービスに接続するときにローカルアダプタを選択する方法

答えて

0

、そのような機能はまだ離れQBluetoothLocalDevice(QBluetoothAddress)QBluetoothDeviceDiscoveryAgent(QBluetoothAddress)QBluetoothServiceDiscoveryAgent(QBluetoothAddress)QBluetoothServer::listen(QBluetoothAddress)から存在しません。 AndroidのBluetoothスタックは複数のドングルをサポートしているようではないので、これはLinuxでは意味をなさないが、少なくとも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

関連する問題