Qt BLE For Android:无法读取Custom Service的特性值

时间:2017-03-07 11:50:30

标签: android qt bluetooth

以下是设置:

同事创建了一个小型固件,可以每秒一次更改自定义服务(非标准唯一128位UUID)中自定义特性的值。用于传输的设备使用BLE(蓝牙低功耗)实现。

我需要实现一个小应用程序(仅作为工作示例)来监视所述值。但是我遇到了一个小问题。我已经按照这里的说明进行了操作:http://doc.qt.io/qt-5/qtbluetooth-le-overview.html我已经通过使用此代码来发现服务并“阅读它”(我得到UUID):

void BLETest::on_stateChanged(QLowEnergyService::ServiceState state){
#ifdef DBUG
    logger->out("Service Monitor State: " + lowEnergyServiceStateToString(state),Logger::LC_ORANGE);
#endif

    if (state == QLowEnergyService::ServiceDiscovered){
        QString chars = "";
        QList<QLowEnergyCharacteristic> clist = monitoredService->characteristics();
        for (int i = 0; i < clist.size(); i++){
            chars = clist.at(i).uuid().toString() + " - " + clist.at(i).name() + ": " + QString(clist.at(i).value());
            chars = chars + ". Value size: " + QString::number(clist.at(i).value().size()) + "<br>";
        }
        if (chars.isEmpty()){
            chars = "No characteristics found";
        }
        logger->out(chars);
    }

}

现在打印服务的UUID,但值字节数组的大小为零。使用另一个(私有应用程序),我们实际上可以看到该服务更改中的特征的值字段。此外,即使已经对服务的对象特性改变了连接,该信号也从未被触发,我想这是因为无法读取特征值。

我的问题是:您无法想到的代码有什么问题吗?或者仅凭用Qt蓝牙的当前BLE实现来监控自定义服务和特性是不是很简单?

PD:我正在使用Qt 5.7.1

1 个答案:

答案 0 :(得分:2)

必须通过将0x01写入客户端特征配置描述符(CCCD)来启用特性通知。

foreach(QLowEnergyCharacteristic c, srv->characteristics()){
    QLowEnergyDescriptor d = c.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
    if(!c.isValid()){
        continue;
    }
    if(c.properties() & QLowEnergyCharacteristic::Notify){ // enable notification
        srv->writeDescriptor(d, QByteArray::fromHex("0100"));
    }
    if(c.properties() & QLowEnergyCharacteristic::Indicate){ // enable indication
        srv->writeDescriptor(d, QByteArray::fromHex("0200"));
    }
}