Qt BLE For Android:特性更新不会触发characteristicChanged信号

2024-03-13

这是我们拥有的设备传输自定义服务的自定义特征的定期更新的东西。该设备中的服务和特征是通过 XML 文件定义的。当然,这是指蓝牙BLE协议。

我想做的是创建一个简单的 Qt Android 应用程序,连接到设备并监控更新。我已经发现了该服务并将其信号连接到它。我已经使用以下代码完成了此操作:

void BLETest::on_stateChanged(QLowEnergyService::ServiceState state){

    Q_UNUSED(state);

    // Only printing data if all services are in correct state.
    for (qint32 i = 0; i < monitoredServices.size(); i++){
        if (monitoredServices.at(i)->state() != QLowEnergyService::ServiceDiscovered){
            logger->out("There are still services that have not been discoverd",Logger::LC_ORANGE);
            return;
        }
    }

    QString msg = "PRINTING SERVICE DATA<br>";

    for (qint32 i = 0; i < monitoredServices.size(); i++){

        QLowEnergyService *monitoredService = monitoredServices.at(i);
        QList<QLowEnergyCharacteristic> clist = monitoredService->characteristics();

        msg = msg + "SERVICE: " + monitoredService->serviceName() + ". UUID: " + monitoredService->serviceUuid().toString() + "<br>";

        // Checking if this is the service that need connection.
        if (monitoredService->serviceUuid() == QBluetoothUuid(QString("0a464eef-af72-43fd-8a8b-1f26f6319dab"))){
            QString res;
            if (connect(monitoredService,SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)),this,SLOT(on_charastericChanged(QLowEnergyCharacteristic,QByteArray)))) res = "true";
            else res = "false";
            logger->out("CONNECTED TO TARGET SERVICE: " + res,Logger::LC_ORANGE);

        }

        for (int i = 0; i < clist.size(); i++){

            QString name = clist.at(i).name();
            if (name.isEmpty()) name = "UNDEFINED NAME";

            QByteArray buffer = clist.at(i).value();
            //QString value = QString(clist.at(i).value());
            QString value = QByteArray(buffer.toHex()) + " (BS = " + QString::number(buffer.size())  + ")";
            QString properties = QString::number(clist.at(i).properties());
            msg = msg + "CHARACTERISTIC: " + clist.at(i).uuid().toString() + " - " + name + ": " + value + ". PROPERTIES: " + properties  + "<br>";

        }

        if (clist.isEmpty()){
            msg = msg + "No characteristics found<br>";
        }
    }

    logger->out(msg);


}

上述函数等待所有服务被发现,然后打印所有服务的所有特征的 UUID、名称和值。当处理我想要监视的服务时,将完成与changedCharacteristic 信号的连接。

当我执行此操作时,我想要监视的服务特征的打印值是该特征的原始值。然而,随着该值更新,我不会收到通知(信号永远不会触发),因此该值在我的应用程序中永远不会改变。

我需要编写一些代码来实际触发信号吗?

PD:使用 Blue Gecko 演示应用程序,我可以看到值的变化。

编辑:我决定使用计时器来轮询特征的值,它永远不会改变。这可能表明为什么信号也永远不会生成。


您应该将特征更改处理程序连接到服务:

connect(service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic, QByteArray)), this, SLOT(on_characteristicChanged(QLowEnergyCharacteristic, QByteArray)));

在插槽中,您可以探索数据数组。

但是,只有启用此特性通知时,服务才会发出信号 (characteristicChanged())。仅当特征具有通知属性时(您的应用程序中应该出现这种情况),此方法才有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt BLE For Android:特性更新不会触发characteristicChanged信号 的相关文章