开发一款通过蓝牙连接控制水电表的微信小程序

增强软硬件交互

为了更好的解决师生生活中的实际问题,开发蓝牙小程序加强了和校区硬件的交互。

比如通过蓝牙连接控制水电表,减少实体卡片的使用。添加人脸活体检测功能,提高本人认证效率,减少师生等待时间。

蓝牙水电控展示

蓝牙水电控展示

微信小程序实现蓝牙BLE:

步骤:

1、wx.openBluetoothAdapter//蓝牙初始化

2、 wx.onBluetoothDeviceFound //监听寻找到新设备的事件

3、 wx.startBluetoothDevicesDiscovery //开始搜寻附近的蓝牙外围设备

4、 wx.getBluetoothDevices//获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。

5、wx.stopBluetoothDevicesDiscovery//停止搜寻附近的蓝牙外围设备。搜索到需要设备时或者连接时候停止搜索

6、wx.createBLEConnection //连接设备

7、 wx.getBLEDeviceServices //获取所有服务列表

8、wx.getBLEDeviceCharacteristics//获取蓝牙设备某个服务中的所有特征值

9、wx.onBLEConnectionStateChange //监听设备连接状态(本人用小米2手环测试经常断)

10、 wx.notifyBLECharacteristicValueChange // 启用低功耗蓝牙设备特征值变化是的notify功能

11、 wx.onBLECharacteristicValueChange//开始监听特征值的变化

12、 wx.writeBLECharacteristicValue//写入特征值

13、wx.readBLECharacteristicValue//读取特征值

基本使用流程:

1、 初始化蓝牙模块

在使用蓝牙接口前,必须首先调用 wx.openBluetoothAdapter 初始化蓝牙适配器模块,其他接口必须在初始化后成功方可调用。

当蓝牙开关未开启或手机不支持蓝牙时,会返回错误 (errCode=10001)。此时小程序蓝牙模块已经初始化完成,可通过 wx.onBluetoothAdapterStateChange 监听手机蓝牙状态的改变,也可以调用蓝牙模块的所有API。开发者在开发中应该考虑兼容用户在使用小程序过程中打开/关闭蓝牙开关的情况,并给出必要的提示,提高可用性。

2、 扫描并发现蓝牙外围设备

蓝牙模块初始化成功后,一般需要通过 wx.startBluetoothDevicesDiscovery 扫描外围设备。当蓝牙外围设备被扫描到时,会回调 wx.onBluetoothDeviceFound 事件,返回扫描到的设备。扫描设备比较耗费系统资源,请在搜索到需要的设备后及时调用 wx.stopBluetoothDevicesDiscovery 停止搜索。

若之前已连接过某个设备,获取到了 deviceId,可跳过扫描步骤。

复制代码
// 监听扫描到新设备事件
wx.onBluetoothDeviceFound((res) => {
  res.devices.forEach((device) => {
    // 这里可以做一些过滤
    console.log('Device Found', device)
  })
  // 找到要搜索的设备后,及时停止扫描
  wx.stopBluetoothDevicesDiscovery()
})

// 初始化蓝牙模块
wx.openBluetoothAdapter({
  mode: 'central',
  success: (res) => {
    // 开始搜索附近的蓝牙外围设备
    wx.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
    })
  },
  fail: (res) => {
    if (res.errCode !== 10001) return
    wx.onBluetoothAdapterStateChange((res) => {
      if (!res.available) return
      // 开始搜寻附近的蓝牙外围设备
      wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false,
      })
    })
  }
})

3、 连接设备

蓝牙低功耗设备间要进行通信,必须首先建立连接。

复制代码
wx.createBLEConnection({
  deviceId, // 搜索到设备的 deviceId
  success: () => {
    // 连接成功,获取服务
    wx.getBLEDeviceServices({
      deviceId,
    })
  }
})

4、 获取蓝牙外围设备的服务

复制代码
wx.getBLEDeviceServices({
  deviceId, // 搜索到设备的 deviceId
  success: (res) => {
    for (let i = 0; i < res.services.length; i++) {
      if (res.services[i].isPrimary) {
        // 可根据具体业务需要,选择一个主服务进行通信
      }
    }
  }
})

5、 读写服务的特征值

复制代码
wx.getBLEDeviceCharacteristics({
  deviceId, // 搜索到设备的 deviceId
  serviceId, // 上一步中找到的某个服务
  success: (res) => {
    for (let i = 0; i < res.characteristics.length; i++) {
      let item = res.characteristics[i]
      if (item.properties.write) { // 该特征值可写
        // 本示例是向蓝牙设备发送一个 0x00 的 16 进制数据
        // 实际使用时,应根据具体设备协议发送数据
        let buffer = new ArrayBuffer(1)
        let dataView = new DataView(buffer)
        dataView.setUint8(0, 0)
        wx.writeBLECharacteristicValue({
          deviceId,
          serviceId,
          characteristicId: item.uuid,
          value: buffer,
        })
      }
      if (item.properties.read) { // 该特征值可读
        wx.readBLECharacteristicValue({
          deviceId,
          serviceId,
          characteristicId: item.uuid,
        })
      }
      if (item.properties.notify || item.properties.indicate) {
        // 必须先启用 wx.notifyBLECharacteristicValueChange 才能监听到设备 onBLECharacteristicValueChange 事件
        wx.notifyBLECharacteristicValueChange({
          deviceId,
          serviceId,
          characteristicId: item.uuid,
          state: true,
        })
      }
    }
  }
})
// 操作之前先监听,保证第一时间获取数据
wx.onBLECharacteristicValueChange((result) => {
  // 使用完成后在合适的时机断开连接和关闭蓝牙适配器
  wx.closeBLEConnection({
    deviceId,
  })
  wx.closeBluetoothAdapter({})
})

6、 断开连接和关闭蓝牙适配器

使用完成后,应该在合适的时机断开连接,并关闭蓝牙适配器。

相关推荐
胡斌附体2 小时前
小程序难调的组件
前端·小程序·apache·datepicker·自定义组件·checkbox
梦吉网络3 小时前
悬赏任务系统网站兼职赚钱小程序搭建地推抖音视频任务拉新源码功能详解二开
小程序
mdkk67811 小时前
手机控制断路器:智能家居安全用电的新篇章
安全·智能手机·智能家居
2501_9160074719 小时前
Charles中文版抓包工具使用指南 提高API调试和网络优化效率
android·ios·小程序·https·uni-app·iphone·webview
weixin_lynhgworld1 天前
剧本杀小程序系统开发:推动社交娱乐产业创新发展
小程序·娱乐
嵌入式小李1 天前
STM32项目(20)——智能家居(含机智云APP)
stm32·嵌入式硬件·智能家居
你喜欢喝可乐吗?1 天前
微信小程序与后台管理系统开发全流程指南
spring boot·微信小程序·vue
七七软件开发1 天前
无人共享 app 系统架构分析
java·python·小程序·系统架构·php
云起SAAS1 天前
躺平发育小游戏微信抖音流量主小程序开源
小程序·躺平发育小游戏微信抖音流