2017-03-07 17 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