uniapp ble如何实现蓝牙通信

如何在uniapp中实现蓝牙通信?我需要在APP中通过蓝牙与外部设备进行数据交互,但不太清楚具体实现步骤。能否提供完整的代码示例,包括蓝牙设备的搜索、连接、数据发送和接收等关键步骤的实现方法?另外,在uniapp中使用蓝牙通信有哪些需要注意的兼容性问题?

2 回复

uniapp蓝牙通信步骤:1.初始化蓝牙模块uni.openBluetoothAdapter;2.搜索设备uni.startBluetoothDevicesDiscovery;3.连接设备uni.createBLEConnection;4.获取服务与特征值;5.读写数据:uni.writeBLECharacteristicValue发送,监听onBLECharacteristicValueChange接收。注意处理权限和设备兼容性。


在 UniApp 中实现蓝牙通信主要使用 uni 对象提供的蓝牙 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('开始搜索设备');
      // 监听寻找到新设备的事件
      uni.onBluetoothDeviceFound(this.onDeviceFound);
    }
  });
}

3. 获取发现的设备列表

onDeviceFound(devices) {
  const deviceList = devices.devices;
  deviceList.forEach(device => {
    if (device.localName && !this.devices.some(d => d.deviceId === device.deviceId)) {
      this.devices.push(device); // 保存设备信息
    }
  });
}

4. 连接目标设备

connectToDevice(deviceId) {
  uni.createBLEConnection({
    deviceId,
    success: (res) => {
      console.log('连接成功');
      this.getBLEDeviceServices(deviceId); // 获取设备服务
    }
  });
}

5. 获取设备服务并发现特征值

getBLEDeviceServices(deviceId) {
  uni.getBLEDeviceServices({
    deviceId,
    success: (res) => {
      res.services.forEach(serviceId => {
        this.getBLEDeviceCharacteristics(deviceId, serviceId);
      });
    }
  });
}

getBLEDeviceCharacteristics(deviceId, serviceId) {
  uni.getBLEDeviceCharacteristics({
    deviceId,
    serviceId,
    success: (res) => {
      res.characteristics.forEach(char => {
        if (char.properties.read) {
          // 订阅特征值通知(如需接收数据)
          uni.notifyBLECharacteristicValueChange({
            deviceId,
            serviceId,
            characteristicId: char.characteristicId,
            state: true
          });
        }
      });
    }
  });
}

6. 监听接收数据

// 在连接成功后监听特征值变化
uni.onBLECharacteristicValueChange((res) => {
  const value = res.value;
  const data = ab2hex(value); // 将ArrayBuffer转成十六进制字符串
  console.log('收到数据:', data);
});

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

7. 发送数据到设备

writeData(deviceId, serviceId, characteristicId, data) {
  const buffer = new ArrayBuffer(data.length);
  const dataView = new Uint8Array(buffer);
  for (let i = 0; i < data.length; i++) {
    dataView[i] = data.charCodeAt(i);
  }
  
  uni.writeBLECharacteristicValue({
    deviceId,
    serviceId,
    characteristicId,
    value: buffer,
    success: () => {
      console.log('写入数据成功');
    }
  });
}

8. 断开连接

disconnect(deviceId) {
  uni.closeBLEConnection({ deviceId });
  uni.closeBluetoothAdapter(); // 关闭蓝牙模块
}

注意事项:

  • 需要在 manifest.json 中配置蓝牙权限
  • 真机调试,部分API在模拟器可能不生效
  • 设备特征值需要支持读写/通知属性
  • 数据写入前需要确保设备已连接并发现服务

以上代码提供了蓝牙通信的基本流程,实际使用时请根据具体设备的服务UUID和特征值进行调整。

回到顶部