评论

低功耗蓝牙使用API设计封装函数模式示例

低功耗蓝牙使用API设计封装函数模式示例

var bluetooth = {
    RESETfunction(){
        // 基础数据配置
        this.btName = "";
        this.deviceId = "";
        this.serviceId = "";
        this.write_characteristicId = "";
        this.read_characteristicId = "";
            
            clearTimeout(this.sendTimer);
            this.sendTimer = null;
    },
    STARTasync function () {
        // 启动蓝牙,判断用户蓝牙是否已开启

            
    },
    SEARCHasync function () {
        // 搜索设备是否在附近,wx.onBluetoothDeviceFound 记得GPS权限,切勿频繁先调用GPS获取用户地理位置再搜索

        await this.START(); 
        return new Promise((reslove, reject)=>{
            reslove();
        })
    },
    CONNECTasync 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();


        })
    },
    SENDasync 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();


        })


    },
    receiveDataCallbackfunction(){
        // 接收设备返回的数据到前台
        callback(value)
    },
    CLOSEasync function () {
        // 关闭蓝牙线程
    },
    DISCONNECTfunction(){
       // 断开指定设备连接
    },
    STOPfunction(){
        // 停止搜索监听
    },
    ERRORfunction(){
        /***
       * 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
    passChecknew Date().getTime(),  // 记录触发跟设备返回是否为同一事件
    sendEndfunction(res){
        // 用于记录发送数据给设备成功后,设备一直未返回执行相关命令
        clearTimeout(bluetooth.sendTimer);  
        bluetooth.sendTimer = setTimeout(() => {
           clearTimeout(bluetooth.sendTimer);
           bluetooth.CLOSE();
        }, timeout);
    },
    onBLEConnectionStateChangefunction(res){
        // 用于监听蓝牙设备操作过程中,设备主动断开(例如:突然把设备断电或手动断开蓝牙捕获异常处理)
        // if(device.passCheck == )
    },
    capturefunction(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

最后一次编辑于  2021-04-26  
点赞 2
收藏
评论

1 个评论

  • 康斌
    康斌
    2020-10-15

    写的真棒,收藏了

    2020-10-15
    赞同
    回复 2
    • 同步
      同步
      2020-10-16
      谢谢,你也有做蓝牙开发?
      2020-10-16
      2
      回复
    • .
      .
      2021-07-21回复同步
      您好 可以加下微信么 有个蓝牙问题请教下
      2021-07-21
      回复
登录 后发表内容