uniapp: 低功耗蓝牙(BLE)的使用

在微信小程序中实现蓝牙对接蓝牙秤的重量功能,主要依赖微信小程序提供的低功耗蓝牙(BLE)API。以下是一个清晰的步骤指南,帮助你完成从连接蓝牙秤到获取重量数据的开发流程。需要注意的是,具体实现可能因蓝牙秤的协议和硬件特性而有所不同,因此你需要参考蓝牙秤的开发文档(比如服务UUID、特征值UUID等)。


开发步骤

1. 配置小程序权限

在小程序的 app.json 文件中添加蓝牙相关权限,确保小程序有权使用蓝牙功能:

jsonJSON 格式

json 复制代码
{
  "permission": {
    "scope.bluetooth": {
      "desc": "您的蓝牙权限将用于连接蓝牙秤"
    }
  }
}

2. 初始化蓝牙适配器

使用 wx.openBluetoothAdapter 初始化蓝牙模块,确保手机蓝牙已开启:

javascriptJavaScript (英语)

javascript 复制代码
wx.openBluetoothAdapter({
  success(res) {
    console.log('蓝牙适配器初始化成功');
    // 继续后续操作
  },
  fail(res) {
    console.log('蓝牙适配器初始化失败,请检查蓝牙是否开启', res);
  }
});

3. 搜索蓝牙设备

调用 wx.startBluetoothDevicesDiscovery 开始搜索附近的蓝牙设备。通常需要根据蓝牙秤的设备名称或服务UUID进行过滤:

javascriptJavaScript (英语)

javascript 复制代码
wx.startBluetoothDevicesDiscovery({
  success(res) {
    console.log('开始搜索蓝牙设备');
    wx.onBluetoothDeviceFound((res) => {
      res.devices.forEach(device => {
        // 根据设备名称或服务UUID筛选蓝牙秤
        if (device.name.includes('YourScaleName')) { // 替换为实际蓝牙秤名称
          console.log('发现蓝牙秤:', device);
          // 停止搜索
          wx.stopBluetoothDevicesDiscovery();
          // 保存设备ID
          const deviceId = device.deviceId;
          // 连接设备
          connectBLE(deviceId);
        }
      });
    });
  },
  fail(res) {
    console.log('搜索设备失败', res);
  }
});

4. 连接蓝牙秤

使用 wx.createBLEConnection 连接指定的蓝牙秤:

javascriptJavaScript (英语)

javascript 复制代码
function connectBLE(deviceId) {
  wx.createBLEConnection({
    deviceId: deviceId,
    success(res) {
      console.log('连接蓝牙秤成功');
      // 获取服务
      getBLEDeviceServices(deviceId);
    },
    fail(res) {
      console.log('连接失败', res);
    }
  });
}

5. 获取服务和特征值

连接成功后,使用 wx.getBLEDeviceServiceswx.getBLEDeviceCharacteristics 获取蓝牙秤的服务和特征值。特征值中通常会有一个用于读取重量数据的特征(参考设备文档):

javascriptJavaScript (英语)

javascript 复制代码
function getBLEDeviceServices(deviceId) {
  wx.getBLEDeviceServices({
    deviceId: deviceId,
    success(res) {
      res.services.forEach(service => {
        // 假设目标服务UUID已知
        if (service.uuid === 'YOUR_SERVICE_UUID') { // 替换为实际服务UUID
          getBLEDeviceCharacteristics(deviceId, service.uuid);
        }
      });
    }
  });
}

function getBLEDeviceCharacteristics(deviceId, serviceId) {
  wx.getBLEDeviceCharacteristics({
    deviceId: deviceId,
    serviceId: serviceId,
    success(res) {
      res.characteristics.forEach(characteristic => {
        // 找到支持通知(notify)的特征值,用于接收重量数据
        if (characteristic.properties.notify) {
          enableNotify(deviceId, serviceId, characteristic.uuid);
        }
      });
    }
  });
}

6. 启用通知并监听重量数据

使用 wx.notifyBLECharacteristicValueChange 启用特征值通知,并通过 wx.onBLECharacteristicValueChange 监听蓝牙秤发送的重量数据:

javascriptJavaScript (英语)

javascript 复制代码
function enableNotify(deviceId, serviceId, characteristicId) {
  wx.notifyBLECharacteristicValueChange({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: characteristicId,
    state: true,
    success() {
      console.log('启用通知成功');
      // 监听特征值变化
      wx.onBLECharacteristicValueChange((res) => {
        const value = res.value; // ArrayBuffer类型数据
        const weight = parseWeightData(value); // 自定义解析函数
        console.log('当前重量:', weight);
      });
    }
  });
}

// 解析重量数据(需根据蓝牙秤协议实现)
function parseWeightData(buffer) {
  const dataView = new DataView(buffer);
  // 示例:假设重量数据是2字节整数,单位为克
  const weightInGrams = dataView.getUint16(0, true); // 小端序
  return weightInGrams / 1000; // 转换为千克
}

7. 断开连接(可选)

使用完成后,可以通过 wx.closeBLEConnection 断开与蓝牙秤的连接:

javascriptJavaScript (英语)

javascript 复制代码
wx.closeBLEConnection({
  deviceId: deviceId,
  success(res) {
    console.log('断开连接成功');
  }
});

注意事项

  1. 蓝牙秤协议:每款蓝牙秤的通信协议不同(如服务UUID、特征值UUID、数据格式),需仔细阅读设备提供的开发文档。
  2. 兼容性:iOS和Android在蓝牙实现上可能有细微差异,尤其是特征值UUID的处理(有时大小写敏感)。
  3. 数据解析:蓝牙秤返回的重量数据可能是二进制格式(如ArrayBuffer),需要根据协议转换为可读的重量值。
  4. 错误处理:确保在每个步骤中添加失败回调,提示用户检查蓝牙状态或设备连接。

流程总结

  1. 初始化蓝牙适配器。
  2. 搜索并连接目标蓝牙秤。
  3. 获取服务和特征值,找到重量数据的特征。
  4. 启用通知并监听实时重量数据。
  5. 根据协议解析数据并显示。
相关推荐
BXCQ_xuan34 分钟前
Ngrok 配置:实现 Uniapp 前后端项目内网穿透
运维·uni-app
TE-茶叶蛋5 小时前
uniapp的适配方式
uni-app
lqj_本人5 小时前
鸿蒙OS&UniApp 制作自定义弹窗与模态框组件#三方框架 #Uniapp
uni-app
繁依Fanyi11 小时前
用 UniApp 构建习惯打卡 App —— HabitLoop 开发记
javascript·uni-app·codebuddy首席试玩官
三天不学习11 小时前
Uniapp 与 Uniapp X 对比:新手上手指南及迁移到 Uniapp X 的注意事项
uni-app·uniapp x
不爱吃饭爱吃菜14 小时前
uniapp微信小程序一键授权登录
前端·javascript·vue.js·微信小程序·uni-app
明耀14 小时前
WPF C# 用WebView加载H5页面(uniapp项目,vue项目)
uni-app·c#·wpf
timeguys1 天前
【前端】[vue3] [uni-app]使用 vantUI 框架
前端·uni-app
Aiden Targaryen1 天前
Windows/MacOS WebStorm/IDEA 中开发 Uni-App 配置
java·uni-app·webstorm
想要飞翔的pig1 天前
uniapp+vue3页面滚动加载数据
前端·vue.js·uni-app