HarmonyOS鸿蒙Next原生蓝牙调用BLECharacteristicChange时不执行

HarmonyOS鸿蒙Next原生蓝牙调用BLECharacteristicChange时不执行 鸿蒙连接、写入命令都是可以的,但就是获取不到设备返回的数据

this.connectedDevice.on('BLECharacteristicChange', (result: ble.BLECharacteristic) => {
  const characteristicUuid = result.characteristicUuid;
  const rawData = result.characteristicValue;

  // 调试日志
  iLog(`[DEBUG] BLECharacteristicChange | UUID: ${characteristicUuid}`);

  // 安全验证数据
  if (!rawData || (rawData instanceof ArrayBuffer && rawData.byteLength === 0)) {
    eLog(`[BLE] Empty data received for characteristic ${characteristicUuid}`);
    return;
  }

  try {
    // 统一处理数据类型
    const uint8Data = rawData instanceof Uint8Array
      ? rawData
      : new Uint8Array(rawData);

    // 生成十六进制字符串
    const hexStr = Array.from(uint8Data)
      .map(byte => byte.toString(16).padStart(2, '0'))
      .join(' ');

    iLog(`[BLE DATA] UUID: ${characteristicUuid}, Length: ${uint8Data.length}, Data: ${hexStr}`);

    // 安全调用回调
    this.onDataReceivedCallback?.(uint8Data);
  } catch (error) {
    eLog(`[BLE] Data processing error for ${characteristicUuid}:`+ error);
  }
});

iLog([DEBUG] BLECharacteristicChange | UUID: ${characteristicUuid});根本就没打印,有人遇到过嘛?请大佬指点一下?


更多关于HarmonyOS鸿蒙Next原生蓝牙调用BLECharacteristicChange时不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,BLECharacteristicChange事件不执行,通常由以下原因导致:

  1. 特征值未正确启用通知或指示。
  2. 设备未成功订阅特征值变化。
  3. 蓝牙GATT连接状态异常或服务/特征值发现不完整。
  4. 特征值本身不支持通知或指示属性。

请检查代码中是否已调用enableCharacteristicNotification()方法并确认返回成功,同时确保在onCharacteristicChange()回调注册前已完成特征值发现与订阅。

更多关于HarmonyOS鸿蒙Next原生蓝牙调用BLECharacteristicChange时不执行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


从你提供的代码和截图来看,BLECharacteristicChange 事件没有被触发,核心原因通常在于没有成功启用目标特征值的通知(Notification)或指示(Indication)

你的代码只监听了事件,但要让设备主动发送数据(即触发 BLECharacteristicChange),必须执行一个关键的前置步骤:启用特征值的通知/指示

问题分析与解决方案

  1. 核心问题:缺少 setBLECharacteristicChange 调用 监听事件(on)只是注册了回调函数,但设备并不知道需要向你的应用推送数据。你需要主动告诉设备:“请把特定特征值的变化通知我”。这是通过 setBLECharacteristicChange 方法实现的。

  2. 关键步骤:在连接成功后,启用通知 在你成功连接设备(connect)并发现服务与特征值(getBLEDeviceServicesgetBLEDeviceCharacteristics)之后,必须对支持 NOTIFYINDICATE 属性的特征值调用此方法。

    修正后的关键代码逻辑应如下:

    // 1. 连接设备 (假设已完成)
    // 2. 发现服务和特征值 (假设已完成,并找到了目标特征值 characteristicUuid)
    
    // 3. 启用特征值变化通知(关键步骤!)
    try {
      await this.connectedDevice.setBLECharacteristicChange({
        serviceUuid: yourServiceUuid, // 替换为你的服务UUID
        characteristicUuid: yourCharacteristicUuid, // 替换为你要监听的特征值UUID
        enable: true // 启用通知
      });
      iLog(`[BLE] 成功启用特征值 ${yourCharacteristicUuid} 的通知`);
    } catch (err) {
      eLog(`[BLE] 启用特征值通知失败:`, err);
    }
    
    // 4. 然后,再设置监听回调(你的现有代码)
    this.connectedDevice.on('BLECharacteristicChange', (result: ble.BLECharacteristic) => {
      // ... 你的数据处理逻辑
    });
    
  3. 检查特征值属性 请确保你尝试启用通知的 characteristicUuid 在其属性(properties)中确实包含 notifyindicate。你的截图显示你正在操作的特征值 0000ffe1-...,其属性为 ['write', 'writeNoResponse'],这仅支持写入,不支持通知

    • 结论:你监听 0000ffe1-... 这个特征值是不会收到数据的,因为它本身不具备通知功能。
    • 下一步:你需要检查设备的所有特征值,找到那个属性包含 notifyindicate 的特征值(通常用于接收数据),并对那个特征值调用 setBLECharacteristicChangeon 方法。

排查步骤总结

  1. 确认特征值:使用 getBLEDeviceCharacteristics 获取设备所有特征值列表,仔细检查每个特征值的 properties 数组,找到包含 notifyindicate 的那个。
  2. 启用通知:对正确的特征值(支持通知的那个)调用 setBLECharacteristicChange 方法,将 enable 参数设为 true
  3. 监听事件:确保 on('BLECharacteristicChange', ...) 监听的是同一个特征值。
  4. 验证流程:确保调用顺序是:连接 -> 发现服务 -> 发现特征值 -> 启用通知 -> 监听事件。

你的代码逻辑本身没有错误,问题出在蓝牙通信的标准流程上:必须先启用通知,设备端才会在数据变化时向客户端发送数据包,从而触发 BLECharacteristicChange 事件。请根据设备文档或特征值属性,找到正确的可通知特征值并启用它。

回到顶部