這裏的事情,我們有一個發送定製服務的定製特性的定期更新的設備。該設備中的服務和特性是通過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