BLE特征通知偶发异常:为何调用WriteValue而非StartNotify?
Qt Android BLE与树莓派通信时通知启用的DBUS调用差异问题
我正在开发一款Qt Android应用,需通过蓝牙低功耗(BLE)与树莓派通信,交换启动超宽带(UWB)测距会话所需的一系列配置参数。运行树莓派服务程序时,数据交换偶尔会阻塞,原因是数据交互涉及的特征通知未启用,导致手机无法感知特征数据变化,无法做出响应。
为在树莓派端启用通知,Qt应用运行以下代码:
void DeviceHandlerBase::onServiceStateChangedUwb(QLowEnergyService::ServiceState s) { if (s == QLowEnergyService::RemoteServiceDiscovered) { if (m_service == nullptr) { LOGE("UWB SERVICE POINTER IS NULL"); return; } // To be moved to CONFIG.H txCharacteristic = m_service->characteristic(UWB::UWB_TX_CHARACTERISTIC_UUID); rxCharacteristic = m_service->characteristic(UWB::UWB_RX_CHARACTERISTIC_UUID); if (txCharacteristic.isValid() && rxCharacteristic.isValid()) { LOGI("The RX and TX Characteristics were found and are valid"); m_notificationDesc = txCharacteristic.descriptor(UWB::UWB_DESCRIPTOR_UUID); if (m_notificationDesc.isValid()) { LOGI("The notification descriptor is valid"); LOGI("Desc UUID: " + m_notificationDesc.uuid().toString()); LOGI((m_notificationDesc.type())); // Reset the value of the notification descriptor ?! // This might interfere with onConfirmedDescriptorWriteUwb // m_service->writeDescriptor(m_notificationDesc, UWB::BLE_DISABLE_NOTIFICATIONS); m_service->writeDescriptor(m_notificationDesc, UWB::BLE_ENABLE_NOTIFICATIONS); } else LOGE("THE NOTIFICATION DESCRIPTOR IS NOT VALID"); } else LOGE("THE RX AND TX CHARACTERISTICS ARE NOT VALID"); } }
这段代码会向CCCD描述符写入0x0100,理论上应启用树莓派端的通知。树莓派服务端使用DBUS Bluez API进行BLE交互,因此我通过监控Bluez DBUS消息进行调试。
运行服务程序时数据交换随机正常或异常,DBUS消息存在以下差异:
通知正常工作时的DBUS消息
Type=method_call Endian=l Flags=1 Version=1 Cookie=2651 Sender=:1.16 Destination=:1.99 Path=/org/bluez/dbz_application/service_0/char_1 Interface=org.bluez.GattCharacteristic1 Member=StartNotify UniqueName=:1.16 MESSAGE "" { };
通知无法工作时的DBUS消息
Type=method_call Endian=l Flags=0 Version=1 Cookie=2844 Sender=:1.16 Destination=:1.107 Path=/org/bluez/dbz_application/service_0/char_1/desc_0 Interface=org.bluez.GattDescriptor1 Member=WriteValue UniqueName=:1.16 MESSAGE "aya{sv}" { ARRAY "y" { BYTE 1; BYTE 0; }; ARRAY "{sv}" { DICT_ENTRY "sv" { STRING "device"; VARIANT "o" { OBJECT_PATH "/org/bluez/hci0/dev_74_B0_0A_B8_27_BF"; }; }; DICT_ENTRY "sv" { STRING "link"; VARIANT "s" { STRING "LE"; }; }; DICT_ENTRY "sv" { STRING "mtu"; VARIANT "q" { UINT16 517; }; }; }; };
请问为何会调用描述符的WriteValue方法,而非所属特征的StartNotify方法?
内容的提问来源于stack exchange,提问作者jockie22
相关产品推荐
相关产品推荐

