gpt4 book ai didi

android - Qt BLE Android : Characteristic update does not trigger characteristicChanged signal

转载 作者:行者123 更新时间:2023-11-29 01:11:32 32 4
gpt4 key购买 nike

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

我想做的是创建一个连接到设备并监控更新的简单 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()) 仅在启用了此特性通知的情况下才会由服务发出。这仅在特征具有通知属性时有效,您的应用程序中应该是这种情况。

关于android - Qt BLE Android : Characteristic update does not trigger characteristicChanged signal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651989/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com