uniapp onblecharacteristicvaluechange事件如何使用

在uniapp中使用蓝牙时,onBLECharacteristicValueChange事件应该如何正确监听?我按照文档调用了uni.onBLECharacteristicValueChange方法,但收不到设备返回的数据。请问这个事件是否需要先启用notify或indicate?回调函数的参数具体包含哪些信息?能否提供一个完整的示例代码,包括初始化、监听和数据处理的全流程?

2 回复

在UniApp中,使用onBLECharacteristicValueChange监听蓝牙特征值变化。示例:

uni.onBLECharacteristicValueChange(function(res) {
  console.log('特征值变化:', res.value);
});

需先调用uni.notifyBLECharacteristicValueChange启用监听。记得在onUnload中调用uni.offBLECharacteristicValueChange取消监听。


在 UniApp 中,onBLECharacteristicValueChange 是一个蓝牙低功耗(BLE)特征值变化的事件监听器,用于接收蓝牙设备特征值(Characteristic)数据更新的通知。以下是使用步骤和示例代码:

使用步骤:

  1. 初始化蓝牙模块:使用 uni.openBluetoothAdapter
  2. 监听特征值变化:通过 uni.onBLECharacteristicValueChange 注册事件。
  3. 启用特征值通知:使用 uni.notifyBLECharacteristicValueChange 启用设备通知。
  4. 处理接收的数据:在事件回调中解析特征值数据(通常为 ArrayBuffer 格式)。

示例代码:

// 1. 初始化蓝牙模块
uni.openBluetoothAdapter({
  success: (res) => {
    console.log('蓝牙适配器打开成功');
    startBLE(); // 开始蓝牙操作
  },
  fail: (err) => {
    console.error('蓝牙适配器打开失败:', err);
  }
});

function startBLE() {
  // 2. 监听特征值变化事件
  uni.onBLECharacteristicValueChange((res) => {
    console.log('特征值变化:', res);
    // res 包含 deviceId、serviceId、characteristicId、value(ArrayBuffer)
    const value = res.value;
    // 将 ArrayBuffer 转换为十六进制字符串或处理数据
    const hexString = Array.from(new Uint8Array(value))
      .map(b => b.toString(16).padStart(2, '0'))
      .join('');
    console.log('接收数据:', hexString);
  });

  // 3. 启用特征值通知(需已连接设备并发现服务)
  uni.notifyBLECharacteristicValueChange({
    deviceId: '设备ID', // 替换为实际设备ID
    serviceId: '服务UUID', // 替换为实际服务UUID
    characteristicId: '特征UUID', // 替换为实际特征UUID
    state: true, // 启用通知
    success: () => {
      console.log('启用特征值通知成功');
    },
    fail: (err) => {
      console.error('启用通知失败:', err);
    }
  });
}

注意事项:

  • 确保设备已连接(使用 uni.createBLEConnection)。
  • 先发现服务(uni.getBLEDeviceServices)和特征(uni.getBLEDeviceCharacteristics)。
  • 特征必须支持 notifyindicate 属性。
  • 数据格式需根据设备协议解析(如十六进制、UTF-8)。

如有问题,提供更多细节(如设备协议)可进一步调试。

回到顶部