uniapp 蓝牙开发如何使用

在uniapp中进行蓝牙开发时,如何实现设备的搜索、连接和数据传输功能?需要调用哪些API?在安卓和iOS平台上是否有兼容性问题?有没有完整的示例代码可以参考?

2 回复

使用uni-app开发蓝牙功能,需调用uni对象中的蓝牙API。主要步骤:初始化蓝牙适配器、搜索设备、连接设备、获取服务与特征值、读写数据。注意在manifest.json中配置蓝牙权限,并处理安卓和iOS的兼容性问题。


在 UniApp 中进行蓝牙开发,主要使用 uni-app 提供的蓝牙 API。以下是核心步骤和代码示例:

1. 初始化蓝牙

首先检查设备蓝牙状态并初始化:

uni.openBluetoothAdapter({
  success: (res) => {
    console.log('蓝牙初始化成功');
    this.startBluetoothDevicesDiscovery();
  },
  fail: (err) => {
    console.error('蓝牙初始化失败', err);
  }
});

2. 搜索设备

开始搜索周边蓝牙设备:

startBluetoothDevicesDiscovery() {
  uni.startBluetoothDevicesDiscovery({
    services: [], // 指定服务UUID,空数组表示搜索所有设备
    success: (res) => {
      console.log('开始搜索设备');
      this.onBluetoothDeviceFound();
    },
    fail: (err) => {
      console.error('搜索失败', err);
    }
  });
}

3. 监听发现设备

onBluetoothDeviceFound() {
  uni.onBluetoothDeviceFound((res) => {
    res.devices.forEach(device => {
      if (!device.name && !device.localName) return;
      console.log('发现设备:', device.name, device.deviceId);
      // 这里可以保存设备信息到列表
    });
  });
}

4. 连接设备

选择设备后建立连接:

uni.createBLEConnection({
  deviceId: '选择的设备ID',
  success: (res) => {
    console.log('连接成功');
    this.getBLEDeviceServices();
  },
  fail: (err) => {
    console.error('连接失败', err);
  }
});

5. 获取服务

getBLEDeviceServices() {
  uni.getBLEDeviceServices({
    deviceId: '设备ID',
    success: (res) => {
      res.services.forEach(service => {
        if (service.isPrimary) {
          this.getBLEDeviceCharacteristics(service.uuid);
        }
      });
    }
  });
}

6. 获取特征值

getBLEDeviceCharacteristics(serviceId) {
  uni.getBLEDeviceCharacteristics({
    deviceId: '设备ID',
    serviceId: serviceId,
    success: (res) => {
      res.characteristics.forEach(char => {
        // 根据properties判断特征值类型
        if (char.properties.read) {
          // 可读特征
        }
        if (char.properties.write) {
          // 可写特征
        }
        if (char.properties.notify || char.properties.indicate) {
          // 启用通知
          this.notifyBLECharacteristicValueChange(char.characteristicId);
        }
      });
    }
  });
}

7. 启用通知

notifyBLECharacteristicValueChange(characteristicId) {
  uni.notifyBLECharacteristicValueChange({
    deviceId: '设备ID',
    serviceId: '服务UUID',
    characteristicId: characteristicId,
    state: true,
    success: (res) => {
      console.log('通知启用成功');
    }
  });
}

8. 监听数据接收

uni.onBLECharacteristicValueChange((res) => {
  const value = res.value;
  // 处理接收到的数据(ArrayBuffer类型)
  console.log('收到数据:', this.ab2hex(value));
});

// ArrayBuffer转16进制字符串
ab2hex(buffer) {
  return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

9. 发送数据

writeBLECharacteristicValue(data) {
  const buffer = new ArrayBuffer(data.length);
  const dataView = new DataView(buffer);
  // 写入数据...
  
  uni.writeBLECharacteristicValue({
    deviceId: '设备ID',
    serviceId: '服务UUID',
    characteristicId: '特征UUID',
    value: buffer,
    success: (res) => {
      console.log('写入成功');
    }
  });
}

注意事项:

  1. 真机调试:需要在手机设置中开启蓝牙
  2. 权限配置:在 manifest.json 中配置蓝牙权限
  3. 设备兼容性:不同设备蓝牙特性可能不同
  4. 错误处理:务必添加完整的错误处理逻辑
  5. 及时清理:页面卸载时停止搜索和断开连接

完整开发流程:初始化 → 搜索 → 连接 → 发现服务 → 发现特征 → 数据通信。建议参考 uni-app 官方文档获取最新 API 说明。

回到顶部