如何使用Qt检测蓝牙崩溃或关机?

时间:2018-07-12 17:01:56

标签: c++ qt bluetooth bluetooth-lowenergy

我正在尝试通过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();

2 个答案:

答案 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属性,大多数设备都具有“电池”服务,无论如何,您都必须定期对其进行检查。