• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

小程序蓝牙通信模块

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
// 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

 

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
    热门话题
    阅读排行榜

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap