我正在为蓝牙客户端编写C++应用程序,它应该能够使用经典蓝牙(不是BLE)发现、配对和连接另一个具有特定MAC地址的蓝牙设备。主要问题是,如何创建连接? Qt 蓝牙概述中详细描述了发现和配对过程,并且按预期工作:
// To switch bluetooth on, code inside MyClass constructor
QBluetoothLocalDevice localDevice;
// Check if Bluetooth is available on this device
if (localDevice.isValid())
{
// Turn Bluetooth on
localDevice.powerOn();
// Other code
}
void MyClass::startDeviceDiscovery()
{
// Create a discovery agent and connect to its signals
QBluetoothDeviceDiscoveryAgent *discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this, SLOT(deviceDiscovered(QBluetoothDeviceInfo)));
// Start a discovery
discoveryAgent->start();
// Other code
}
// In MyClass local slot, read information about the found devices
void MyClass::deviceDiscovered(const QBluetoothDeviceInfo &device)
{
qDebug() << "Found new device:" << device.name() << '(' << device.address().toString() << ')';
}
我还检查了这个答案,其中包含用于打开蓝牙、发现和配对的代码的完整实现。但是,配对完成后,我找不到与已发现并配对的蓝牙设备实现连接的方法。 Qt 文档中的 Bluetooth Chat 示例提供了此任务的某种解决方案,但由此产生了几个问题。这个例子建议创建对象
RemoteSelector remoteSelector(adapter);
其中
RemoteSelector
是类,由 Qt Mobility Components 提供。此类的实例将允许创建特定的服务
QBluetoothServiceInfo service = remoteSelector.service();
然后可以使用此服务与远程设备建立连接:
client->startClient(service);
示例还提供了一段代码
m_discoveryAgent = new QBluetoothServiceDiscoveryAgent(localAdapter);
connect(m_discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered,
this, &RemoteSelector::serviceDiscovered);
connect(m_discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished,
this, &RemoteSelector::discoveryFinished);
connect(m_discoveryAgent, &QBluetoothServiceDiscoveryAgent::canceled,
this, &RemoteSelector::discoveryFinished);
这与
RemoteSelector
类的实现中的代码类似,但不完全相同。
所以,这里出现了几个问题:
我的理解是否正确,为了能够在 Qt 6.5 中实现与配对设备的蓝牙连接,有必要安装单独的组件,称为 Qt Mobility Components,并使用那里的
RemoteSelector
类?
为什么聊天蓝牙示例提供了
RemoteSelector
类构造函数实现的部分代码,与此实现部分不同,是否需要根据提供的代码修改RemoteSelector
的实现?
从良好的编码实践、编写干净的代码、良好的代码风格和组织的意义上来说,蓝牙聊天示例中描述的连接方式是在 Qt 中实现蓝牙连接的最佳方式吗?
一般来说,所描述的连接方式似乎很奇怪,因为虽然Qt蓝牙提供了直接的方式来打开蓝牙、发现和配对设备,但连接过程似乎要复杂得多,它需要额外的操作和额外的组件,Qt Mobility组件。这有什么解释吗?
请注意,我的程序中没有图形界面,也不使用 QT Creator,因为任务只是使用 Qt 库编写用于蓝牙连接的 C++ 应用程序。