You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:02:49