Qt - 与BLE设备断开连接

时间:2015-06-15 07:23:49

标签: c++ qt bluetooth-lowenergy qtcore

我试图理解为什么重新连接到BLE设备会因Qt而失败。 我的系统是带有内置BT适配器的Ubuntu 14.04,使用Qt 5.5.0 beta(也发生在Qt 5.4.0)。

基本上我尝试做的是在决定断开与BLE设备的连接之后重新连接到相同或不同的BLE设备。请注意,第一个连接很好,并且可以正常工作。 我在m_control->connectToDevice();之后做出的错误是QLowEnergyController::UnknownError

连接部分的存根(基于示例代码):

    m_control = new QLowEnergyController(QBluetoothAddress(connection_string), this);
connect(m_control, SIGNAL(serviceDiscovered(QBluetoothUuid)),
        this, SLOT(serviceDiscovered(QBluetoothUuid)));
connect(m_control, SIGNAL(discoveryFinished()),
        this, SLOT(serviceScanDone()));
connect(m_control, SIGNAL(error(QLowEnergyController::Error)),
        this, SLOT(controllerError(QLowEnergyController::Error)));
connect(m_control, SIGNAL(connected()),
        this, SLOT(deviceConnected()));
connect(m_control, SIGNAL(disconnected()),
        this, SLOT(deviceDisconnected()));
    m_control->connectToDevice();

断开部分:

if (m_control->state() != QLowEnergyController::UnconnectedState) {
    m_control->disconnectFromDevice();
}

delete m_control;
m_control = NULL;

重新连接的唯一方法是重置BT适配器或重置远程BT设备。我在软件断开连接后也无法扫描设备,因此我猜测它仍然与PC配对。

我在这个过程中做错了吗?

1 个答案:

答案 0 :(得分:1)

您订阅了任何通知吗?我只看到断开部分,但没有取消订阅部分。我想知道是不是因为您之前的连接已将外围设备置于不适合新连接的状态。

您需要取消订阅通知:

//disable notifications
if (m_notificationDesc.isValid() && m_service) {
    m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0000"));
} else {
    m_control->disconnectFromDevice();
    delete m_service;
    m_service = 0;
}