博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小程序之蓝牙的使用
阅读量:5049 次
发布时间:2019-06-12

本文共 6357 字,大约阅读时间需要 21 分钟。

初始化蓝牙

使用蓝牙之前,首先要先初始化蓝牙(openBluetoothAdapter),之后才能调用蓝牙的各种api。初始化状态分为两种:

初始化成功:这时可以去搜索蓝牙设备(startBluetoothDevicesDiscovery)
初始化失败:这个时候需要提示用户打开蓝牙,同时监听蓝牙的状态(onBluetoothAdapterStateChange),当蓝牙打开时,去搜索设备。

openBluetoothAdapter() {    const that = this    wx.openBluetoothAdapter({      success: (res) => {        console.log('openBluetoothAdapter success', res)        // 初始化成功,去搜索设备        this.startBluetoothDevicesDiscovery()      },      fail: (res) => {        if (res.errCode === 10001) {          // 蓝牙未打开,监听蓝牙状态          wx.onBluetoothAdapterStateChange(function (res) {            console.log('onBluetoothAdapterStateChange', res)            if (res.available) {              that.startBluetoothDevicesDiscovery()            }          })        }      }    })  }

搜索蓝牙设备

开始搜索附近的蓝牙设备(startBluetoothDevicesDiscovery),该操作比较耗费资源,建议在连接到蓝牙设备后,手动停止搜索。

startBluetoothDevicesDiscovery() {    if (this._discoveryStarted) {      return    }    this._discoveryStarted = true    // 开始搜索蓝牙设备,allowDuplicatesKey,会重复搜索同一设备    wx.startBluetoothDevicesDiscovery({      allowDuplicatesKey: true,      success: (res) => {        console.log('startBluetoothDevicesDiscovery success', res)        this.onBluetoothDeviceFound()      },    })  }

## 获取蓝牙设备

获取蓝牙设备有两个api。

  • onBluetoothDeviceFound:获取新发现的设备,将startBluetoothDevicesDiscovery中的allowDuplicatesKey设置为true时,该方法重复上报同一蓝牙设备。
  • getBluetoothDevices:获取已经发现的蓝牙设备列表,该方法获取的蓝牙设备数量跟搜索时间有关系,一般在开始搜索蓝牙设备后,延时一段时间在调用该方法。
onBluetoothDeviceFound() {    // 获取新发现的蓝牙设备    wx.onBluetoothDeviceFound((res) => {      res.devices.forEach(device => {        if (!device.name && !device.localName) {          return        }        const foundDevices = this.data.devices        const idx = inArray(foundDevices, 'deviceId', device.deviceId)        const data = {}        if (idx === -1) {          data[`devices[${foundDevices.length}]`] = device        } else {          data[`devices[${idx}]`] = device        }        this.setData(data)      })    })  }

连接蓝牙设备

createBLEConnection:连接蓝牙设备,基本上到这,蓝牙设备就连接上了。为了避免一个设备多个连接实例,一般和closeBLEConnection成对调用。在连接成功后,一般需要调用stopBluetoothDevicesDiscovery,停止蓝牙的搜索。

createBLEConnection(e) {    const ds = e.currentTarget.dataset    const deviceId = ds.deviceId    const name = ds.name    // 开始连接蓝牙设备    wx.createBLEConnection({      deviceId,      success: (res) => {        this.setData({          connected: true,          name,          deviceId,        })        this.getBLEDeviceServices(deviceId)      }    })    // 在连接蓝牙设备后,停止搜索蓝牙。    this.stopBluetoothDevicesDiscovery()  }

停止搜索蓝牙设备

stopBluetoothDevicesDiscovery: 在蓝牙设备连接成功后,需要停止搜索蓝牙设备。

stopBluetoothDevicesDiscovery() {    wx.stopBluetoothDevicesDiscovery()  }

监听蓝牙设备的连接状态

onBLEConnectionStateChange:监听蓝牙设备的连接状态,包括蓝牙设备的丢失,断开,可以在该方法中进行处理这些连接后发生的异常情况。

wx.onBLEConnectionStateChange(function (res) {  // 该方法回调中可以用于处理连接意外断开等异常情况  console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)})

获取蓝牙设备服务

在连接上蓝牙设备后,我们想要的还是跟蓝牙进行通信,或读取蓝牙设备的数据,或写数据到蓝牙设备。首先需要获取蓝牙设备的服务信息。

getBLEDeviceServices(deviceId) {    // 获取蓝牙设备的服务信息。    wx.getBLEDeviceServices({      deviceId,      success: (res) => {        for (let i = 0; i < res.services.length; i++) {          if (res.services[i].isPrimary) {            // 获取蓝牙设备的特征值            this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)            return          }        }      }    })  }

获取蓝牙设备的特征值

getBLEDeviceCharacteristics:根据蓝牙的服务信息,获取可以跟蓝牙进行通信的特征值。一般使用notify或indicate为true、read或write为true的特征值。

启用蓝牙设备的通知功能

notifyBLECharacteristicValueChange: 启用蓝牙设备的通知功能,该方法需要蓝牙设备的特征值 notify 或 indicate 为 true。只有在在蓝牙设备启用该功能,才能监听到蓝牙设备的数据变化。

获取蓝牙设备的数据

onBLECharacteristicValueChange:监听蓝牙设备的数据变化,当蓝牙设备的数据变化时,可以获取相应变化后的数据。需要在启用蓝牙设备的通知功能后才能使用。

写数据到蓝牙设备

writeBLECharacteristicValue:写数据到蓝牙设备,需要特征值的write为true

// 获取蓝牙设备的特征值  getBLEDeviceCharacteristics(deviceId, serviceId) {    wx.getBLEDeviceCharacteristics({      deviceId,      serviceId,      success: (res) => {        console.log('getBLEDeviceCharacteristics success', res.characteristics)        for (let i = 0; i < res.characteristics.length; i++) {          let item = res.characteristics[i]          if (item.properties.read) {            // 读取蓝牙设备的数据            wx.readBLECharacteristicValue({              deviceId,              serviceId,              characteristicId: item.uuid,            })          }          if (item.properties.write) {            this.setData({              canWrite: true            })            this._deviceId = deviceId            this._serviceId = serviceId            this._characteristicId = item.uuid            // 写数据到蓝牙设备            this.writeBLECharacteristicValue()          }          if (item.properties.notify || item.properties.indicate) {            // 启用蓝牙设备的通知功能,之后才能监听到蓝牙数据的变化            wx.notifyBLECharacteristicValueChange({              deviceId,              serviceId,              characteristicId: item.uuid,              state: true,            })          }        }      },      fail(res) {        console.error('getBLEDeviceCharacteristics', res)      }    })    // 监听蓝牙设备的数据变化    wx.onBLECharacteristicValueChange((characteristic) => {      const idx = inArray(this.data.chs, 'uuid', characteristic.characteristicId)      const data = {}      if (idx === -1) {        data[`chs[${this.data.chs.length}]`] = {          uuid: characteristic.characteristicId,          value: ab2hex(characteristic.value)        }      } else {        data[`chs[${idx}]`] = {          uuid: characteristic.characteristicId,          value: ab2hex(characteristic.value)        }      }      this.setData(data)    })  }  // 写数据到蓝牙设备  writeBLECharacteristicValue() {    // 向蓝牙设备发送一个0x00的16进制数据    let buffer = new ArrayBuffer(1)    let dataView = new DataView(buffer)    dataView.setUint8(0, Math.random() * 255 | 0)    wx.writeBLECharacteristicValue({      deviceId: this._deviceId,      serviceId: this._serviceId,      characteristicId: this._characteristicId,      value: buffer,    })  }

断开蓝牙设备的连接

closeBLEConnection:断开与蓝牙设备的连接

closeBLEConnection() {    // 断开蓝牙设备的连接    wx.closeBLEConnection({      deviceId: this.data.deviceId    })    this.setData({      connected: false,      chs: [],      canWrite: false,    })  }

关闭蓝牙模块

closeBluetoothAdapter: 当蓝牙使用完成后,关闭蓝牙模块,释放系统资源。

// 关闭蓝牙模块wx.closeBluetoothAdapter({  success(res) {    console.log(res)  }})

转载于:https://www.cnblogs.com/yangrenmu/p/10809158.html

你可能感兴趣的文章
Annotation(四)——Struts2注解开发
查看>>
多态、抽象、接口、final
查看>>
【mongodb】之安装
查看>>
【模板】图形面积计算
查看>>
python django + js 使用ajax进行文件上传并获取上传进度案例
查看>>
会话控制
查看>>
當使用者按下GridView的刪除按鈕時,如何讓使用者確認刪除
查看>>
OpenCV中的随机数生成
查看>>
ans menu list
查看>>
创建型模式 抽象工厂
查看>>
JSON字符串和Javascript对象字面量
查看>>
关于现在,关于未来
查看>>
day9 重写父类的方法
查看>>
你应该知道的四种优秀架构
查看>>
php 支持8种基本的数据类型
查看>>
保卫"木叶",从火影剧情看网站攻防的演变
查看>>
大数据学习——linux常用命令(三)
查看>>
linux下memcache的运用,和php结合小案例。
查看>>
COGS 1298. 通讯问题
查看>>
ip地址
查看>>