Qt 不稳定。只能获取[自定义]服务中两个特征更改之一的通知

Qt 不稳定。只能获取[自定义]服务中两个特征更改之一的通知,qt,bluetooth-lowenergy,Qt,Bluetooth Lowenergy,我让Nordic nrf与Linux上运行的Qt应用程序进行通信。Qt应用程序设置为获取自定义服务中的自定义特性通知。这个很好用 然后,我为北欧海关服务增加了第二个特点 如果我将手机连接到北欧,我会收到来自这两个特征的通知。然而,在我的Qt应用程序中,我根本无法实现第二个特性 我这样做的第一个特点是: void MainWindow::setReceiveCharacteristic(CharacteristicInfo *cInfo) { watchedData = cInfo-&g

我让Nordic nrf与Linux上运行的Qt应用程序进行通信。Qt应用程序设置为获取自定义服务中的自定义特性通知。这个很好用

然后,我为北欧海关服务增加了第二个特点

如果我将手机连接到北欧,我会收到来自这两个特征的通知。然而,在我的Qt应用程序中,我根本无法实现第二个特性

我这样做的第一个特点是:

void MainWindow::setReceiveCharacteristic(CharacteristicInfo *cInfo)
{

    watchedData = cInfo->getCharacteristic(); 

    if (watchedData.isValid())
        {
        const QLowEnergyDescriptor notificationRW = watchedData.descriptor(QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));            
        currentService->writeDescriptor(notificationRW, QByteArray::fromHex("0100")); 
        }
}
然后试着用第二个:

void MainWindow::setDataFromNordicCharacteristic(CharacteristicInfo *cInfo)
{

    dataFromNordicCharacteristic = cInfo->getCharacteristic();
    if (dataFromNordicCharacteristic.isValid())
        {
        const QLowEnergyDescriptor dataFromNordicDescriptor = dataFromNordicCharacteristic.descriptor(QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));   
        currentService->writeDescriptor(dataFromNordicDescriptor, QByteArray::fromHex("0100"));
        if (dataFromNordicDescriptor.isValid())
            ui->plainTextEdit->appendPlainText("Second descriptor is valid");
        else
            ui->plainTextEdit->appendPlainText("Second descriptor is not valid");
        }
}
currentService是我的自定义服务

我为第二个添加了对有效描述符的检查,作为健全性检查,这很好。这两个函数只有在发现定制服务并且在服务中找到特定UUID时才会被调用

然后我会这样做:

connect(currentService, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)), this, SLOT(newCharacteristicValue(QLowEnergyCharacteristic,QByteArray)));
我假设每个服务只需要一个连接,而不是每个特性

有人能看到我在做什么吗?如果您需要更多的代码片段,请询问

编辑:我发现北欧人得到了一个信息,说该特性启用了通知。我已通过以下方式确认:


线路,因为如果我把这条线路拔出来,我就永远得不到连接的信号。所以,似乎有什么东西在发送断开连接信号,但是,我看不到Qt代码中有任何机制可以做到这一点

为了简化操作,在外围设备(北欧nrf)上创建两个独立的定制服务。每个服务都包含一个数据特征和一个描述符,该描述符带有
ClientCharacteristicConfiguration
,用于启用来自中央设备(Qt应用程序)的通知

在Qt应用程序中,您必须连接到这两个服务,并通过编写描述符来启用通知。在插槽
newCharacteristicValue(QLowEnergyCharacteristic,QByteArray)
中,您可以通过uuid来区分特征

如果您需要一个示例,请使用Qt心率游戏示例

currentService->writeDescriptor(dataFromNordicDescriptor, QByteArray::fromHex("0100"));