美文网首页
小程序ble整理

小程序ble整理

作者: Qianshui321 | 来源:发表于2019-02-19 17:39 被阅读0次

    官方文档地址:
    https://developers.weixin.qq.com/miniprogram/dev/api/wx.writeBLECharacteristicValue.html

    代码直接上

    app.js 中的部分参数
    data:{
        DeviceCode:"", // 设备编码
        isconnect:false,//当前手机是否连接设备
        isopenble: false,// 当前手机蓝牙是否打开
        bleMac:[],//扫描到的设备   (为了方便处理ios)
        connectMac:"",//当前手机连接的设备.
       connectindex :"0"// ble连接次数
      }
    
    以下是ble部分代码(utils.js中)
    var isandroid = "android"; //默认当前手机是安卓
    wx.getSystemInfo({
      success: function (res) {
        // 获取当前手机系统类型
        isandroid = res.platform;
        
      }
    });
    
    var ble = {  
      getsystem: isandroid, //当前手机类型
      data:function(){
        //这里保存 ble设备的读写uuid  这里为了考虑ios和安卓下 同一个设备的uuid不一样(区分大小写的)
        var data = {};
        var _this = this;
        if (_this.getsystem == "android"){
          data = {
            suuid: "0000FFF0-0000-1000-8000-00805F9B34FB",
            tuuid: "0000FFF2-0000-1000-8000-00805F9B34FB",
            zt_suuid: "0000FFF0-0000-1000-8000-00805F9B34FB",
            zt_tuuid: "0000FFF1-0000-1000-8000-00805F9B34FB"                
          }
        }else{
          data = {
            suuid: "0000FFF0-0000-1000-8000-00805F9B34FB",
            tuuid: "0000FFF2-0000-1000-8000-00805F9B34FB",
            zt_suuid: "0000FFF0-0000-1000-8000-00805F9B34FB",
            zt_tuuid: "0000FFF1-0000-1000-8000-00805F9B34FB"               
          }
        }
        return data;
      },
      /**
       *初始化蓝牙
       **/   
      init:function(){
        var _this = this;
        if (wx.openBluetoothAdapter) {
          // 打开蓝牙
          wx.openBluetoothAdapter({
            success:function(res){
              console.log("打开蓝牙",JSON.stringify(res));
              //如果蓝牙打开的话,开始搜索
              _this.search();
              getApp().data.isopenble = true;
            },
            fail:function(err){
              console.log("打开蓝牙失败",err);
              getApp().data.isopenble = false;
            }
          })
        } else {
          // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
          wx.showModal({
            title: '提示',
            content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
          })
        }
      },
      search:function(){
        var _this = this;  
       // 搜索设备
        wx.startBluetoothDevicesDiscovery({
          // services: ['FEE7'], 
          success: function (res) {
            console.log("搜索蓝牙",res)
          
            setInterval(function(){
              //每5秒获取一次搜索到的ble设备
              _this.getble();
            },5000);
          },
          fail: function (err) {
            console.log("搜索蓝牙失败", err);
          }
        })
      },
      stopsearch:function(){
        // 停止搜索 
        wx.stopBluetoothDevicesDiscovery({
          success: function (res) {
            console.log(res)
          }
        })
      },
      getble:function(){    
        var _this = this;    
        // 获取搜索到的ble设备
        wx.getBluetoothDevices({
          success: function (res) {
            console.log("搜索到的蓝牙", getApp().data.bleMac)
                  
              if(res.devices[0]){
    
                // 存储搜索到的设备  
                for (var i = 0; i < res.devices.length;i++){
                  var uuid = res.devices[i].deviceId;
    
                  if (getApp().data.bleMac.indexOf(uuid) == -1) {
                    getApp().data.bleMac.push(res.devices[i]);
                  }
                  
                }
              }
            
          },
          fail: function (err) {
            console.log("获取蓝牙失败", err);
          }
        })
      },
      connect:function(mac){
        var _this = this;
        // 开始连接设备 ,
        
        wx.createBLEConnection({
          // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 
          deviceId: mac,
          success: function (res) {
            console.log("连接设备",res)
            // 连接设备后停止搜索蓝牙
            
            if (res.errMsg == "createBLEConnection:ok"){
              if (isandroid != "ios"){
                  // 连接成功后,停止搜索(安卓)。ps:忘记了为什么IOS不用停止搜索
                _this.stopsearch();//停止搜索蓝牙
              }
            //根据连接的ble设备获取service
              _this.getservice(mac);          
            }        
          },
          fail: function (err) {
            console.log("连接设备失败", err);
            getApp().data.connectindex ++;
           // 这里为了考虑连接的稳定性。 重连了3次 (有部分安卓手机连接容易断开,所以...)
            if (getApp().data.connectindex <=3){
              _this.connect(mac);          
            }else{
              wx.showToast({
                title: "连接设备失败",
                icon: 'success',
                duration: 2000
              })
            }
            getApp().data.isconnect = false;
          }
        })
      },
      disconnect:function(mac){
      // 根据传入的mac断开连接。 
        wx.closeBLEConnection({
          deviceId: mac,
          success: function(res) {
            console.log("断开蓝牙", res)
            getApp().data.isconnect = false;
            wx.showToast({
              title: "设备已断开",
              icon: 'success',
              duration: 2000
            })
          },
          fail: function (err) {
            console.log("断开蓝牙", err);
            getApp().data.isconnect = false;
          }
        })
      },
      getservice:function(mac){
        var _this = this;
      // 获取ble设备的services
        wx.getBLEDeviceServices({
          // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 
          deviceId: mac,
          success: function (res) {
            console.log('服务ID:', res.services);
            if (res.services[0]){
              // 获取成功后  在获取ble设备特征
              _this.getchart(mac);
            }
          },
          fail: function (err) {
            console.log("获取服务ID失败", err);
          }
        })
      },
      getchart:function(mac){
        var _this = this;
      // 获取ble设备的特征
      // 考虑 读写uuid不一样,这里分别处理
        if (_this.data().suuid != _this.data().zt_suuid){
          // 不一样的话, 需要获取两次,参数分别是suuid和zt_suuid ( 请看data中的值)
          wx.getBLEDeviceCharacteristics({
            // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
            deviceId: mac,
            // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
            serviceId: _this.data().suuid,
            success: function (res) {
              console.log('特征ID:', res.characteristics)          
              // toast("连接成功")
              console.log(1111)
              
            },
            fail: function (err) {
              console.log("获取特征ID失败", err);
    
            }
          });
         
          setTimeout(function(){
            wx.getBLEDeviceCharacteristics({
              // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
              deviceId: mac,
              // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
              serviceId: _this.data().zt_suuid,
              success: function (res) {
                console.log('特征ID:', res.characteristics);
                if (res.characteristics[0]) {
                // 开始监听设备发出的数据
                  _this.notify(mac);
                }
              }, fail: function (err) {
                console.log("特征ID失败", err);
              }
            });
          },1500);
        }else{
        // 一样的话 获取一次就行了。
          wx.getBLEDeviceCharacteristics({
            // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
            deviceId: mac,
            // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
            serviceId: _this.data().suuid,
            success: function (res) {
              console.log('特征ID:', res.characteristics)
              if(res.characteristics[0]){
              // 开始监听设备发出的数据
                _this.notify(mac);
              }
            },
            fail: function (err) {
              console.log("特征ID失败", err);
            }
          })
        }
        
      },
      readchart:function(){
      //  根据指定的 serviceId和 characteristicId 获取设备发出的数据 (这个用的比较少)
        wx.readBLECharacteristicValue({
          // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  [**new**]
          deviceId: deviceId,
          // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
          serviceId: serviceId,
          // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
          characteristicId: characteristicId,
          success: function (res) {
            console.log('readBLECharacteristicValue:', res.errCode)
          }
        })
      },
      write:function(cmd){
        // 发送数据到设备
        var _this = this;      
            var mac = getApp().data.connectMac; // 连接的设备
            wx.writeBLECharacteristicValue({
              // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
              deviceId: mac,
              // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
              serviceId: _this.data().suuid,
              // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
              characteristicId: _this.data().tuuid,
              // 这里的value是ArrayBuffer类型
              value: _this.getbuffer(cmd),
              success: function (res) {
                console.log('发送指令', res.errMsg);
    
              },
              fail: function (err) {
                console.log("发送指令失败", err)
              }
            });       
      },
      notify:function(mac){
      //监听设备返回的数据
        var _this = this;
        wx.notifyBLECharacteristicValueChange({
          state: true, // 启用 notify 功能
          // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
          deviceId: mac,
          // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
          serviceId: _this.data().zt_suuid,
          // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取
          characteristicId: _this.data().zt_tuuid,
          success: function (res) {
            console.log('监听消息', res.errMsg)
            getApp().data.isconnect = true;
            wx.showToast({
              title: "连接成功",
              icon: 'success',
              duration: 2000
            });
           
            //整个流程 到这才算连接成功。 这里可以做页面跳转
            
            if (res.errMsg == "notifyBLECharacteristicValueChange:ok"){
              _this.chartval(); //接收到的值( ble设备发出的数据)
              _this.error();   //  ble设备连接异常监听               
            }
          },
          fail: function (err) {
            console.log("监听失败", err);
          }
        })
      },
      error:function(){
        wx.onBLEConnectionStateChange(function (res) {
          // 该方法回调中可以用于处理连接意外断开等异常情况
          console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
          getApp().data.isconnect = res.connected;
          if (!res.connected){
            wx.showToast({
              title: "设备已断开",
              icon: 'success',
              duration: 2000
            });    
          }
        })
      },
      chartval:function(){  
        // ble 设备返回的值
        var _this = this; 
        wx.onBLECharacteristicValueChange(function (res) {
    
          console.log("接收的值", _this.gethex(res.value));
         
        })
      },
      getbuffer:function(hex){
        // 将发送的命令转成 Arraybuffer 类型
        var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
          return parseInt(h, 16)
        }))
    
        var buffer = typedArray.buffer;
        return buffer;
      },
      gethex:function(buffer){
      // 处理ble设备的广播数据()
        var hexArr = Array.prototype.map.call(
          new Uint8Array(buffer),
          function (bit) {
            return ('00' + bit.toString(16)).slice(-2)
          }
        )
        return hexArr.join('')
      }
    }
    
    ps:
    使用方法
    1、ble.init(); //初始化
    2、ble.connect("设备的MAC");//连接设备
    3、ble.write("cmd"); // 发送数据
    
    

    相关文章

      网友评论

          本文标题:小程序ble整理

          本文链接:https://www.haomeiwen.com/subject/itsflqtx.html