使用 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 蓝牙堆栈似乎不支持多个加密狗,至少现在是这样。
但是,在 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
可能将其集成到 Qt APIs 中的相应功能请求:https://bugreports.qt.io/browse/QTBUG-57382
在存在多个蓝牙适配器的情况下,是否可以在创建QBluetoothSocket
或调用QBluetoothSocket::connectToService()
时指定使用哪个本地适配器?我对 Linux/BlueZ 和 Android 感兴趣(甚至不清楚蓝牙堆栈是否支持多个蓝牙适配器)。
从 Qt 5.6.2 开始,除了 QBluetoothLocalDevice(QBluetoothAddress)
、QBluetoothDeviceDiscoveryAgent(QBluetoothAddress)
、QBluetoothServiceDiscoveryAgent(QBluetoothAddress)
和
QBluetoothServer::listen(QBluetoothAddress)
。这些只对 Linux 有意义,对 Android 没有意义,因为 Android 蓝牙堆栈似乎不支持多个加密狗,至少现在是这样。
但是,在 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
可能将其集成到 Qt APIs 中的相应功能请求:https://bugreports.qt.io/browse/QTBUG-57382