uniapp 如何实现蓝牙连接多个设备

在uniapp中如何实现同时连接多个蓝牙设备?目前可以搜索和连接单个设备,但需要同时连接多个设备进行数据交互。请问具体的实现步骤和代码示例是怎样的?是否需要特殊配置或考虑设备兼容性问题?

2 回复

在uniapp中,通过uni.createBLEConnection连接单个设备。连接多个设备时,需要循环调用此方法,并保存每个设备的deviceId。注意管理连接状态,避免同时连接过多设备导致性能问题。


在 UniApp 中实现蓝牙连接多个设备,可以通过微信小程序提供的蓝牙 API 实现。核心步骤包括初始化蓝牙、搜索设备、连接设备、管理多个连接以及数据通信。以下是具体实现方法及示例代码:

实现步骤

  1. 初始化蓝牙模块
    使用 openBluetoothAdapter 开启蓝牙适配器。

  2. 搜索设备
    通过 startBluetoothDevicesDiscovery 开始搜索,监听 onBluetoothDeviceFound 获取设备列表。

  3. 连接多个设备
    对每个目标设备调用 createBLEConnection 建立连接,保存每个设备的 deviceId 用于区分。

  4. 管理连接状态
    使用数组或对象存储多个设备的连接状态和数据。

  5. 数据通信
    连接后通过 writeBLECharacteristicValue 发送数据,监听 onBLECharacteristicValueChange 接收数据。

  6. 断开连接
    使用 closeBLEConnection 断开指定设备,最后关闭适配器。

示例代码

// 存储设备列表和连接状态
let devices = {}; // 以 deviceId 为键存储设备信息

// 1. 初始化蓝牙
uni.openBluetoothAdapter({
  success: () => {
    console.log('蓝牙适配器开启成功');
    startDiscovery();
  },
  fail: (err) => {
    console.error('初始化失败:', err);
  }
});

// 2. 搜索设备
function startDiscovery() {
  uni.startBluetoothDevicesDiscovery({
    services: [], // 指定服务UUID,空数组表示搜索所有设备
    success: () => {
      console.log('开始搜索设备');
      // 监听发现新设备
      uni.onBluetoothDeviceFound((res) => {
        res.devices.forEach(device => {
          if (device.name && !devices[device.deviceId]) {
            devices[device.deviceId] = device;
            console.log('发现设备:', device.name, device.deviceId);
            // 连接符合条件的设备(例如名称匹配)
            if (device.name.includes('Target')) {
              connectDevice(device.deviceId);
            }
          }
        });
      });
    }
  });
}

// 3. 连接指定设备
function connectDevice(deviceId) {
  uni.createBLEConnection({
    deviceId,
    success: () => {
      console.log(`设备 ${deviceId} 连接成功`);
      // 获取服务(需根据实际设备替换 serviceId 和 characteristicId)
      uni.getBLEDeviceServices({
        deviceId,
        success: (res) => {
          res.services.forEach(service => {
            if (service.isPrimary) {
              uni.getBLEDeviceCharacteristics({
                deviceId,
                serviceId: service.uuid,
                success: (charRes) => {
                  charRes.characteristics.forEach(char => {
                    if (char.properties.notify) {
                      // 启用通知以接收数据
                      uni.notifyBLECharacteristicValueChange({
                        deviceId,
                        serviceId: service.uuid,
                        characteristicId: char.uuid,
                        state: true,
                      });
                    }
                  });
                }
              });
            }
          });
        }
      });
    },
    fail: (err) => {
      console.error(`连接失败:`, err);
    }
  });
}

// 4. 监听数据接收
uni.onBLECharacteristicValueChange((res) => {
  console.log(`设备 ${res.deviceId} 发送数据:`, res.value);
  // 处理数据(例如转换为字符串)
  let data = String.fromCharCode(...new Uint8Array(res.value));
});

// 5. 发送数据到指定设备
function writeData(deviceId, data) {
  // 需要先确保已连接并获取 characteristic(示例中需替换实际UUID)
  let serviceId = 'xxx'; // 实际服务UUID
  let characteristicId = 'yyy'; // 实际特征值UUID
  uni.writeBLECharacteristicValue({
    deviceId,
    serviceId,
    characteristicId,
    value: Array.from(data).map(char => char.charCodeAt()),
    success: () => console.log('发送成功'),
  });
}

// 6. 断开单个设备
function disconnectDevice(deviceId) {
  uni.closeBLEConnection({ deviceId });
  delete devices[deviceId];
}

// 7. 关闭蓝牙适配器(退出时调用)
function closeBluetooth() {
  uni.closeBluetoothAdapter();
}

注意事项

  • 设备限制:平台可能限制同时连接的设备数量(例如微信小程序最多同时连接5个)。
  • 兼容性:确保蓝牙设备支持 BLE(低功耗蓝牙)。
  • 超时处理:添加连接超时逻辑,避免长时间等待。
  • 权限:在 manifest.json 中配置蓝牙权限(仅 App 端需要)。

通过以上方法,即可在 UniApp 中实现连接并管理多个蓝牙设备。根据实际设备调整服务 UUID 和特征值。

回到顶部