小程序 蓝牙连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小程序 蓝牙连接相关的知识,希望对你有一定的参考价值。

参考技术A //初始化蓝牙
initBlue()
var that = this;
wx.openBluetoothAdapter( //调用微信小程序api 打开蓝牙适配器接口
success: function (res)
console.log('1.初始化蓝牙成功')

,
//监听手机蓝牙的开关
monitorTheBlue:function()
var that =this;
wx.onBluetoothAdapterStateChange(function(res)

)
,

//开始获取附近的蓝牙设备
//. 获取到附近的蓝牙数组 通过蓝牙特定的名称获取自己想要连接的蓝牙设备
//. 获取附近蓝牙设备的数组
findBlue()
console.log(new Date())
var that = this
wx.startBluetoothDevicesDiscovery(
allowDuplicatesKey: false,
interval: 0,
success: function (res)
console.log('2.正在搜索设备.............')
if (that.data.isFirestShow)
wx.showLoading(
title: '正在搜索设备'
)


,

//搜索获取附近的所有蓝牙设备 获取附近所有的蓝牙设备的相关信息 获取需要连接蓝牙设备的deviceID
//. 通过bluetoothDeviceName 和 localName 来确定制定蓝牙
//. 一般根据制定设备的名字去连接 设备的名字 是出产厂家设定
getBlue()
var that = this
wx.getBluetoothDevices(
success: function (res)
console.log('3.找到设备列表........')
wx.hideLoading()
// return false
var index = 10
for (var i = 0; i < res.devices.length; i++)
if (res.devices[i].name && res.devices[i].localName)
var arr = res.devices[i].name.split("-")
var secArr = res.devices[i].localName.split("-")
if (arr[0] == that.data.bluetoothDeviceName || secArr[0] == that.data.bluetoothDeviceName)

,
//连接蓝牙设备
//通过deviceId 连接蓝牙
/**

,
//6 连接上需要的蓝牙设备之后,获取这个蓝牙设备的服务uuid
//获取设备的uuid
getServiceId()
var that = this
wx.getBLEDeviceServices(
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: that.data.deviceId,
success: function (res)
var model = res.services[1]
that.setData(
servicesUUID: model.uuid
)
console.log('7.获取设备 uuid 成功....')
that.getCharacteId() //6.0

)
,
//7 如果一个蓝牙设备需要进行数据的写入以及数据传输,就必须具有某些特征值,所以通过上面步骤获取的id可以查看当前蓝牙设备的特征值
//notify write read 当只有 notify为true的时候才能 接收蓝牙设备传来的数据,
//write 为true 才能传入数据
//read 为true 才能读取设备数据

getCharacteId()
var that = this
wx.getBLEDeviceCharacteristics(
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: that.data.deviceId,
// 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
serviceId: that.data.servicesUUID,
success: function (res)
for (var i = 0; i < res.characteristics.length; i++) //2个值
var model = res.characteristics[i]
if (model.properties.notify == true)
that.setData(
characteristicId: model.uuid //监听的值
)
console.log('8.model.properties.notify == true')
that.startNotice(model.uuid) //7.0

// if (model.properties.read == true)
// that.readData(model.uuid)
//
// if (model.properties.write == true)
// that.setData(
// writeId: model.uuid//用来写入的值
// )
//


)
,
fordateTime1()
let now = new Date(),hour = now.getHours()
console.log(hour)
let str = ''
if(hour < 7)str = '早餐前'
else if ((7< hour) && (hour<= 9))str = '早餐后'
else if ((9< hour) && (hour<= 11))str = '午餐前'
else if ((11< hour) && (hour<= 13))str = '午餐后'
else if ((13< hour) && (hour<= 17))str = '晚餐前'
else if ((17< hour) && (hour<= 19))str = '晚餐后'
else if ((19< hour) && (hour<= 24))str = '睡觉前'
return str
,
//8 如果一个蓝牙设备需要进行数据的写入以及数据传输,就必须具有某些特征值,所以通过上面步骤获取的id可以查看当前蓝牙设备的特征值
//开启设备数据监听 监听蓝牙设备返回来的数据
startNotice(uuid)
var that = this;
wx.notifyBLECharacteristicValueChanged(
state: true, // 启用 notify 功能
deviceId: that.data.deviceId,
serviceId: that.data.servicesUUID,
characteristicId: uuid, //第一步 开启监听 notityid 第二步发送指令 write
success: function (res)
// that.closeConnect(that.data.deviceId)
// 设备返回的方法
let tip = 0
wx.onBLECharacteristicValueChange(res1 =>

,

/**

//监听蓝牙设备是否会异常断开
getTheBlueDisConnectWithAccident()

,
// 断开设备连接
closeConnect: function(v)
var that = this
if (v)
wx.closeBLEConnection(
deviceId: v,
success: function(res)
console.log("蓝牙断开连接")
that.closeBluetoothAdapter()
,
fail(res)

)
else
that.closeBluetoothAdapter()

,
// 关闭蓝牙模块
closeBluetoothAdapter:function ()

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

)
,

微信小程序使用蓝牙通信协议连接硬件整理总结(蓝牙连接获取设备UUID开水器notify及关闭蓝牙)

大家好,我是雄雄。


文章目录

前言

书接前文,上篇文章我们主要介绍了初始化蓝牙、以及搜索附近蓝牙设备以及展示搜索到的蓝牙设备,但是我们在真实的业务场景中,肯定是需要将搜到的设备“用”起来的,所以本文我们就介绍一下如何使用小程序连接蓝牙设备以及后续的操作。

进行蓝牙连接

连接蓝牙设备主要使用wx.createBLEConnection方法,若小程序在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需再次进行搜索操作。
实现代码如下:

//通过蓝牙设备的id进行蓝牙连接
      const createBLEConnection = () => 
        wx.createBLEConnection(
          deviceId: ConnectedDeviceRelated.deviceId,
          success: function (res) 
            wx.stopBluetoothDevicesDiscovery(
              success: function (res) 
                console.log('连接成功,关闭蓝牙搜索')
                ConnectedDeviceRelated.isSearchBluetooth_detectionBoard = false
              
            )
            getBLEDeviceServices()
          ,
          fail: function (res) 
            //连接失败后重连
            if (that.data.isconnect == 'false') 
              createBLEConnection()
            
          
        )
      

其中,deviceId就是我们搜索到的蓝牙设备的id

注意:

  1. 请尽量成对的调用wx.createBLEConnectionwx.closeBLEConnection接口,安卓如果重复调用wx.createBLEConnection创建连接,有可能导致系统对同一设备持有多个连接实例,会导致调用closeBLEConnection的时候并不能真正的断开与设备的连接。
  2. 蓝牙连接随时有可能断开,可以调用wx.onBLEConnectionStateChange来监听设备断开,当设备断开时根据连接需求进行重连操作。

到这里蓝牙设备就连接上了**(因为安卓和iOS的区别,iOS连接上蓝牙后,可以在通知栏看到蓝牙图标显示或者在控制中心看到蓝牙设备连接的名称来判断是否已经连接;安卓只能通过小程序提供的API回调参数来判断)**,如果想要获取蓝牙设备的数据或向蓝牙设备写入指令,就需要下面的步骤:

获取蓝牙设备的UUID

我们需要使用wx.getBLEDeviceServices来获取蓝牙设备的UUID

获取蓝牙低功耗设备所有服务 (service),代码如下:

 //获取蓝牙设备的uuid
      const getBLEDeviceServices = () => 
        wx.getBLEDeviceServices(
          deviceId: ConnectedDeviceRelated.deviceId,
          success: function (res) 
            for (var i = 0; i < res.services.length; i++) 
              if (res.services[i].uuid.includes('xxxxx')) 
                ios_uuid.push(
                  'notify': res.services[i].uuid
                )
               else if (res.services[i].uuid.includes('xxxx')) 
                ios_uuid.push(
                  'write': res.services[i].uuid
                )
              
            
            getBLEDeviceCharacteristics()
          
        )
      

其中deviceId为搜索蓝牙设备时获取的设备id;这里按照蓝牙设备的不同,会获取到一个或多个服务id

这个时候只需获取最关键的两个服务idnotifywrite,怎么判断呢?一般对接这些设备都会给你协议文档,里面会提及用到的服务id,以及他们的作用,那如果没有文档或者文档里面没有说呢?那你就要一个一个去试了…

获取UUID中的特征值

我们需要通过wx.getCLEDeviceCharacteristics方法来获取UUID的特征值。
代码如下:

//获取蓝牙设备uuid的notify特征值
      const getBLEDeviceCharacteristics = () => 
        var notify = null;
        for (var i = 0; i < ios_uuid.length; i++) 
          if (ios_uuid[i].hasOwnProperty('notify')) 
            notify = ios_uuid[i].notify
          
        
        wx.getBLEDeviceCharacteristics(
          deviceId: ConnectedDeviceRelated.deviceId,
          serviceId: notify,
          success: function (res) 
            ios_uuidEigenvalues.push(res.characteristics[0].uuid)
            setTimeout(() => (
              startNotice(notify)
            ), 800)
          ,
          fail: function (res) 
            console.log('获取uuid的notify特征值失败', res)
          
        )
      

其中deviceId为前面搜索到的蓝牙设备的idserviceId为获取的支持开启notifyuuid

上图为获取服务中特征值成功的回调参数,其中在properties属性中就可以判断获取的uuid的作用,图示的是 只支持开启notifyuuid。部分蓝牙设备只会包含一个uuid,但会有同时开启notifywrite的能力。

开启notify

开启notify需要调用wx.notifyBLECharacteristicValueChange方法,启用蓝牙低功耗设备特征值变化时的 notify 功能,订阅特征。注意:必须设备的特征支持 notify 或者 indicate 才可以成功调用。
代码如下:

const startNotice = notify => 
        wx.notifyBLECharacteristicValueChange(
          state: true,
          deviceId: ConnectedDeviceRelated.deviceId,
          serviceId: notify,
          characteristicId: ios_uuidEigenvalues[0],
          success: function (res) 
            console.log("开启notify成功")
            //获取蓝牙设备uuid的write特征值
            getBLEDeviceCharacteristics_write()
          ,
          fail: function (res) 
            console.log("notity失败", res)
          
        )
      

其中,state为是否启用notifydeviceId为步骤3中获取的设备idserviceId为获取的uuidcharacteristicIduuid特征值.

还是因为设备的不同,有的设备不需要主机(你的设备)主动触发从机(蓝牙设备)的功能,所以直接在开启notify的方法中 监听蓝牙设备返回的数据就可以了
代码如下:

	wx.onBLECharacteristicValueChange(function (characteristic) 
              isOk = true
              if (that.ab2hex(characteristic.value).substring(0, 4) == 'xxxxx') 
                that.judgingElectricity(that.ab2hex(characteristic.value))
               else if (that.ab2hex(characteristic.value) == ConnectedDeviceRelated.turnSuccess_notify) 
                sendMy(ConnectedDeviceRelated.approve)
               else if (that.ab2hex(characteristic.value) == 'xxxx') 
                console.log('认证成功')
                ConnectedDeviceRelated.disconnect = true
                app.globalData.isturn = 'true'
                app.globalData.isconnect = 'true'
                that.setData(
                  isturn: 'true',
                  isconnect: 'true',
                  BluetoothNotConnected_icon: that.data.BluetoothIsConnected_icon,
                  electricityNotConnected_icon: that.data.electricityIsConnected_icon
                )
                that.isDeviceUnique(0)
              
            )

注意:
这里蓝牙设备返回的数据格式是arraybuffer需要再转一下字符串,代码如下:

// arraybuffer转字符串
  ab2hex: function (buffer) 
    var hexArr = Array.prototype.map.call(
      new Uint8Array(buffer),
      function (bit) 
        return ('00' + bit.toString(16)).slice(-2)
      
    )
    return hexArr.join('');
  ,

如果你对接的蓝牙设备需要被动的触发功能(比如主机发送对应的功能指令),就要通过步骤中获取支持writeuuid,通过上面的方法获取UUID特征值,然后向蓝牙设备写入``,写入成功,触发了成功的回调后,接着调用wx.onBLECharacteristicValueChange监听蓝牙设备返回的数据:
代码如下:

 wx.writeBLECharacteristicValue(
          deviceId: ConnectedDeviceRelated.deviceId,
          serviceId: ConnectedDeviceRelated.services_write,
          characteristicId: ConnectedDeviceRelated.write,
          value: arrayBuffer,
          success: function (res) 
            wx.showToast(
              title: '正在连接中...',
              icon: 'none',
              duration: 2000
            )
            //检测板子自己关闭 再打开后自动连接 如果写入后没反应,就再写入
            setTimeout(function (params) 
              if (isOk == false) 
                sendMy('notify')
              
            , 1500)
            //监听设备返回的值
            wx.onBLECharacteristicValueChange(function (characteristic) 
              isOk = true
              if (that.ab2hex(characteristic.value).substring(0, 4) == 'fdf4') 
                that.judgingElectricity(that.ab2hex(characteristic.value))
               else if (that.ab2hex(characteristic.value) == ConnectedDeviceRelated.turnSuccess_notify) 
                sendMy(ConnectedDeviceRelated.approve)
               else if (that.ab2hex(characteristic.value) == 'xxxx') 
                console.log('认证成功')
                ConnectedDeviceRelated.disconnect = true
                app.globalData.isturn = 'true'
                app.globalData.isconnect = 'true'
                that.setData(
                  isturn: 'true',
                  isconnect: 'true',
                  BluetoothNotConnected_icon: that.data.BluetoothIsConnected_icon,
                  electricityNotConnected_icon: that.data.electricityIsConnected_icon
                )
                that.isDeviceUnique(0)
              
            )
            //监听连接断开
            that.disconnect()
          ,
          fail: function (res) 
            console.log('写入失败', res)
          ,
        )

注意:
这里的value需要的是arraybuffer格式的数据指令,所以需要把字符转成arraybuffer

关闭蓝牙

断开与蓝牙低功耗设备的连接,代码如下:

wx.showModal(
            title: '提示',
            content: '要关闭蓝牙吗?',
            success: function (res) 
              if (res.confirm) 
                if (app.globalData.bluetooth == 'W8') 
                  deviceId = ConnectedDeviceRelated.deviceId_sphygmomanometer
                 else if (app.globalData.bluetooth == 'Yuwell BP-YE8900A') 
                  deviceId = ConnectedDeviceRelated.deviceId_YYSphygmomanometer
                
                wx.closeBLEConnection(
                  deviceId: deviceId,
                  success(res) 
                    console.log("关闭蓝牙成功")
                    ConnectedDeviceRelated.disconnect = false
                    app.globalData.isconnect_bloodPressure = false
                    that.setData(
                      isconnect_bloodPressure: false,
                      SphygmomanometerBluetoothNotConnected_icon: config.ImageAddr_url + 'applets/images/jiance/YRSphygmomanometerBluetoothNotConnected.png',
                    )
                  
                )
              
            
          )

以上是关于小程序 蓝牙连接的主要内容,如果未能解决你的问题,请参考以下文章

断网了,如何让微信小程序,可以用蓝牙

解决 安卓小程序蓝牙 重连失败的问题

vivos12pro微信小程序蓝牙连不上

微信小程序--蓝牙连接开发总结

微信小程序蓝牙教程--完整版亲测

熊晨沣蓝牙实战--小程序蓝牙连接2.0