我有一个应用程序使用Qt Bluetooth API在Android设备上将客户端连接(或应该连接)到蓝牙服务。这样做的代码并不复杂,并且与Qt Bluetooth Overview中给出的示例没有太大差别,尽管它是分布式的,因为它是类的一部分。
在构造函数中:
mBluetoothSocket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
在“waitForServiceConnection”方法中:
mBluetoothSocket->connectToService(address, uuid);
for (unsigned i = 0; i < timeout; ++i)
{
QTime delayLimit = QTime::currentTime().addSecs(1);
while( QTime::currentTime() < delayLimit ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
qDebug() << "Current socket state is " << mBluetoothSocket->state() << endl;
if (mServiceConnected)
{
return;
}
}
...
}
对于for循环的每次迭代(对于最多60秒的超时),我得到以下输出:
当前套接字状态是QBluetoothSocket :: ServiceLookupState
有一个socketStateChanged插槽,它接收来自套接字的stateChanged信号并包含:
qDebug() << "Socket state changed to " << socketState << endl;
输出:
套接字状态已更改为QBluetoothSocket :: ServiceLookupState
只有一次。如果我手动检查循环中的套接字状态,它也总是ServiceLookupState。
我很遗憾不是100%确定完全 ServiceLookupState需要什么。 Qt's documentation on the QBluetoothSocket class报告
Socket正在查询连接参数。
我怀疑这意味着要查找端口或其他东西。
桌面客户端使用QBluetoothServiceDiscoveryAgent成功找到在设备上注册的服务。我已经针对已知良好的蓝牙服务(Android BluetoothChat示例)对此进行了测试,结果相同,因此我非常确定问题出在桌面客户端上。我做错了什么?
不抛出任何异常,QBluetoothSocket :: error()始终表示没有错误。
答案 0 :(得分:0)
代码本身没有任何问题 - 问题是它存在于某个单元测试中调用的库中。从标准的Qt控制台应用程序调用它时工作正常。
由于单元测试无法正确处理蓝牙组件,因此这是可以接受的。