这里的事情,我们有一个发送定制服务的定制特性的定期更新的设备。该设备中的服务和特性是通过XML文件定义的。这当然是指蓝牙BLE协议。Qt的BLE对于安卓特性更新不会触发characteristicChanged信号
我想要做的就是创建一个简单的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:使用蓝色壁虎演示应用,我可以看到的值发生变化。
编辑:我决定用一个定时器轮询特征的价值,它永远不会改变。这可能表明信号从未生成的原因。
如果特性发生变化,服务会发送通知给您,所以您不需要定时器来轮询特性。 – AD1170