android - 适用于 Android 的 Qt BLE : Cannot read value of characteristic for Custom Service

标签 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,但值字节数组的大小为零。使用另一个(私有(private)应用程序),我们实际上可以看到该服务中特征的值字段发生变化。此外,即使与服务的对象characteristicChanged 信号建立了连接,该信号也永远不会被触发,我想这是因为无法读取特征值。

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

PD:我使用的是 Qt 5.7.1

最佳答案

您必须通过将 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"));
    }
}

关于android - 适用于 Android 的 Qt BLE : Cannot read value of characteristic for Custom Service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42647587/

相关文章:

c++ - 编译文件的 Netbeans 错误

c++ - 共享 Lua 脚本的安全性

c++ - 如何编译qtconnectivity(蓝牙)?

android - 在 Android 中实现 Nokia Here SDK

android - AlarmManager 无法从广播接收器工作

c++ - Qt 5 中特殊字符无法正确显示

java - 我应该使用哪个库在 javase 中导入包 'javax.obex.ClientSession'?

java - Android:在蓝牙应用程序的单个 APK 上支持多个 API 级别

java - Android Linkedin init 没有回调触发

java - 安卓房间 : How to use embedded with a custom query