我让Nordic nrf与在Linux上运行的Qt应用通信。设置Qt应用程序以获取定制服务中定制特征的通知。这很好。
然后,我向北欧定制服务添加了第二个特征。
如果我将手机连接到Nordic,则会收到来自两个特征的通知。但是,使用我的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)));
我假设每个服务只需要一个连接,而不是每个特征。
任何人都可以看到我可能在做什么吗?如果您需要更多代码段,请询问。
编辑:我发现北欧人收到一条消息,说该特征已启用其通知。我已经通过以下方式确认了这一点:
currentService->writeDescriptor(dataFromNordicDescriptor, QByteArray::fromHex("0100"));
线路,因为如果我将此线路取出,则永远不会获得连接的信号。因此,似乎有些东西正在发送断开信号,但是,我看不到Qt代码中的任何机制都能做到这一点。
答案 0 :(得分:1)
为了使事情变得更容易,请在外围设备(Nordic nrf)上创建两个单独的自定义服务。每个服务都包含数据的特征和带有ClientCharacteristicConfiguration
的描述符,以启用来自中央设备(Qt应用程序)的通知。
在Qt App中,您必须连接到这两个服务并通过像编写脚本那样启用描述符来启用通知。在插槽newCharacteristicValue(QLowEnergyCharacteristic,QByteArray)
中,您可以通过其uuid来区分特征。
如果您需要一个示例,请使用Qt心率游戏示例。