08_微信小程序-BLE低功耗蓝牙开发-设备搜索

  • 遇到的一些问题
  1. BLE相关的好多函数都是异步的,但是BLE的操作又必须按照顺序流程来,否则就会出现问题,所以这里得嵌套大量的回调函数。
  2. 普通回调函数中this拿不到data数据的问题
    1. 原因:小程序在回调函数中调用this数据报错是因为在程序运行过程中,this对象也会发生改变,导致在普通回调函数之中改变后的this对象没有相关数据,即会报错        
    2. 解决方法:1)使用全局变量保存这个this;2)使用箭头函数

                08_微信小程序-BLE低功耗蓝牙开发-设备搜索_第1张图片

  •  下面开始正式开发ble设备搜索功能,为了更加方便的管理ble,对微信的小程序的ble进行的封装,并在ble.js文件中实现对应的接口功能

        1. BLE初始化接口,在该接口里面,首先去打开蓝牙适配器,并且去设置蓝牙适配器状态监听回调,防止用户在使用小程序过程中又把蓝牙给关闭了。

var bleInitFlag = false; // ble是否初始化

/**
* @功能: ble初始化
* @参数:
*  cb[in]: 初始化结果状态回调, true表示初始化成功
* @返回:
* @备注: 初始化之前请检查一下是否有蓝牙权限
*/
function Init(cb) {
    if (bleInitFlag) {
        // 防止重复初始化
        if (typeof cb == 'function') {
            cb(true);
        }


        return;
    }


    // 初始化蓝牙模块
    wx.openBluetoothAdapter({
        mode: 'central',
        success: (res) => {
            console.log("初始化蓝牙模块成功!");
            bleInitFlag = true;
            if (typeof cb == 'function') {
                cb(true);
            }
        },
        fail: (res) => {
            console.log("初始化蓝牙模块失败!");
            bleInitFlag = false;
            if (typeof cb == 'function') {
                cb(false);
            }
        }
      });
    
      // 蓝牙适配器状态监听
      wx.onBluetoothAdapterStateChange((res) => {
        console.log("蓝牙适配器状态改变"+res.available);
        bleInitFlag = res.available;
      });
}

        2. 释放接口,当不使用蓝牙了,过程序退出了,调用该接口

/**
* @功能: 页面释放的时候调用
* @参数:
*  cb[in]: 关闭蓝牙回调失败成功回调
* @返回:
*/
function DeInit(cb) {
    // if (!bleInitFlag) {
    //     return;
    // }


    wx.closeBluetoothAdapter({
      success: (res) => {
          console.log("关闭蓝牙适配器成功");
          if (typeof cb == 'function') {
            cb(true);
        }
      },
      fail: (res) => {
         console.log("关闭蓝牙适配器失败");
         if (typeof cb == 'function') {
            cb(false);
        }
      },
    });


    // 关闭蓝牙适配器状态监听
    wx.offBluetoothAdapterStateChange();


    bleInitFlag = false;
}

        3. 开始搜索和停止搜索的接口

/**
* @功能: 开始搜索
* @参数:
*  cb[in]: 搜索到设备的回调函数
* @返回:
*/
function StartDiscovery(cb) {
    if (!bleInitFlag) {
        console.log("搜索失败,BLE未初始化");
        return
    }


    // 开始搜索附近的蓝牙外围设备
    wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: true //允许重复上报设备,主要是为了统计信号强度
    })


    // 监听扫描到新设备事件
    wx.onBluetoothDeviceFound((res) => {
        if (typeof cb == 'function') {
            cb(res);
        }
    });
}


/**
* @功能: 停止搜索
* @参数:
* @返回:
*/
function StopDiscovery() {
    if (!bleInitFlag) {
        return;
    }


    wx.stopBluetoothDevicesDiscovery();
}

        4. 获取蓝牙适配器状态的接口

/**
* @功能: 获取BLE状态
* @参数:
* @返回:true表示可用状态,false表示不可用
*/
function getBleStatus() {
    return bleInitFlag;
}

        5. 在搜索按键事件中调用这些接口实现相关功能

        1)检查是否有对应的BLE权限

        08_微信小程序-BLE低功耗蓝牙开发-设备搜索_第2张图片

        2)初始化成功后,就去调用搜索

        08_微信小程序-BLE低功耗蓝牙开发-设备搜索_第3张图片

         3)把搜索到的设备,解析对应的字段显示在对应的设备列表中

        08_微信小程序-BLE低功耗蓝牙开发-设备搜索_第4张图片

        4)ble搜索是比较耗资源和电量的,所以在页面隐藏的时候,就停止搜索

        08_微信小程序-BLE低功耗蓝牙开发-设备搜索_第5张图片 

        这里做了大量的交互处理,比如:1)没有权限的时候,就重新去请求权限。2)如果初始化蓝牙失败,弹出提示框提示用户检查蓝牙或者权限是否打开。3)由于有时候初始化适配器需要较长的时间,所以点击按钮后,会弹出一个开始搜索的loading提示框,防止按键按了以后误以为没反应。

08_微信小程序-BLE低功耗蓝牙开发-设备搜索_第6张图片

 

你可能感兴趣的:(微信小程序,微信小程序,小程序)