登录/注册

首页 小程序资讯 微信小程序怎么实现蓝牙连接?(代码示例)

微信小程序怎么实现蓝牙连接?(代码示例)

封刀令

2018/11/14 21:12

497

蓝牙,示例,连接,代码,程序

微信小程序如何实现蓝牙连接?本篇文章给大家带来的内容是介绍微信小程序实现蓝牙连接的方法(步骤)。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

最近的项目需要使用小程序的蓝牙功能与硬件设备进行连接相互传送数据指令,联调过程中发现一些问题,于是想着记录下来,方便以后查看!

1、初始化蓝牙设备

一般使用蓝牙功能肯定是想连接某一个蓝牙设备,所以需要知道这个蓝牙设备的名称,一般来说都是扫描二维码连接,那么当你扫描这个设备二维码的时候,就需要去初始化你手机上的蓝牙模块了

/**
* 初始化蓝牙设备
*/
  initBlue:function(){
    var that = this;
    wx.openBluetoothAdapter({//调用微信小程序api 打开蓝牙适配器接口
      success: function (res) {
        // console.log(res)
        wx.showToast({
          title: '初始化成功',
          icon: 'success',
          duration: 800
        })
        that.findBlue();//2.0
      },
      fail: function (res) {//如果手机上的蓝牙没有打开,可以提醒用户
        wx.showToast({
          title: '请开启蓝牙',
          icon: 'fails',
          duration: 1000
        })
      }
    })
  },

2、搜索蓝牙设备

手机蓝牙初始化成功之后,就会去搜索周边的蓝牙设备

/**
*开始搜索蓝牙设备
*/
findBlue(){
    var that = this
    wx.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
      interval: 0,
      success: function (res) {
       
        wx.showLoading({
          title: '正在搜索设备',
        })
        that.getBlue()//3.0
      }
    })
  },

3、获取蓝牙设备信息

搜索蓝牙设备之后,需要获取搜索到的蓝牙设备信息,微信小程序提供了两个方法可以获取搜索到的蓝牙设备信息,分别是:

wx.onBluetoothDeviceFound:监听寻找到新设备的事件 ,表示只要找到一个新的蓝牙设备就会调用一次该方法。

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

看两个方法的介绍我们知道他们的区别,但是不了解他们的区别会造成什么样的问题?

第一次我使用的是wx.onBluetoothDeviceFound方法进行联调,发现一切正常,由于调试的时候就只有一台设备,发现第二次重新扫码这个蓝牙设备的时候,找不到这个设备了,因为对这个方法来说,这不是一个新的设备,以前连接上过;或者当你因为某些原因蓝牙传送数据指令的时候出错了需要重新连接,再次连接的时候也找不到当前设备,还是同样的原因,因为当前设备对这个方法来说不是一个新设备

所以后来我就用了wx.getBluetoothDevices方法

/**
  * 获取搜索到的设备信息
 */
  getBlue(){
    var that = this
    wx.getBluetoothDevices({
      success: function(res) {
        wx.hideLoading();
        for (var i = 0; i < res.devices.length; i++){
           /*that.data.inputValue:表示的是需要连接的蓝牙设备ID,简单点来说就是我想要连接这个蓝牙设备,所以我去遍历我搜索到的蓝牙设备中是否有这个ID*/
          if (res.devices[i].name == that.data.inputValue || res.devices[i].localName == that.data.inputValue){
            that.setData({
              deviceId: res.devices[i].deviceId,
              consoleLog: "设备:" + res.devices[i].deviceId,
            })
            that.connetBlue(res.devices[i].deviceId);//4.0
            return;
          }
        }
      },
      fail: function(){
        console.log("搜索蓝牙设备失败")
      }
    })
  },

4、连接蓝牙设备

通过上一个步骤找到这个蓝牙之后,通过蓝牙设备的id进行蓝牙连接

/**
  * 获取到设备之后连接蓝牙设备
 */
  connetBlue(deviceId){                    
    var that = this;
    wx.createBLEConnection({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: deviceId,//设备id
      success: function (res) {
        wx.showToast({
          title: '连接成功',
          icon: 'fails',
          duration: 800
        })
        console.log("连接蓝牙成功!")
        wx.stopBluetoothDevicesDiscovery({
          success: function (res) {
            console.log('连接蓝牙成功之后关闭蓝牙搜索');
          }
        })
        that.getServiceId()//5.0
      }
    })
  },

5、获取服务uuid

连接上需要的蓝牙设备之后,获取这个蓝牙设备的服务uuid

getServiceId(){
    var that = this
    wx.getBLEDeviceServices({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: that.data.deviceId,
      success: function (res) {
        var model = res.services[0]
        that.setData({
          services: model.uuid
        })
        that.getCharacteId()//6.0
      }
    })
  },

6、通过id查看蓝牙设备的特征值

如果一个蓝牙设备需要进行数据的写入以及数据传输,就必须具有某些特征值,所以通过上面步骤获取的id可以查看当前蓝牙设备的特征值

getCharacteId(){
    var that = this 
    wx.getBLEDeviceCharacteristics({
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
      deviceId: that.data.deviceId,
      // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
      serviceId: that.data.services,
      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({
              notifyId: model.uuid//监听的值
            })
            that.startNotice(model.uuid)//7.0
          }
          if (model.properties.write == true){
            that.setData({
              writeId: model.uuid//用来写入的值
            })
          }
        }
      }
    })
  },

7、从后台服务器获取的指令

startNotice(uuid){
    var that = this;
    wx.notifyBLECharacteristicValueChange({
      state: true, // 启用 notify 功能
      // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 
      deviceId: that.data.deviceId,
      // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
      serviceId: that.data.services,
      // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
      characteristicId: uuid,  //第一步 开启监听 notityid  第二步发送指令 write
      success: function (res) {
      
          // 设备返回的方法
          wx.onBLECharacteristicValueChange(function (res) {
              // 此时可以拿到蓝牙设备返回来的数据是一个ArrayBuffer类型数据,所以需要通过一个方法转换成字符串
              var nonceId = that.ab2hex(res.value) 
      //拿到这个值后,肯定要去后台请求服务(当前步骤根据当前需求自己书写),获取下一步操作指令写入到蓝牙设备上去
      
     wx.request({
                    method: "POST",
         
                    data: {
                      xx:nonceId
                    },
                    url: url,
                    success: (res) => {
                      //res.data.data.ciphertext:我这边服务返回来的是16进制的字符串,蓝牙设备是接收不到当前格式的数据的,需要转换成ArrayBuffer
                      that.sendMy(that.string2buffer(res.data.data.ciphertext))//8.0
                      // 服务器返回一个命令  我们要把这个命令写入蓝牙设备
                    }
                   })
  }
    })
  },

8、将从后台服务获取的指令写入到蓝牙设备当中

sendMy(buffer){
    var that = this 
    wx.writeBLECharacteristicValue({
      // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
      deviceId: that.data.deviceId,
      // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
      serviceId: that.data.services,
      // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
      characteristicId: that.data.writeId,//第二步写入的特征值
      // 这里的value是ArrayBuffer类型
      value: buffer,
      success: function (res) {
        console.log("写入成功")
      },
      fail: function () {
        console.log('写入失败')
      },
      complete:function(){
        console.log("调用结束");
      }
    })
  },

注:下面是需要使用到的两个格式相互转换的方法

/**
* 将字符串转换成ArrayBufer
*/
  string2buffer(str) {
    let val = ""
    if(!str) return;
    let length = str.length;
    let index = 0;
    let array = []
    while(index < length){
      array.push(str.substring(index,index+2));
      index = index + 2;
    }
    val = array.join(",");
    // 将16进制转化为ArrayBuffer
    return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
      return parseInt(h, 16)
    })).buffer
  },
 
  /**
   * 将ArrayBuffer转换成字符串
   */
  ab2hex(buffer) {
    var hexArr = Array.prototype.map.call(
      new Uint8Array(buffer),
      function (bit) {
        return ('00' + bit.toString(16)).slice(-2)
      }
    )
    return hexArr.join('');
  },

注:以上是蓝牙连接的全部流程,但是我们在实际使用中肯定不会这么顺畅,而且蓝牙发送指令的设备都会有一个特性,就是当前蓝牙设备有人连接上之后,其他人是搜索不到这个蓝牙设备的,所以你需要考虑在某些个特殊情况,代码里需要主动断开蓝牙连接把设备释放出来供其他用户使用,还有就是将指令写入蓝牙设备的时候很容易出问题,所以要写个回调去多次写入,保证成功性!

总结:以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。。

相关视频教程推荐:

微信小程序开发文档

微信小程序全方位深度解析视频教程

微信小程序开发CMS系统视频教程

以上就是微信小程序怎么实现蓝牙连接?(代码示例)的详细内容,更多请关注php中文网其它相关文章!

小程序资讯推荐

百度推“小度扫描”小程序 一秒可转文几万字

12月06日 16:55站长之家(ChinaZ.com) 12月5日 消息:不少人在工作和学习中都需要用到图片文字识别工具,日前百度官方宣布新推出了微信小程序“小度扫描”,用手机就可以把图片中的文字复制出来,据称扫图一秒钟就可………

微信小程序到底有哪些优点?以至于让阿里百度头条美团都来凑热闹

12月06日 16:55可以调用比H5更多的手机系统功能来进行开发,例如GPS定位、录音、拍视频、重力感应等,能开发更丰富的使用场景。 微信小程序的运营初期,很多用户对于微信小程序都会抱有一定的好奇心理,这段时间内企业借助小程序可………

为什么互联网营销部门要把握住现在的小程序?

12月06日 16:55现在互联网营销企业越来越多,企业对于营销的需求也却来越高,因为它直接会影响到我们产品的销售,传统企业也需要互联网转型,在整个过程中我们需要紧跟时代的脚脖,不断的打造一些全新的产品,了解一些新的互联网营销方式,………

华为快应用推出新工具:微信小程序可直接转换成快应用

12月06日 16:55一方面,已经形成一定用户规模的APP在应用商店上架“即点即用”的快应用欲望不大,而另一方面,在每月的流量扶持计划中,中小开发者也很难露脸,以10月份入选快应用流量扶持计划的产品为例,淘票票、智行火车票、………

图片怎么转成文字?手机里这2个免费功能太强大了,秒变扫描仪

12月06日 16:55利用“扫一扫”,小编随手添加了张杂志图片,很快就能提取出图片中的文字,而且准确度高! 微信小程序可是个好东西,为我们拓展了许多非常好用的功能,提取图片中的文字自然也不例外。 迅捷文字识别还能进行票证………

小程序、O2O系统、商家、,三者怎样有效的结合起来?

12月06日 16:55究其原因是他们能够拥有外卖送餐人员,可以提供快速有效的服务,可以帮商家和用户节省时间和部分金钱,但是微信显然不会做这种事情,如果需要做O2O服务,那么如何进行配送或许是另一个难点,针对这一块,或许可以有人尝试………

佛山科睿(金蝶精斗云)联合仁和会计《财务创造利润》公益课程

12月06日 16:55因此,为了助力中小企业做好税务筹划工作,有效防范财税风险,并真正实现让财务创造利润,仁和会计教育受邀佛山科睿(金蝶)服务中心,于11月24日为大家带来了一场别开生面的公益讲座——《中小企业财税漏洞及………

v血拼V店主的“网变之路”

12月06日 16:55那时是东莞这个“世界工厂”的黄金年代,制造业蒸蒸日上,工人成千上万,她的成衣店1年的时间就开了3家。 然而随着移动互联网时代的到来,她发现即使自己多努力,也无法避免实体店经营的下滑,她的店从5家缩减为………

“百年老店”们怎样才能满足年轻人对于吃的花式需求?

12月06日 16:55不能站在用户角度为用户节省时间和精力的不会被优先选择(记住自己是和全城店家被用户做对比,移动互联网时代是用户市场) 用户的每个细分需求都可以成为一个构建场景,只有把用户当一个完整的人对待………

微信小程序如何渲染html内容(示例讲解)

12月06日 16:54本篇文章给大家带来的内容是关于微信小程序如何渲染html内容(示例讲解),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。最近又做了一个新的小程序关于物流订单查询遇到了一个小问题:数据中……

砍价微信小程序,如何让客户把自己的产品推出去

12月05日 17:19其实更重要是商家的一些经营思维要转换,现在的商家即使有了线上的平台但是如果不搞活动进行营销裂变,是没有流量会进来的,而最简单有效的方法就是通过一些砍价活动,拼团活动来把人吸引进来,然后通过这个产品的一些优惠力………

远丰电商丨为什么品牌商纷纷搭建商城小程序?

12月05日 17:19商城小程序与微信公众号是一种访问的关系,用户在阅读微信公众号文章时可以直接跳转到小程序上。 从各方面来看借助商城小程序,品牌方可以在微信社交及大数据的基础上,完善营销方式,有针对性的进行营销活动,提………

微信小程序怎么制作,个人5分钟制作微信小程序开发教程

12月05日 17:19随着小程序开发市场的完善,现在利用微冰小程序制作平台,不需要编程开发技术,个人也能可视化制作小程序了,最快5分钟制作微信小程序,轻松应对各行各业的应用场景。这些模板都是根据市场主流小程序页面设计而成的,用户可………

喜推打造“双核智能小程序+电销机器人”神器,引爆B端市场

12月05日 17:19例如,小方如果使用了喜推系统,其跟进客户的过程将自动保留,例如沟通的话术、在什么时候对客户进行了哪些行为。通过这些留存的记录和数据,就可以复现小方跟进客户的整个流程,企业只需要将这些话术或者跟进客户的方………

小程序流量变现,有哪些新玩法?(1)

12月05日 17:19(2)兴趣以及爱好:这应该是很多社群都喜欢而且效果最好的一种方式了,因为有同样喜好的用户,看到有共鸣的东西,都会很乐意去分享。 如果你能策划一次行之有效的活动,然后再去和公众号的推文,还有朋友圈以及………

QuestMobile移动互联网全景流量洞察:移动全用户时代正式来临,凭什么突围?

12月05日 17:19此前的行业分析,往往盯着巨头应用、用户和时长,忘记了一个重要的问题:移动互联网的本质并非社交、搜索、电商、资讯等等,而是移动+服务。 移动互联网全景流量,指某应用及服务通过APP、小程序、快应用、W………

餐饮行业入驻小程序生态圈能带来红利吗?

12月05日 17:18微信小程序的小游戏让很多人爱上了小程序,这也为餐饮行业提供了很大的流量机会,外卖平台也搭建了属于自己的小程序,用户可以随时用小程序点餐,逐渐培养的用户习惯及简单的开发模式,已经成为了小程序的竞争力,而微………

从苏宁易购来看百度小程序和微信小程序的区别

12月05日 17:18两者都是首页下拉出现最近使用小程序,但百度app下拉后是进入全屏页面,而微信这边则是从之前的一行,变为了两行,分别有最近使用与我的小程序,从体验上来说微信也许更好,不过百度这样来操作也许是为了给更多的入………

附近的小程序功能有什么

12月05日 17:18在门店小程序中,其今天还推出了“卡券投放”能力,线下商户获取这一能力后,用户可以在“门店小程序”中领域商家的会员卡、代金券或者买单券。 第四种则是新推出的“发现”页面,利用LBS功能,用户可以发现附………

谁快谁得利 实体店如何放到小程序上运营?

12月05日 17:18商家可以通过离线扫描获得微信的在线流量,实体店行业将小程序二维码放在实体店中,以便消费者可以更好地使用它,你可以知道商店的细节,我相信应该有很多消费者愿意尝试。 现在小程序的发展朝超过了我们的预期,面………

Copyright © 2016-2018 中国小程序 版权所有   网站地图

商务合作:897834588@qq.com