低功耗蓝牙使用API设计封装函数模式示例
var bluetooth = {
RESET: function(){
// 基础数据配置
this.btName = "";
this.deviceId = "";
this.serviceId = "";
this.write_characteristicId = "";
this.read_characteristicId = "";
clearTimeout(this.sendTimer);
this.sendTimer = null;
},
START: async function () {
// 启动蓝牙,判断用户蓝牙是否已开启
},
SEARCH: async function () {
// 搜索设备是否在附近,wx.onBluetoothDeviceFound 记得GPS权限,切勿频繁先调用GPS获取用户地理位置再搜索
await this.START();
return new Promise((reslove, reject)=>{
reslove();
})
},
CONNECT: async function () {
// 连接设备
// if(self.btName == device.btName)
let sameName = self.btName == device.btName ? true : false; // 记录蓝牙连接是否多次同时快速触发
if(this.waitConnect && sameName){
console.log("正在连接,请稍等...")
return;
}
this.waitConnect = true;
await this.SEARCH();
return new Promise((reslove, reject)=>{
this.waitConnect = false;
reslove();
})
},
SEND: async function (device, data, callback) {
// 发送数据
this.passCheck = device.passCheck
//这样写,可以兼容连接设备中,发送指令1,但是连接过程中,又发送指令2,那么连接成功后,处理指令2
this.data= device.data
this.callback = device.callback
await this.CONNECT();
return new Promise((reslove, reject)=>{
device.sendEnd();
callback();
})
},
receiveDataCallback: function(){
// 接收设备返回的数据到前台
callback(value)
},
CLOSE: async function () {
// 关闭蓝牙线程
},
DISCONNECT: function(){
// 断开指定设备连接
},
STOP: function(){
// 停止搜索监听
},
ERROR: function(){
/***
* ERROR 错误
* err @params {}
* err.ercode @params Number
* 0 ok 正常
* 10000 not init 未初始化蓝牙适配器
* 10001 not available 当前蓝牙适配器不可用
* 10002 no device 没有找到指定设备
* 10003 connection fail 连接失败
* 10004 no service 没有找到指定服务
* 10005 no characteristic 没有找到指定特征值
* 10006 no connection 当前连接已断开
* 10007 property not support 当前特征值不支持此操作
* 10008 system error 其余所有系统上报的异常
* 10009 system not support Android 系统特有,系统版本低于 4.3 不支持 BLE
* 10012 operate time out 连接超时
* 10013 invalid_data 连接 deviceId 为空或者是格式不正确
*/
},
}
var device = {
btName: "btName",
deviceId: "AB:CD:EF:00:00:01", // 实践中设备端地址请勿以 00 开头 00:00:00:AB:CD:EF
passCheck: new Date().getTime(), // 记录触发跟设备返回是否为同一事件
sendEnd: function(res){
// 用于记录发送数据给设备成功后,设备一直未返回执行相关命令
clearTimeout(bluetooth.sendTimer);
bluetooth.sendTimer = setTimeout(() => {
clearTimeout(bluetooth.sendTimer);
bluetooth.CLOSE();
}, timeout);
},
onBLEConnectionStateChange: function(res){
// 用于监听蓝牙设备操作过程中,设备主动断开(例如:突然把设备断电或手动断开蓝牙捕获异常处理)
// if(device.passCheck == )
},
capture: function(err){
// 用于获取操作过程中,蓝牙未启动,操作过程中连接失败或连接操作过程中出现的异常
// if(device.passCheck == )
}
}
// 使用示例
let data = "00 11 22";
bluetooth.START(device);
bluetooth.SEARCH(device);
bluetooth.CONNECT(device);
bluetooth.SEND(device, data, function (value) {
console.log("value=>",value) // 用于收到设备返回数据回调处理
if(value){
bluetooth.passCheck = "";
bluetooth.CLOSE();
}
})
针对连接问题,方法推荐:
// timeout 针对特殊手机,如果发现首次连接铁定失败,或首次连接超时较多,可以将时间首次连接改到小于一秒,这样第二次连接timeout=10s,
// 成功率较多,
// 这种做法可以减少因差手机第一次连太久出现用户手动关闭的情况。毕竟一秒能连上的手机都是性能较好,安卓版本较高的手机。
var allowWaitTime = 15 * 1000;
var timeout = 10 * 1000;
var startCreateTime = new Date().getTime();
function createBLEConnection(){
wx.createBLEConnection({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
timeout: timeout, // number 否 超时时间,单位ms,不填表示不会超时
deviceId: self.deviceId,
// serial: false, // 会闪退的
success(res) {
// console.log("createBLEConnection res=>",res)
},
fail(err) {
// console.log("createBLEConnection err=>",err)
let useCreateTime = new Date().getTime() - startCreateTime; // 这样写正常情况下都会按时返回的,例如,请问你的蓝牙
// 连设备多长时间后超时,你可以根据timeout 回答。但这种误差可能造成你无法提供解释的情况,无奈下推荐写个时间计算器,
// 时间一到,不管成功与否都弹出失败提示。哪怕最后一秒连上了,也弹出失败。(无奈,无奈,无奈)可以减少与非同行讲解误差。
if (err.errCode == 10012) {
// 连接超时,可能
if(useCreateTime >= allowWaitTime) {
self.ERROR(err);
self.CLOSE();
}else{
setTimeout(()=>{
createBLEConnection();
}, t ); // t 根据测试数据,效果来定
}
}else {
// (err.errCode == 10003)
// (err.errCode == -1)
// 10003 底层蓝牙失败,处理大体思路
CLOSE();
START();
CREATE();
}
});
}
createBLEConnection();
代码片段示例 https://developers.weixin.qq.com/s/qJ6lORmy7LpS github https://github.com/synctimes163/wxapp-bluetooth