我正在尝试通过de QtBluetooth.dll与低功耗蓝牙设备进行通信。因此,我创建了一个应用程序,该应用程序列出了每个BLE设备,连接到它,进行读写并通知值,最后断开连接。
我使用Qt的connect()功能来监听所有状态的变化;使用SIGNALS / SLOTS系统。
controller = new QLowEnergyController(currentDevice.getDevice());
connect(controller, &QLowEnergyController::connected,
this, &Device::deviceConnected);
connect(controller, &QLowEnergyController::disconnected,
this, &Device::deviceDisconnected);
connect(controller, &QLowEnergyController::discoveryFinished,
this, &Device::serviceScanDone);
connect(controller, QOverload<QLowEnergyController::Error>::of(&QLowEnergyController::error),
this, &Device::errorReceived);
connect(controller, &QLowEnergyController::serviceDiscovered,
this, &Device::addLowEnergyService);
connect(controller, &QLowEnergyController::stateChanged,
this, &Device::deviceStateChanged);
这很好,但是有问题。当我的设备突然关闭时,我绝对无法获得设备的“崩溃”或关闭信息。甚至我控制器对象的“ stateChanged”事件都不会引发任何状态。
那么当崩溃发生时我该如何找回呢?我是否缺少事件监听器?
感谢您的帮助!
[编辑]
我已经创建了一个QThread来处理错误,即使关闭设备,qInfo()也会这样说:
QLowEnergyController::Error(NoError)
QLowEnergyController::ControllerState(DiscoveredState)
QThread:
QThread * errorThread = QThread::create([this]() {
while (this->controller->error() != QLowEnergyController::NetworkError)
{
qInfo() << this->controller->error();
qInfo() << this->controller->state();
Sleep(1000);
}
qInfo() << this->controller->error();
qInfo() << this->controller->state();
});
errorThread->start();
答案 0 :(得分:1)
您使用哪个Qt版本?从Qt 5.10开始,存在错误类型QLowEnergyController::RemoteHostClosedError
:
远程设备关闭了连接。这个值是Qt 5.10引入的。
有关更多信息,请参见http://doc.qt.io/qt-5/qlowenergycontroller.html#Error-enum。
该错误将通过error
信号发出。
在早期版本中,我也很确定在读取或写入崩溃的设备时,您会收到QLowEnergyController::NetworkError
。
答案 1 :(得分:0)
考虑到Qt在Mac,iOS,Android和Windows 10上都支持BLE,唯一可靠的判断连接是否仍然有效的方法是对它们进行I / O,并查看其Connection-或Serviceobjects是否指示错误或不。如果您仅使用BLE / 4.1,则建议您请求读取最小的gatt属性,大多数设备都具有“电池”服务,无论如何,您都必须定期对其进行检查。