Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Cannot read descriptor of the characteristic - BLE.



  • Hello.
    I have a problem with reading characteristic using Bluetooth Low Energy Qt api. The device I'm communicating with is a Decawave DWM1001 module. I was following the tutorial from the documentation. I managed to connect to the device, read and creates it's service successfully. The device has "network node service" with UUID: 680c21d9-c946-4c1f-9c11-baa1c21329e7, which I'm trying to read characteristics from. I call QLowEnergyController::connectToDevice() method, it finds the service and I create a QLowEnergyService object for it, named nodeService.

    void BluetoothConnector::serviceDiscovered(const QBluetoothUuid &newService)
    {
        qDebug() << "Service discovered: " << newService.toString();
    
        if (newService == QBluetoothUuid(nodeServiceUUID)) {
            nodeService = controller->createServiceObject(QBluetoothUuid(nodeServiceUUID), this);
    
            if (nodeService) {
                qDebug() << "Node service created";
                connect(nodeService, &QLowEnergyService::stateChanged, this, &BluetoothConnector::serviceStateChanged);
                connect(nodeService, &QLowEnergyService::characteristicChanged, this, &BluetoothConnector::updateCharacteristic);
                //connect(nodeService, &QLowEnergyService::descriptorWritten, this, &BLTest::confirmedDescriptorWrite);
                nodeService->discoverDetails();
            } else {
                qDebug() << "Node service not found.";
            }
        }
    }
    

    nodeService is created successfully (I get "Node service created" log), then I connect the signals and slots for the service and then call discoverDetails() on nodeService. The serviceStateChanged() slot looks like this:

    void BluetoothConnector::serviceStateChanged(QLowEnergyService::ServiceState newState)
    {
        if (newState == QLowEnergyService::DiscoveringServices) {
            qDebug() << "Discovering services";
    
        } else if (newState == QLowEnergyService::ServiceDiscovered) {
            qDebug() << "Service discovered";
    
            const QLowEnergyCharacteristic networkIdChar = nodeService->characteristic(QBluetoothUuid(networkIdUUID));
            const QLowEnergyCharacteristic dataModeChar = nodeService->characteristic(QBluetoothUuid(dataModeUUID));
            const QLowEnergyCharacteristic locationChar = nodeService->characteristic(QBluetoothUuid(locationUUID));
    
            if (networkIdChar.isValid() && dataModeChar.isValid() && locationChar.isValid()) {
                auto idValue = networkIdChar.value();
                auto modeValue = dataModeChar.value();
                auto locValue = locationChar.value();
    
                qDebug() << "Network ID: " << idValue;
                qDebug() << "Mode: " << modeValue;
                qDebug() << "Location: " << locValue;
    
                auto notificationDesc = locationChar.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
                if (notificationDesc.isValid()) {
                    qDebug() << "Notification desc valid";
                    nodeService->writeDescriptor(notificationDesc, QByteArray::fromHex("0100"));
                }
            } else {
                qDebug() << "Characteristic invalid";
            }
        }
    }
    

    I get the "Discovering services" log and after that the app hangs for a bit and then I get:

    "Cannot read descriptor (onDescReadFinished 3):  \"{00002902-0000-1000-8000-00805f9b34fb}\" \"{3f0afd88-7770-46b0-b5e7-9fc099598964}\" \"org.freedesktop.DBus.Error.NoReply\" \"Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.\""
    "LowEnergy controller disconnected"
    "Aborting onCharReadFinished due to disconnect"
    

    It can't read the 00002902-0000-1000-8000-00805f9b34fb which is CCCD descriptor for the 3f0afd88-7770-46b0-b5e7-9fc099598964 characteristic (vendor specific).
    Can't figure out what's wrong and why it can't read characteristics from the device. Do I need to do something else to make it work?

    Thanks.



  • I still can't find a workaround for this. I don't get the "ServiceDiscovered" state when discovering details of the vendor-specific service. When I call discoverDetails() on the generic service like UUID: 1801 it discovers all the characteristics and the state goes to "ServiceDiscovered". I tried everything I can think off: running app as root, setting 'cap_net_raw,cap_net_admin+eip' fot the app and setttings the environment variable BLUETOOTH_FORCE_DBUS_LE_VERSION=5.41 (mention here: [https://forum.qt.io/topic/122098/qt-bluetooth-low-energy-notification-bug-downgrade-qt/17]). I have only problem with Qt apps, the lowenergyscanner example app has the same problem. I can read and write to the ble device without a problem using gatttool or simple python app with bleak library and everything works as expected but with the Qt I can't make it work.

    I hope someone had this problem before and know how to fix it.



  • Hi Piotrrr,
    Have you found a solution or a workaround to solve that problem?
    I spent a week without find any solutions.

    Thanks
    Ziolele


Log in to reply