uniapp蓝牙开发实例详解:从入门到实战

在uniapp中进行蓝牙开发时,如何实现设备扫描、连接和数据传输功能?能否提供一个完整的实例代码,包括权限配置、API调用和常见错误处理?

2 回复

UniApp蓝牙开发:

  1. 初始化蓝牙模块:uni.openBluetoothAdapter()
  2. 搜索设备:uni.startBluetoothDevicesDiscovery()
  3. 连接设备:uni.createBLEConnection()
  4. 读写特征值:通过uni.writeBLECharacteristicValue()uni.readBLECharacteristicValue()
  5. 注意:需在manifest.json配置蓝牙权限,真机调试。
    实战可结合具体设备协议,如心率仪、智能硬件等。

Uniapp蓝牙开发实例详解

蓝牙开发基础

1. 初始化蓝牙模块

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

2. 搜索蓝牙设备

// 开始搜索蓝牙设备
startBluetoothDevicesDiscovery() {
  uni.startBluetoothDevicesDiscovery({
    services: [], // 指定要搜索的服务UUID
    allowDuplicatesKey: false, // 是否允许重复上报设备
    interval: 0, // 上报设备的间隔
    success: (res) => {
      console.log('开始搜索设备')
      this.listenDevices()
    },
    fail: (err) => {
      console.log('搜索设备失败', err)
    }
  })
}

3. 监听发现设备

// 监听发现新设备事件
listenDevices() {
  uni.onBluetoothDeviceFound((devices) => {
    console.log('发现新设备', devices.devices)
    // 将设备添加到列表
    this.deviceList = this.deviceList.concat(devices.devices)
  })
}

完整实战示例

连接蓝牙设备

// 连接蓝牙设备
connectDevice(deviceId) {
  uni.createBLEConnection({
    deviceId: deviceId,
    success: (res) => {
      console.log('连接成功', res)
      this.getBLEDeviceServices(deviceId)
    },
    fail: (err) => {
      console.log('连接失败', err)
    }
  })
}

获取设备服务

// 获取蓝牙设备所有服务
getBLEDeviceServices(deviceId) {
  uni.getBLEDeviceServices({
    deviceId: deviceId,
    success: (res) => {
      console.log('获取服务成功', res.services)
      // 通常第一个服务是主要服务
      if (res.services.length > 0) {
        this.getBLEDeviceCharacteristics(deviceId, res.services[0].uuid)
      }
    }
  })
}

获取特征值

// 获取特征值
getBLEDeviceCharacteristics(deviceId, serviceId) {
  uni.getBLEDeviceCharacteristics({
    deviceId: deviceId,
    serviceId: serviceId,
    success: (res) => {
      console.log('获取特征值成功', res.characteristics)
      // 找到可读写的特征值
      const characteristic = res.characteristics.find(char => 
        char.properties.read && char.properties.write
      )
      if (characteristic) {
        this.notifyBLECharacteristicValueChange(deviceId, serviceId, characteristic.uuid)
      }
    }
  })
}

启用特征值变化通知

// 启用特征值变化通知
notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId) {
  uni.notifyBLECharacteristicValueChange({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: characteristicId,
    state: true,
    success: (res) => {
      console.log('启用通知成功')
      this.listenValueChange()
    }
  })
}

监听数据接收

// 监听特征值变化
listenValueChange() {
  uni.onBLECharacteristicValueChange((res) => {
    console.log('接收到数据', res.value)
    // 将ArrayBuffer转换为字符串
    const data = this.ab2hex(res.value)
    console.log('接收数据:', data)
  })
}

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

发送数据

// 向设备发送数据
sendData(data) {
  uni.writeBLECharacteristicValue({
    deviceId: this.deviceId,
    serviceId: this.serviceId,
    characteristicId: this.characteristicId,
    value: this.str2ab(data),
    success: (res) => {
      console.log('发送成功')
    },
    fail: (err) => {
      console.log('发送失败', err)
    }
  })
}

// 字符串转ArrayBuffer
str2ab(str) {
  const buffer = new ArrayBuffer(str.length)
  const dataView = new DataView(buffer)
  for (let i = 0; i < str.length; i++) {
    dataView.setUint8(i, str.charCodeAt(i))
  }
  return buffer
}

注意事项

  1. 权限配置:在manifest.json中配置蓝牙权限
  2. 设备兼容性:不同设备可能有不同的蓝牙实现
  3. 错误处理:做好各种异常情况的处理
  4. 连接管理:及时关闭不需要的连接

这个实例涵盖了Uniapp蓝牙开发的主要流程,包括初始化、搜索、连接、数据收发等关键步骤。

回到顶部