还有脸睡?微信小程序与智能硬件终端蓝牙BLE通讯,实现WIFI配网这么简单都不会,周公都得踹醒你!

当下各种支持WIFI模块的硬件终端越来越普遍,但要想与之进行数据交互需要先给终端连接上周边WIFI,这样才可正常通过互联网接收与发送数据,这种终端一般分为 3 类,即:可视化操作配网(窗口)WIFI连接配网(Socket)蓝牙通讯配网(BLE)

可视化配网非常简单,终端提供触摸屏与系统手动即可完成配网(一般是基于Android系统的二次开发)。还有一种无触摸屏需要通过 WIFI 或蓝牙与终端连接,发送约定格式的十六进制数据,内含配网需要的相关数据,如:WIFI名称密码服务器地址端口,等等信息,终端解析数据后连接 WIFI,本文主要讲解第 3 种方式蓝牙通讯的完整流程

整体流程分为3个步骤:搜索并选择周边 WIFI - 搜索并连接目标设备蓝牙 - 填写选中 WIFI 密码并通过蓝牙发送

完整源码,可私聊我获取。若您有遇到其它相关问题,非常欢迎在评论中留言,我和其他读者小伙伴们将帮助解决并持续更新至此文,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!


搜索并选择周边 WIFI
 /**
  * 初始化Wifi模块
  */
 onStartWifi:function(){
    wx.startWifi({
      success: (res) => {
        if(res.errCode == 0){
          // 初始化成功
          that.onUserLocationScope();
        }else{
          // 初始化失败
          that.showModal(res.errMsg);
        }
      },
      fail: (res) => {
        that.showModal(res.errMsg);
      }
    })
 },

 /**
  * 获取scope.userLocation授权
  */
 onUserLocationScope:function(){
  // 获取当前已授权项列表
  wx.getSetting({
    success:(res) => {
      // 如果未获取 userLocation 授权则请求授权
      if (!res.authSetting['scope.userLocation']) {
        wx.authorize({
          scope: 'scope.userLocation',
          success: (res) => { // 同意授权
            that.onGetWifiList();
          },
          fail: (res) => { // 拒绝授权
            that.showModal("您已拒绝授权,蓝牙配网无法继续进行,点击设置可重新授权")
            wx.openSetting({})
          }
        })
      }else{ // 如果已获取则直接搜索 WIFI 列表
        that.onGetWifiList();
      }
    }
  })
 },

 /**
  * 获取Wifi列表
  */
 onGetWifiList:function(){
  wx.getWifiList({
    success: (res) => {
      // 获取 WIFI 列表成功
      if(res.errCode == 0){
        wx.onGetWifiList(function (CALLBACK) {
          // 原始的 WIFI 列表
          let wifiList = CALLBACK.wifiList;
          // 处理后 WIFI 列表(去重并且只保留名称 => SSID)
          let wifiSSID = [];
          // 去重并且只保留名称
          wifiList.forEach(wifi => {
            if(wifi.SSID == ''){
              wifiSSID.unshift("未能获取到此 WIFI 的命名")
              return;
            }
            wifiSSID.indexOf(wifi.SSID) == -1 ? wifiSSID.unshift(wifi.SSID) : '';          
          })
          // push 显示
          that.setData({
            mainData: wifiSSID
          })
        });
      }else{ // 获取 WIFI 列表失败
        that.showModal(res.errMsg)
      }
    },
    fail: (res) => {
      that.showModal(res.errMsg)
    }
  })
 },

搜索并连接目标设备蓝牙
  /**
   * 开始搜寻附近的蓝牙设备(此操作比较耗费系统资源,请在搜索并连接到设备后调用 wx.stopBluetoothDevicesDiscovery方法停止搜索)
   */
  startBluetoothDevicesDiscovery: function () {
    if(_discoveryStarted) {
      return;
    }
    _discoveryStarted = true
    wx.startBluetoothDevicesDiscovery({
      services: serviceUUID, //如果设置此参数,则只搜索广播包有对应 uuid 的主服务的蓝牙设备。
      allowDuplicatesKey: false,
      success: (res) => {
        console.log('蓝牙搜索 success :', res)
      },
      fail(res) {
        console.log('蓝牙搜索 fail :', res)
      }
    })
  },

  /**
   * 监听寻找新设备事件
   * 搜索匹配设备后,自动连接设备(filterDeviceName为自动连接的蓝牙名,模糊判断)
   */
  onBluetoothDeviceFound: function () {
    wx.onBluetoothDeviceFound((res) => {
      res.devices.forEach(device => {
        // 转换后, 得出相关数据
        var hexStr = that.ab2hex(device.advertisData);
        // 通过蓝牙名称匹配设备
        let deviceName = device.name.toUpperCase();
        // 判断是否为指定连接名称的蓝牙
        if ((deviceName.indexOf(filterDeviceName) != -1) && isnotExist) {
          // 默认匹配第一个
          isnotExist = false; 
          deviceId = device.deviceId;
          // 停止搜寻附近的蓝牙外围设备。
          that.stopBluetoothDevicesDiscovery();
          // 连接指定蓝牙
          that.createBLEConnection(deviceName);
        }
      })
    })
  },

填写选中 WIFI 密码并通过蓝牙发送
  /**
   * 蓝牙设备配网数据处理
   */
  bleConfigEvent: function () {

    // 蓝牙搜索的结果
    if (util.isEmpty(deviceId)) {
      util.toastError("请先搜索蓝牙设备");
      return;
    }

    // 即将传输的数据
    var cell = {
      "time": "xxxxxxxxxxx",
      "data": {
        "cmd": 10,
        "ssid": "WIFI 名称",
        "password": "WIFI 密码",
        "server": "服务器IP",
        "portApi": "服务器端口",
        "portMqtt": "1883",
        "ip": "",
        "subnet": "",
        "router": ""
      }
    }

    // 发送验证字符串(根据终端通讯协议规则决定是否需要)
    var signet = "signet";
    var signetBuffer = this.string2buffer(signet)
    that.sendBLEData(signetBuffer,0,false);

    // 发送正式配网数据
    var buffer = this.string2buffer(JSON.stringify(cell))
    setTimeout(function () {
      that.sendBLEData(buffer, 0, true);
    }, 1000)
  },

  /**
   * 发送数据
   * @param buffer 需要发送的数据体
   * @param close 是否为最终数据
  */
  sendBLEData: function (buffer,close) {
    wx.writeBLECharacteristicValue({
      deviceId: _deviceId,
      serviceId: _serviceId,
      characteristicId: _characteristicId,
      value: buffer,
      success: function (res) {
        if (close){
          util.toastError('配网成功');
        }
      },
      fail: function (res) {
        console.log(res);
      }
    })
  },

完整源码,可私聊我获取。若您有遇到其它相关问题,非常欢迎在评论中留言,我和其他读者小伙伴们将帮助解决并持续更新至此文,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!

在这里插入图片描述

你可能感兴趣的:(微信小程序实用源码,低功耗蓝牙,蓝牙,BLE,小程序,蓝牙,wifi蓝牙,蓝牙串口通讯)