欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  互联网

微信小程序之蓝牙开发遇到的坑

程序员文章站 2022-01-13 10:59:40
微信小程序之蓝牙开发流程图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qeF44jR-1596178058338)(https://imgkr2.cn-bj.ufileos.com/0ff96f66-0dff-4cb0-b42d-b4b0cf18db2a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=YsCNtt4qZ1oniawMhNElsJg3VP0%253...

微信小程序之蓝牙开发遇到的坑

遇到的坑

  • 低版本手机未打开系统定位服务时,可能出现搜索不到蓝牙设备,所以最好在页面中提示用户打开定位服务。

  • 微信需授权蓝牙,在手机设置里面打开,否则使用不了蓝牙。

  • 部分api需延时调用否则安卓手机有问题(startBluetoothDevicesDiscovery,getBluetoothDevices,writeBLECharacteristicValue)

  • 连接蓝牙,实际上可能已经连接上,但是小程序api调用会返回10003连接失败,安卓手机会出现

  • 断开蓝牙,小程序api调用会返回调用成功,实际上并可能没有与设备断开,安卓手机会出现

流程图

微信小程序之蓝牙开发遇到的坑

使用

1.初始化蓝牙模块

  onLoad: function () {
    let that = this
    that.loadDate();
  },

  loadDate() {
    let that = this;
    //初始化蓝牙模块
    wx.openBluetoothAdapter({
      success: (res) => {
        //获取本机蓝牙适配器状态。
        that.getBluetoothAdapterState()
      },
      fail: (res) => {
        if (res.errCode === 10001) {
          //手机蓝牙未打开,弹出提示框让用户打开
          that.setData({
            bluetoothON: false
          })
          //监听蓝牙适配器状态变化
          wx.onBluetoothAdapterStateChange(function (res) {
            if (res.available) {
              that.setData({
                bluetoothON: true
              })
                //获取本机蓝牙适配器状态。
              that.getBluetoothAdapterState()
            }
          })
        }
      }
    })

  },

2.获取本机蓝牙适配器状态

  //获取本机蓝牙适配器状态。
  getBluetoothAdapterState() {
    var that = this;
    wx.getBluetoothAdapterState({
      success: function (res) {
        that.setData({
          bluetoothON: true
        })
        that.startBluetoothDevicesDiscovery()
      },
      fail(res) {
        console.log(res)
      }
    })
  },

3.搜寻附近的蓝牙外围设备

 //开始搜寻附近的蓝牙外围设备。此操作比较耗费系统资源,请在搜索并连接到设备后调用 wx.stopBluetoothDevicesDiscovery 方法停止搜索。
  startBluetoothDevicesDiscovery() {

    var that = this;
    setTimeout(() => {
      wx.startBluetoothDevicesDiscovery({
        success: function (res) {
          /* 获取蓝牙设备列表 */
          that.getBluetoothDevices()
        },
        fail(res) {
          console.log(res)
        }
      })
    }, 1000)
  },

4.获取搜索到的蓝牙设备列表

 // //获取搜索到的蓝牙设备列表
  getBluetoothDevices() {
    var that = this;
    setTimeout(() => {
      wx.getBluetoothDevices({
        success: function (res) {
          if (res.devices.length > 0) {
            //可使用设备
            let searchDevices = res.devices.filter(item => item.localName && item.localName.startsWith("EFF"));
            //这里根据业务需求找出你想连接的设备,调用connect2Bluetooth
            that.connect2Bluetooth(deviceId)
          } else {
            //没有搜索到设备
            console.log("没有搜索到设备")
          }
        },
        fail(res) {
          console.log(res)
        }
      })
    }, 2000)
  },

5.连接蓝牙

//连接蓝牙
  connect2Bluetooth(deviceId) {
    let that = this;
    wx.createBLEConnection({
      deviceId: deviceId,
      success: function (res) {
        that.setData({
          connected: true,
        })
        //设置蓝牙最大传输单元。需在 wx.createBLEConnection调用成功后调用,mtu 设置范围 (22,512)。安卓5.1以上有效。安卓手机在数据接收限制在20个字节内。苹果手机好像没有限制,可以调用此方法改变大小
        wx.setBLEMTU({
          deviceId: that.data.deviceId,
          mtu: 247,
          success: (res) => {
            console.log("setBLEMTU success>>", res)
          },
          fail: (res) => {
            console.log("setBLEMTU fail>>", res)
           
          }
        })

        /*获取连接设备的service服务 */
        that.getBLEDeviceServices();
        //停止搜索设备
        wx.stopBluetoothDevicesDiscovery()
        //监听蓝牙连接状态
        wx.onBLEConnectionStateChange(function (res) {
          that.setData({
            connected: res.connected
          })
          app.globalData.connected = res.connected
          if (!res.connected) {
            console.log("*******************蓝牙连接已断开*****************")
          }
        })
      },
      fail: function (res) {
        console.log(res)
        log.warn(res)
      }
    })
  },
  1. 获取蓝牙设备的service服务,获取的serviceId有多个要试着连接最终确定哪个是稳定版本的service 获取服务完后获取设备特征值
  getBLEDeviceServices() {
    let that = this;
    wx.getBLEDeviceServices({
      deviceId: that.data.deviceId,
      success: function (res) {
        /* 获取连接设备的所有特征值 */
        for (let i = 0; i < res.services.length; i++) {
        //看你自己项目需求
          if (res.services[i].uuid.toUpperCase().indexOf("FFF0") != -1) {
          //获取设备特征值
            that.getBLEDeviceCharacteristics(res.services[i])
          }
        }

      },
      fail: (res) => {
        console.log(res)
       
      }
    })
  },

7.获取蓝牙设备特征值

  getBLEDeviceCharacteristics(services) {
    let that = this;
    wx.getBLEDeviceCharacteristics({
      deviceId: that.data.deviceId,//// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      serviceId: services.uuid,// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
      success: function (res) {
        for (var i = 0; i < res.characteristics.length; i++) {
          let item = res.characteristics[i]
          if (item.properties.read && item.properties.write && (item.properties.notify || item.properties.indicate)) {
            /* 获取蓝牙特征值 */
            wx.readBLECharacteristicValue({
              deviceId: that.data.deviceId,
              serviceId: services.uuid,
              characteristicId: item.uuid,
            })
            app.globalData.deviceId = that.data.deviceId;
            app.globalData.serviceId = services.uuid;
            app.globalData.characteristicId = item.uuid;
            //写数据
          
            // 启用低功耗蓝牙设备特征值变化时的 notify 功能
            that.notifyBLECharacteristicValueChange(that.data.deviceId, services.uuid, res.characteristics[i].uuid)
          }
        }
      },
      fail: function (res) {
        console.log(res)
      }
    })

  },

8.启动notify 蓝牙监听功能

  notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId) { // 启用低功耗蓝牙设备特征值变化时的 notify 功能
    var that = this;
    wx.notifyBLECharacteristicValueChange({
      state: true,
      deviceId: deviceId,
      serviceId: serviceId,
      characteristicId: characteristicId,
      type: 'notification',//安卓手机需要加这个
      complete(res) {
        console.log(res, '启用低功耗蓝牙设备监听成功')
        //监听获取数据
        wx.onBLECharacteristicValueChange((characteristic) => {
          //设备返回的数据转16进制
          let recBuffer = blueTooth.ab2hex(characteristic.value);
        })
      },
      fail(res) {
        console.log(res, '启用低功耗蓝牙设备监听失败')
      }
    })
  },

工具类 blueTooth.js

//ArrayBuffer转16进制数组示例
function ab2hex(buffer) {
  // let byteRecBuffer =[];
  var hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function (bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  
  return hexArr;
}

//往蓝牙写数据
function writeBLECharacteristicValue(str) {
  console.log('写入:' + str)
  let dataBuffer = new ArrayBuffer(str.length)
  let dataView = new DataView(dataBuffer)
  for (var i = 0; i < str.length; i++) {
    dataView.setUint8(i, str[i])
  }

  wx.writeBLECharacteristicValue({
    deviceId: getApp().globalData.deviceId,
    serviceId: getApp().globalData.serviceId,
    characteristicId: getApp().globalData.characteristicId,
    value: dataBuffer,
    success: function (res) {
     console.log("写入成功")
    },
    fail: function (res) {
      console.log('写入失败' + res.errMsg)
    },
  })
}

// 断开设备连接
function closeConnect() {
  if (getApp().globalData.deviceId) {
      wx.closeBLEConnection({
          deviceId: getApp().globalData.deviceId,
          success: function(res) {
            console.log("蓝牙断开连接")
              closeBluetoothAdapter()
          },
          fail(res) {
          }
      })
  } else {
      closeBluetoothAdapter()
  }
}
// 关闭蓝牙模块
function closeBluetoothAdapter() {

  wx.closeBluetoothAdapter({
      success: function(res) {
        console.log("关闭蓝牙模块")
      },
      fail: function(err) {
      }
  })
}

关注可加我微信号
微信小程序之蓝牙开发遇到的坑

本文地址:https://blog.csdn.net/qq_43643538/article/details/107713496

相关标签: 微信小程序