- 遇到的一些问题
- BLE相关的好多函数都是异步的,但是BLE的操作又必须按照顺序流程来,否则就会出现问题,所以这里得嵌套大量的回调函数。
- 普通回调函数中this拿不到data数据的问题
- 原因:小程序在回调函数中调用this数据报错是因为在程序运行过程中,this对象也会发生改变,导致在普通回调函数之中改变后的this对象没有相关数据,即会报错
- 解决方法:1)使用全局变量保存这个this;2)使用箭头函数
- 下面开始正式开发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权限
2)初始化成功后,就去调用搜索
3)把搜索到的设备,解析对应的字段显示在对应的设备列表中
4)ble搜索是比较耗资源和电量的,所以在页面隐藏的时候,就停止搜索
这里做了大量的交互处理,比如:1)没有权限的时候,就重新去请求权限。2)如果初始化蓝牙失败,弹出提示框提示用户检查蓝牙或者权限是否打开。3)由于有时候初始化适配器需要较长的时间,所以点击按钮后,会弹出一个开始搜索的loading提示框,防止按键按了以后误以为没反应。