zoukankan      html  css  js  c++  java
  • 小程序蓝牙通信模块

    // pages/configuration/configuration.js
    const app = getApp()
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        deviceArr: [],
        isConnected: false,
        chs: [],
        bytes:[]
      },
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        let type = ''
        if(options.type=='wifi'){
          type = {
            name: 'WIFI',
            isShow: true,
            isShowPswText: '显示密码',
            placeholder1: '请输入wifi名称',
            placeholder2: '请输入wifi密码'
          };
        }else{
          type = {
            name: '手机热点',
            isShow: true,
            isShowPswText: '显示密码',
            placeholder1: '请输入热点名称',
            placeholder2: '请输入热点密码'
          }
        }
        this.setData({
          type:type
        })
        //判断wifi是否连接
        wx.getConnectedWifi({
          success: function (res) {
            app.globalData.wifi = res.wifi
          },
          fail: function (res) {
            app.globalData.wifi = ''
          }
        })
      //蓝牙使用准备模块=======================================================================================================
        let that = this;
        if (app.getPlatform() == 'android' && app.versionCompare('6.5.7', app.getVersion())) {
          wx.showModal({
            title: '提示',
            content: '当前微信版本过低,请更新至最新版本',
            showCancel: false
          })
        } else if (app.getPlatform() == 'ios' && app.versionCompare('6.5.6', app.getVersion())) {
          wx.showModal({
            title: '提示',
            content: '当前微信版本过低,请更新至最新版本',
            showCancel: false
          })
        }
        wx.showLoading({
          title: '初始化蓝牙'
        })
        this.initBuleTooth()
      },
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
        
      },
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
        if (app.globalData.wifi){
          let wifi = app.globalData.wifi;
          this.setData({
            wifiName: wifi.SSID
          })
        }
      },
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
    
      },
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
    
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
    
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
    
      },
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
    
      },
      showPsw:function(){
        let isShow = 'type.isShow';
        let ShowPswText = 'type.isShowPswText';
        let isShowPswText = this.data.type.isShow ? '隐藏密码' : '显示密码';
        this.setData({
          [isShow]:!this.data.type.isShow
        });
        this.setData({
          [ShowPswText]:isShowPswText
        })
      },
      connect:function(){
        let that = this;
        let name = this.data.wifiName;
        let psw = this.data.psw;
        if(name && psw){
          wx.startWifi({
            success(res) {
              wx.connectWifi({
                SSID: name,
                password: psw,
                success(res) {
                  wx.showToast({
                    title: '连接成功!',
                    icon: 'none'
                  })
                  wx.showLoading({
                    title: '配网中',
                  })
                  //组织参数
                  let param1 = [-86, 1, 2, null, 0];
                  let param2 = that.stringToBytes(name)
                  let param3 = that.stringToBytes(psw)
                  let param4 = that.stringToBytes(app.globalData.wifi ? app.globalData.wifi.BSSID.replace(/:/g, ''):'');
                  let param5 = that.stringToBytes("5G");
                  let param6 = [1, 2, 1, 0, 1, 0]
                  let param = that.data.bytes.concat(param1).concat(param2.length).concat(param2).concat(param3.length).concat(param3).concat(param4.length).concat(param4).concat(param5.length).concat(param5).concat(param6);
                  param[3] = param.length
                  //蓝牙配网
                  that.wirteData(param)
                },
                fail: function (res) {
                  if (res.errCode == 12002) {
                    wx.showToast({
                      title: '密码错误',
                      icon: 'none'
                    })
                  } else {
                    wx.showToast({
                      title: '连接失败,错误码:' + res.errCode,
                      icon: 'none'
                    })
                  }
                }
              })
            },
            fail: function () {
              wx.showToast({
                title: 'wifi模块初始化失败!',
                icon: 'none'
              })
            }
          })
        }else{
          wx.showToast({
            title: '请输入账号密码!',
            icon:'none'
          })
        }
      },
      getVal:function(e){
        let key = e.currentTarget.dataset.value;
        this.setData({
          [key]:e.detail.value
        })
      },
      //工具类=====================================================================
      inArray: function (arr, key, val) {
        for (let i = 0; i < arr.length; i++) {
          if (arr[i][key] === val) {
            return i;
          }
        }
        return -1;
      },
      // ArrayBuffer转16进度字符串示例
      ab2hex: function (buffer) {
        var hexArr = Array.prototype.map.call(
          new Uint8Array(buffer),
          function (bit) {
            return ('00' + bit.toString(16)).slice(-2)
          }
        )
        return hexArr.join('');
      },
      stringToBytes:function(str) {
        let ch, st, re =[];
        for(var i = 0; i<str.length; i++ ) {
          ch = str.charCodeAt(i);
          st = [];
          do {
            st.push(ch & 0xFF);  // push byte to stack  
            ch = ch >> 8;          // shift value down by 1 byte  
          }
          while (ch);
          re = re.concat(st.reverse());
        } 
        return re;  
      },
      //蓝牙函数=====================================================================
      //初始化蓝牙模块
      initBuleTooth: function () {
        let that = this;
        if (wx.openBluetoothAdapter) {
          wx.openBluetoothAdapter({
            success(res) {
              that.getBuleTooth()
            },
            fail: function (res) {
              wx.hideLoading()
              wx.showToast({
                title: '蓝牙模块不可用!',
                icon: 'none'
              })
            }
          })
        } else {
          wx.hideLoading()
          // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示  
          wx.showModal({
            title: '提示',
            content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
          })
        }
      },
      //开始搜索附近蓝牙设备
      getBuleTooth: function (uuid) {
        let that = this;
        wx.startBluetoothDevicesDiscovery({
          services: (uuid && uuid.length == 0) ? '' : uuid,
          success: function (res) {
            that.foundBuleTooth()
          },
          fail: function (res) {
            wx.showToast({
              title: '搜索失败',
              icon: 'none'
            })
          }
        })
      },
      //发现设备
      foundBuleTooth: function () {
        let that = this;
        let found = false;
        let timeOut;
        wx.onBluetoothDeviceFound(function (res) {
          res.devices.forEach((device) => {
            let str1 = that.ab2hex(device.advertisData).substr(0,2);
            let str2 = that.ab2hex(device.advertisData).substr(2,4);
            let tag = parseInt(str2+str1,16)
            if (tag == app.globalData.dongleTag){
              found = true
              that.getConnect(device)
              that.stopBuleTooth()
            }
          })
        });
        timeOut = setTimeout(function () {
          if (!found) {
            wx.showToast({
              title: '未找到指定设备',
              icon: 'none'
            })
          }
          timeOut = null;
        }, 20000)
      },
      //停止搜索
      stopBuleTooth: function () {
        wx.stopBluetoothDevicesDiscovery({
          success(res) {
            console.log('成功停止搜索')
          }
        })
      },
      //建立连接
      getConnect: function (dvs) {
        let that = this;
        const ds = dvs;
        const deviceId = ds.deviceId;
        const name = ds.name;
        wx.createBLEConnection({
          // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
          deviceId,
          success(res) {
            that.setData({
              isConnected: true,
              connectedDevice: name
            })
            that.getService(deviceId)
          }
        });
        //that.stopBuleTooth()
      },
      //获取设备所有服务
      getService: function (deviceId) {
        let that = this;
        wx.getBLEDeviceServices({
          deviceId: deviceId,
          success: function (res) {
            for (let i = 0; i < res.services.length; i++) {
              if (res.services[i].isPrimary) {
                that.getCharacteristic(deviceId, res.services[i].uuid)
              }
            }
          }
        })
      },
      //获取蓝牙设备某个服务中所有特征值(characteristic)
      getCharacteristic: function (deviceId, serviceId) {
        let that = this;
        wx.getBLEDeviceCharacteristics({
          deviceId,
          serviceId,
          success(res) {
            wx.hideLoading()
            wx.showToast({
              title: '初始化蓝牙成功!',
              icon: 'none'
            });
            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) {
                that.setData({
                  canWrite: true
                })
                that._deviceId = deviceId
                that._serviceId = serviceId
                that._characteristicId = item.uuid
              }
              if (item.properties.notify || item.properties.indicate) {
                wx.notifyBLECharacteristicValueChange({
                  deviceId,
                  serviceId,
                  characteristicId: item.uuid,
                  state: true,
                })
              }
            }
          },
          fail: function (res) {
            console.log("获取服务特征值失败,再次获取" + res)
            that.getCharacteristic(deviceId, serviceId)
          }
        })
      },
      //写数据
      wirteData: function (param) {
        let that = this;
        let data = new Uint8Array(param);
        let dataBuffer = data.buffer;
        wx.writeBLECharacteristicValue({
          deviceId: this._deviceId,
          serviceId: this._serviceId,
          characteristicId: this._characteristicId,
          value: dataBuffer,
          success: function (res) {
            console.log('成功')
            console.log(res)
          },
          fail: function (res) {
            wx.showToast({
              title: '写入失败,请重新配网',
              icon:'none'
            })
          }
        })
        //写入数据之后监听
        wx.onBLECharacteristicValueChange((characteristic) => { 
          switch (that.ab2hex(characteristic.value)){
            case '42':
              wx.hideLoading()
              wx.showToast({
                title: '配网成功',
                icon:'none'
              });
              that.closeBluetoothAdapter()
              wx.navigateTo({
                url: '../finish/finish',
              })
              break;
            case '0b':
              break;
            default:
              wx.hideLoading()
              wx.showToast({
                title: '配网失败',
                icon:'none'
              })
          }
        })
      },
      //关闭蓝牙
      closeBluetoothAdapter() {
        wx.closeBluetoothAdapter()
        console.log('关闭蓝牙')
      }
    })

    具体见https://gitee.com/jiangdaqi/minPro/blob/master/pages/configuration/configuration.js

    要注意的是组织参数时,需将字符串变为字节数组

  • 相关阅读:
    魔法方法中的__str__和__repr__区别
    新建分类目录后,点击显示错误页面?
    3.用while和for循环分别计算100以内奇数和偶数的和,并输出。
    2.for循环实现打印1到10
    1.while循环实现打印1到10
    021_for语句
    014_运算符_字符串连接
    020_while语句
    019_增强switch语句
    018_switch语句
  • 原文地址:https://www.cnblogs.com/helloNico/p/12179745.html
Copyright © 2011-2022 走看看