2017-03-07 18 views
0

這裏的事情,我們有一個發送定製服務的定製特性的定期更新的設備。該設備中的服務和特性是通過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:使用藍色壁虎演示應用,我可以看到的值發生變化。

編輯:我決定用一個定時器輪詢特徵的價值,它永遠不會改變。這可能表明信號從未生成的原因。

回答

0

您應該連接一個chracteristic改變處理程序服務:

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

在插槽中,你可以探索的數據數組。

然而,信號(characteristicChanged())將僅由服務,如果該通知chracteristic啓用發射。這隻適用於,如果特性有一個通知屬性,應該在你的應用程序的情況下。

+0

如果特性發生變化,服務會發送通知給您,所以您不需要定時器來輪詢特性。 – AD1170