uniapp蓝牙连接(多设备切换连接,OTA升级)

uniapp蓝牙门锁功能(开门,录入指纹,密码,门卡,OTA升级,门锁设置音量语言等) ,蓝牙连接,发送应答,OTA升级分包,重发机制,蓝牙中断

蓝牙连接流程图

在这里插入图片描述

import store from '@/store'
import {
	getDeviceKey,
	getOpenPwd,
	postFamilyLog,
	postFamilyPolice,
	updateElectric
} from '@/request'
import {
	calculateCRC16Modbus,
	strToHexCharCode,
	data_encrypt,
	data_decrypt,
	hex2ArrayBuffer,
	hex2String,
	string2Hex,
	get_sum,
	arrayBuffer2Hex,
	hex2int,
	get_time_ts,
	get_msg_len,
	get_hex_str,
	get_num2hex,
	get_bin2hex
} from './srv_request.js'

import CryptoJS from 'crypto-js'
import SparkMD5 from "spark-md5"
export class BtTask {
	constructor(id) {
		this.task_member_passwd_status = "init"
		this.msg_reset_lock_cnt = 0
		this.productId = ""   //绑定连接设备id
		this.productInfo = {}  //绑定连接设备信息
		this.task_bt_pair_status = "init"   //绑定的流程判断
		this.bindKey = ""       //绑定设备秘钥
		this.deviceNum = id //后台的设备deviceNum
		this.deviceId = "" //蓝牙搜索出的设备id
		this.bt_product_list = []  //搜索到的设备列表
		this.characteristics0 = ""   //特征值数据  暂时先保留
		this.characteristics1 = ""	 //特征值数据
		this.writeuuid = ""   //蓝牙写入uuid
		this.notifyuuid = ""  //蓝牙监听uuid
		this.serviceId = ""    //服务id  用来获取蓝牙特征值
		this.dev_crc16 = ""    //用于匹配对应蓝牙的crc(根据deviceId加密而来)
		this.dev_key = ""    //加密秘钥
		this.dev_key_md5 = ""  //秘钥MD5
		this.dev_key_md5_hex = "" //十六进制秘钥MD5
		this.dev_pid = ""     // 锁信息	
		this.dev_soft_version = ""   // 锁信息	
		this.dev_passwd = ""    // 锁信息	
		this.dev_lock_status = "" // 锁信息	
		this.dev_open_status = -1  //开门状态
		this.dev_open_err_code = -1   //开锁失败原因码
		this.srv_passwd = ""   //开锁秘钥
		// 指纹
		this.dev_add_fp_step = 0  //录入指纹步骤
		this.dev_add_fp_step_sum = 0   //录入指纹所需次数
		this.dev_add_fp_hw_id = 0   //录入指纹成员id
		this.dev_fp_sample_cnt = 0   //录入第几次
		// 卡片
		this.dev_add_card_step = 0
		this.dev_add_card_step_sum = 0
		this.dev_add_card_hw_id = 0
		this.dev_card_sample_cnt = 0
		// 文件
		this.file_update_offset = 0
		this.file_update_page_index = 0
		this.file_update_page_max = 0
		// 升级
		this.update_start = false
		this.pkg_size = 0   //每包传输大小
		this.page_num = 0   //总包数
		this.current_page = 0  //当前包数
		this.update_status = 0
		this.update_file_data = ''  //OTA升级数据
		this.upgradeCallback = {}   //升级最后一包数据回调 ----  回调里去获取重新当前设备版本号对比判断是否更新成功
		
		this.searchTimer = null, //蓝牙搜索不到处理定时
		this.bluetoothState = 0 //蓝牙连接状态  0断开  1连接 2连接中
		this.bluetoothSearchState = 0 //蓝牙搜索状态 0未搜索 1搜索中
		this.update_hardler_status = "init"   //硬件升级
		this.task_update = {}
		this.task_normal = {}
		this.update_hardler_cnt = 0
		this.app_pkg_data_start_cnt = 0
		this.app_update_cmd_start_cnt = 0
		this.update_hardler_system_cnt = 0
		this.app_pkg_data_ng_cnt = 0
		this.isBind = false
		this.hardwareId = 0
		this.record_sync_flag = false
		this.remove_passwd_callback = {}
		this.user_id = 0
		this.update_volume_callback = {}
		this.update_language_callback = {}
		this.remove_fp_callback = {}     //删除指纹回调
		this.get_dev_info_callback = {}  //获取锁信息回调
		this.remove_card_callback = {}   //删除卡片回调
		this.set_new_admin_passwd_callback = {} //设置密码回调
		this.bindStepCallback = {} //绑定步骤回调
		this.addNewFingerCallback = {} //添加指纹回调
		this.addNewCardCallback = {} //添加卡片回调
		// 同步指纹
		this.syncFingerData = '' //同步指纹数据总包
		this.syncFingerStep = 0  //同步指纹数据包序号
		this.syncFingerMemberId = '' //同步指纹数据成员id
		this.syncFingerCallback = {}  //同步指纹数据回调
		this.syncCardCallback = {}  //同步卡片数据回调
		// 采集器
		this.fingerStep = '' //采集器当前步骤
		this.fingerData = '' //采集器指纹包数据
		this.serialNumber = '' //采集器当前包序号
		this.msg_collect_finger_callback = {} //采集器添加指纹回调
		this.cardData = '' //采集器卡片数据
		this.msg_collect_card_callback = {} //采集器删除卡片回调
		// 重发
		this.repeatFailTimer = null //重发的定时器
		this.second = 0  //重发次数

	}
	// 获取蓝牙连接状态
	get_bluetooth_state() {
		return this.bluetoothState
	}

	//开启蓝牙
	bt_open_start() {
		this.closeBLEConnection()
		this.openBluetoothAdapter()
	}

	//获取锁的密钥
	bt_load_init(bindKey, productInfo, productId, deviceNum) {

		this.bindKey = bindKey
		this.productInfo = productInfo
		this.productId = productId
		this.deviceNum = deviceNum
		var hex = string2Hex(this.deviceNum)
		console.log('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@hex', hex)

		this.dev_crc16 = calculateCRC16Modbus(strToHexCharCode(this.deviceNum)).padStart(4, 0).toUpperCase()
		console.log("###################this.dev_crc16", this.dev_crc16);
		this.task_bt_pair_status = 'bt_pair_begin'
		this.get_key_by_dev_id()
	

	}

	//bt 配对任务  之前版本的写法,看着就头疼
	task_bt_pair() {
		console.log('配对任务------')
		// if ("init" == this.task_bt_pair_status) {
		// 	//task_bt_pair_status = "get_lock_info_start"
		// }
		// if ("bt_pair_connect_start" == this.task_bt_pair_status) {
		// 	//this.task_bt_pair_status = "bt_pair_connect_ok"

		// } else
		//  if (this.task_bt_pair_status == "bt_pair_connect_ok") //连接
		// {
			
		// 	console.log('@@@@@@@@@ bt_pair_get_key_by_dev_id_start获取密钥')
		
			
		// 	// this.task_bt_pair_status = "bt_pair_reset_lock"
		// }  else
		 if ("bt_pair_connect_ok" == this.task_bt_pair_status) //复位锁
		{
			console.log('bt_pair_reset_lock复位锁')
			// 连接之后延迟去操作锁
			if (this.msg_reset_lock_cnt++ > 4) {
				this.msg_reset_lock_cnt = 0
				this.msg_reset_lock()
				
			}
			
		} else if ("bt_pair_get_lock_info_start" == this.task_bt_pair_status) //获取锁信息
		{

			console.log('@@@@@@@@@ bt_pair_get_lock_info_start获取锁信息')
			this.msg_get_dev_info()

		} else if ("bt_pair_get_lock_info_end" == this.task_bt_pair_status) //进入锁设置页面
		{
			uni.hideLoading()
			uni.navigateTo({
				url: `/page_lock/bind_device_submit/bind_device_submit?msg=${JSON.stringify(this.productInfo)}&deviceNum=${this.deviceNum}&bindKey=${this.bindKey}`
			})
			this.bindStep = 3
			this.bindStepCallback(3)
			console.log('@@@@@@@@@ bt_pair_get_lock_info_start进入锁设置页面') 
			this.clear_task()
			this.task_bt_pair_status = "init"
		}
		// else if ("bt_pair_add_new_admin_passwd_wait" == this.task_bt_pair_status) //添加管理员密码
		// {

		// 	console.log('@@@@@@@@@ bt_pair_add_new_admin_passwd_wait添加管理员密码')
		// } else if ("bt_pair_add_new_admin_passwd_start" == this.task_bt_pair_status) {
		// 	console.log('@@@@@@@@@ bt_pair_add_new_admin_passwd_start')
		// 	this.isBind = true
		// 	this.msg_add_new_admin_passwd(this.dev_input_passwd)

		// }
		//  else if ("bt_pair_srv_create_bt_dev_start" == this.task_bt_pair_status) //后台建立节点
		// {
		// 	console.log('@@@@@@@@@ bt_pair_srv_create_bt_dev_start后台建立节点')
		// 	this.srv_create_bt_dev()
		// 	this.isBind = false
		// } else if ("bt_pair_ok" == this.task_bt_pair_status) {
		// 	console.log('@@@@@@@@@ bt_pair_ok')
		// 	this.task_bt_pair_status = "init"
		//  else if ("bt_pair_lock_status_busy" == this.task_bt_pair_status) {
		// 	console.log('@@@@@@@@@ bt_pair_lock_status_busy')
		// }

	}

	task_normal_hardler(that) {
		that.task_bt_pair()
		//that.task_member_passwd()
	
	}

	task_create(callback) {
		this.bindStepCallback = callback
			
		clearInterval(this.task_normal)
		this.task_normal = setInterval(this.task_normal_hardler, 500, this);

	}

	clear_task() {
		clearInterval(this.task_normal)
	}

	//获取密钥
	get_key_by_dev_id() {

		getDeviceKey({
			deviceNum: this.deviceNum
		}).then(res => {
			this.dev_key = res.data["secretKey"]
			this.dev_key_md5 = CryptoJS.MD5(this.dev_key).toString().toUpperCase()
			this.dev_key_md5_hex = hex2String(this.dev_key_md5)
			if(this.task_bt_pair_status =='bt_pair_begin'){
				this.task_bt_pair_status = 'bt_pair_connect_start'
				this.bt_open_start()
			}
			
		})
	}



	console_time(str) {
		var timestamp = new Date().getTime()

		var tmp = str + timestamp.toString()

		console.log(tmp);
	}
	// 锁电量上报
	rev_electric_hardler(data, len){
		
		var value = hex2int(data.slice(2, 6))
		console.log('锁电量上报',data,value);
		updateElectric({
			deviceNum:this.deviceNum,
			electricity:value
		}).then(res=>{
			this.msg_rev_electric()
		})
	}
	// 应答电量上报
	msg_rev_electric(){
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "08"
		var msg_type = "02"
		var msg_flag = "00"
		var msg_data = msg_type + msg_flag
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.do_send_bt_msg(msg0,1)
	}
	

	//获取操作记录回应 (锁端不再上传相同记录)  
	msg_get_open_record_ack() {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "01"
		var msg_len = "0000"
		var msg_type = "00"
		var msg_flag = "00"
		console.log('############ 获取操作记录msg_get_open_record_ack')
		var msg_data = msg_type + msg_flag
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.do_send_bt_msg(msg0, 1)

	}


	//获取操作记录	
	msg_get_open_record() {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "01"
		var msg_len = "0006"
		var msg_type = "00"
		var msg_flag = "01"
		var msg_ts = get_time_ts(0)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_type + msg_flag + msg_ts
		var msg0_hex = hex2String(msg0)
		var md5 = SparkMD5.hashBinary(msg0_hex).toString().toUpperCase()
		var sum_data = get_sum(msg0 + md5)
		var msg = msg0 + md5 + sum_data
		var hex2 = hex2String(msg)
		console.log('************ 获取操作记录', msg)
		var encrypted = data_encrypt(hex2, this.dev_key_md5_hex)
		var data = string2Hex(encrypted.out)
		this.write(data)
	}

	//接受到操作记录反馈
	rev_open_record_hardler(data, len) {
		var ops_flag = data.slice(2, 4)
		var ops_step = data.slice(4, 6)
		var pkg_num = data.slice(6, 8)
		var len_pkg = (len - 4) / 6 //记录数量
		console.log("@@@@@@@@@@@@@@@@@ rev_open_record_hardler接受到操作记录反馈", data, ops_flag, ops_step);
		console.log('有无操作记录',ops_flag == "01" && ops_step == "00")

		if (ops_flag == "01" && ops_step == "00") //有操作记录
		{
			var i = 0
			var jsonArr_open = []
			var jsonArr_ops = []
			var jsonArr_police = []
			for (i = 0; i < len_pkg; i++) {
				var offset = i * 12
	
				var type_tran = []
	
				var type = data.slice(8 + offset, 10 + offset)
				var id = data.slice(10 + offset, 12 + offset)
				var ts = data.slice(12 + offset, 20 + offset)
				var ts_val = hex2int(ts)
				var id_val = hex2int(id)
				var type_val = hex2int(type)
	
				//由于与后台枚举不一致 故作转换
				type_tran[1] = 1
				type_tran[2] = 2
				type_tran[3] = 3
				type_tran[4] = 4
				type_tran[5] = 5
				type_tran[6] = 6
				type_tran[7] = 7
	
				type_tran[8] = 8
				type_tran[9] = 9
				type_tran[0x0A] = 0x0A
				type_tran[0x0B] = 0x0B
				type_tran[0x0C] = 0
				type_tran[0x0D] = 0
				type_tran[0x0E] = 0
				type_tran[0x0F] = 0
				type_tran[0x10] = 0
				type_tran[0x11] = 0
				type_tran[0x12] = 0
				type_tran[0x13] = 0
				type_tran[0x14] = 0
				type_tran[0x15] = 0
				type_tran[0x16] = 1
				type_tran[0x17] = 2
				type_tran[0x18] = 3
				type_tran[0x19] = 4
				type_tran[0x20] = 5
				var type_tran_val = type_tran[type_val]
				var jobj = {
					deviceNum: this.deviceNum,
					openType: type_tran_val,
					reportTime: ts_val * 1000,
					hardwareId: id_val
				}
	
				//不同类型使用不同的后台API				
				if (type_val >= 0x01 && type_val <= 0x0B) {
					jsonArr_open.push(jobj);
				} else if (type_val >= 0x0C && type_val <= 0x15) {
					jsonArr_ops.push(jobj);
				} else if (type_val >= 0x16 && type_val <= 0x19) {
					jsonArr_police.push(jobj);
				}
			}
	
			console.log("jsonArr_open", jsonArr_open);
			console.log("jsonArr_police", jsonArr_police);
			
			let arr = []
			if (jsonArr_open.length > 0) {
				arr.push(postFamilyLog(jsonArr_open))
				// this.srv_add_record(jsonArr_open, 1)
			}
			if (jsonArr_police.length > 0) {
				arr.push(postFamilyPolice(jsonArr_police))
				// this.srv_add_record(jsonArr_police, 2)
			}
			
			// 两个列表都成功了才应答
			Promise.all(arr).then(res=>{
				this.msg_get_open_record_ack()
			})
			// if (report_type == 1) {
			// 	// postFamilyLog(myJSON).then(res => {
			// 	// 	this.msg_get_open_record_ack()
			
			// 	// })
			// } else if (report_type == 2) {
			// 	// postFamilyPolice(myJSON).then(res => {
			// 	// 	this.msg_get_open_record_ack()
			
			// 	// })
			// }
			
		} else {
			
		}
	}

	//复位锁端
	msg_reset_lock() {
		console.log('############ msg_reset_lock复位锁')
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "14"
		var msg_len = "0006"
		var msg_type = "00"
		var msg_flag = "FF"
		var msg_ts = ""
		msg_ts = get_time_ts(0)
		var msg_data = msg_type + msg_flag
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.repeat_send_bt_msg(msg0)

	}
	
	//复位锁反馈
	rev_reset_lock_hardler(data, len) {
		var ack = data.slice(2, 4)
		console.log("###  rev_reset_lock_hardler ack复位锁反馈", ack)
		if(this.task_bt_pair_status == 'bt_pair_connect_ok'){
			this.task_bt_pair_status = "bt_pair_get_lock_info_start"
			this.bindStep = 2
			this.bindStepCallback(2)
		}
		
	
	}
	// 获取开锁的一个秘钥srv_passwd
	get_admin_passwd() {
		getOpenPwd({
			deviceNum: this.deviceNum
		}).then(res => {
			console.log('get_admin_passwd', res)
			this.srv_passwd = res.data["password"]
		})

	}

	//开锁
	msg_open_door() {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "02"
		var msg_len = "0006"
		var msg_type = "00"
		var msg_flag = "01"
		var msg_ts = ""
		this.dev_open_status = -1
		this.dev_open_err_code = -1

		console.log('############ start msg_open_door开锁', this.srv_passwd)

		msg_ts = get_time_ts(0)

		var msg_passwd = calculateCRC16Modbus(strToHexCharCode(this.srv_passwd)).padStart(4, 0).toUpperCase()

		// console.log('@@@@@@@@@ msg_passwd crc', msg_passwd)

		var msg_data = msg_ts + msg_passwd

		// console.log('************ msg_data', msg_data)

		var msg_len = get_msg_len(msg_data)

		// console.log('************ msg_len', msg_len)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		// console.log('************ msg0', msg0)

		this.do_send_bt_msg(msg0, 1)

	}
	//开锁返回信息
	rev_open_door_hardler(data, len) {
		console.log("###  rev_open_door_hardler开锁反馈")

		var open_status = data.slice(2, 4)
		var err_code = data.slice(4, 6)

		this.dev_open_status = open_status
		this.dev_open_err_code = err_code

		console.log("open_status", open_status)
		console.log("err_code", err_code)

	}
	get_open_door_status() {
		return this.dev_open_status
	}

	get_open_door_err_code() {
		return this.dev_open_err_code
	}

	

	//添加卡片
	msg_add_new_card(memberId, callback = {}) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "06"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		var msg_hw_id = "FF"

		var msg_user_id = get_hex_str(memberId, 2) //成员id
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_step = "00" //开始
		this.addNewCardCallback = callback
		var msg_data = msg_type + msg_step + msg_user_id + msg_hw_id + msg_ts_start + msg_ts_end
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.repeat_send_bt_msg(msg0)

	}

	//添加卡片反馈
	rev_add_new_card_hardler(data, len) {
		this.clear_add_new_card()

		var step = data.slice(2, 4)
		var user_id = data.slice(4, 6)
		var hw_id = data.slice(6, 8)
		var ack = hex2int(data.slice(8, 10))
		// if(ack != 0x00){
		// 	this.res_fail_dispose(ack)
			
		// }
		console.log("###  rev_add_new_card_hardler添加新卡片反馈",'应答码:',ack,'步骤:',step)
		this.dev_add_card_step = hex2int(step)

		if (this.dev_add_card_step == 0x00) //录入开始
		{
			this.addNewCardCallback()
		} else if (this.dev_add_card_step == 0xFC) //录入进行
		{

		} else if (this.dev_add_card_step == 0xFF) //录入完成
		{
			this.dev_add_card_hw_id = hex2int(hw_id)
		} else  if (this.dev_add_card_step == 0xFD )   //0xFD录入失败  0xFE录入取消 
		{
			
		}
		
		

	}

	//删除卡片
	msg_remove_card(user_id, hw_id, callback) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "0F"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"
		this.remove_card_callback = callback
		// var msg_ts_start = get_time_ts(0)
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_user_id = get_hex_str(user_id, 2)
		var msg_hw_id = get_hex_str(hw_id, 2)
		var msg_data = msg_type + msg_user_id + msg_hw_id
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.repeat_send_bt_msg(msg0)

	}

	// 删除卡片反馈
	rev_remove_card_hardler(data, len) {
		console.log("###  rev_remove_passwd_hardler删除卡片反馈")

		var user_id = data.slice(2, 4)
		var hw_id = data.slice(4, 6)
		var ack = hex2int(data.slice(6, 8))
		console.log("###  删除卡片反馈数据", user_id, hw_id, ack)
		if(ack == 0x00){
			this.remove_card_callback(1)
		}else{
			this.remove_card_callback(2)
			this.res_fail_dispose(ack)
		}

	}

	get_add_card_hw_id() {
		return this.dev_add_card_hw_id
	}

	get_add_card_step() {
		return this.dev_add_card_step
	}

	clear_add_new_card() {
		this.dev_add_card_step = 0
		this.dev_add_card_hw_id = 0
	}

	// 采集器 -------------------------------start//

	//设置秘钥
	set_dev_key(dev_key) {
		this.dev_key = dev_key
		this.dev_key_md5 = CryptoJS.MD5(this.dev_key).toString().toUpperCase()
		this.dev_key_md5_hex = hex2String(this.dev_key_md5)
	}

	// 采集器指纹数据
	get_fingerData() {
		return this.fingerData
	}
	//采集器卡片数据
	get_cardData() {
		return this.cardData
	}
	// 当前结果  指纹卡片公用
	get_fingerStep() {
		return this.fingerStep
	}

	// 采集器指纹结束
	clear_fp_data() {
		this.cardData = ''
		this.fingerStep = ''
		this.fingerData = '' //采集器指纹包数据
		this.serialNumber = '' //采集器当前包序号
		this.msg_collect_finger_callback = {}
		this.msg_collect_card_callback = {}
	}
	// 采集器录入指纹  state=1开始  2结束
	msg_collect_finger_print(state, callback = {}) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "21"
		var msg_ts = ""
		var msg_type = "00"
		var msg_step = state === 1 ? '0x00' : '0xFE'
		// var msg_ts_start = get_time_ts(0)
		// var msg_ts_end = get_time_ts(600)
		console.log('msg_ts_start', msg_ts_start, msg_ts_end)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_data = msg_type + msg_step + msg_ts_start + msg_ts_end
		var msg_len = get_msg_len(msg_data)
		this.msg_collect_finger_callback = callback
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		this.do_send_bt_msg(msg0, 1)

	}

	// 采集器录入指纹反馈  
	res_collect_finger_print_hardler(data, len) {
		var step = data.slice(2, 4) //录入阶段
		console.log('采集器录入指纹阶段', step)
		this.fingerStep = hex2int(step)
		if (this.fingerStep == 0x00) {
			this.msg_collect_finger_callback()
		}
	}

	//采集器上发指纹数据反馈 
	rev_send_finger_print_hardler(data, len) {
		console.log("###  rev_send_finger_print_hardler采集器上发指纹数据反馈 ")

		// 包序号
		var serialNumber = data.slice(2, 4)

		// 指纹数据  128字节 256位 
		var fingerprintData = data.slice(4, 260)
		this.serialNumber = serialNumber
		console.log('采集器录入数据接收--', '包序号:' + serialNumber, '数据:' + fingerprintData)
		this.fingerData = this.fingerData + fingerprintData
		console.log('总数据', this.fingerData)	
		// 接受成功再应答
		this.msg_response_finger_print()
	}

	// 采集器上发指纹数据应答
	msg_response_finger_print() {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "22"
		// var msg_len = "0002"  //数据长度
		var msg_ts = ""
		var msg_type = "00"
		var msg_data = msg_type + this.serialNumber
		var msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		console.log('采集器数据接收应答', msg_data)
		this.do_send_bt_msg(msg0, 1)

	}

	// 采集器添加卡片 state=1开始  2结束
	msg_collect_card(state, callback = {}) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "23"
		var msg_ts = ""
		var msg_type = "00"
		var msg_step = state === 1 ? '0x00' : '0xFE'
		// var msg_ts_start = get_time_ts(0)
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_data = msg_type + msg_step + msg_ts_start + msg_ts_end
		var msg_len = get_msg_len(msg_data)
		this.msg_collect_card_callback = callback
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		this.do_send_bt_msg(msg0, 1)

	}

	// 采集器添加卡片反馈
	res_collect_card_hardler(data, len) {
		var step = data.slice(2, 4) //录入阶段
		console.log('采集器添加卡片阶段', step)
		this.fingerStep = hex2int(step)
		if (this.fingerStep == 0x00) {
			this.msg_collect_card_callback()
		}
		// 添加成功
		if (this.fingerStep == 0xFF) {
			var cardData = data.slice(4, 12) //卡片数据
			console.log('卡片录入成功,卡片数据:', cardData)
			this.cardData = cardData
		}
	}

	// 
	/**
	 * 开始同步采集器指纹到门锁
	 * @param totalData 指纹数据总包
	 * @param memberId 成员id
	 * @param callback 结果回调
	*/
	start_sync_finger_print(totalData,memberId,callback={}){
		this.msg_test_data()
		this.clear_sync_finger()
		this.syncFingerData = totalData
		this.syncFingerMemberId = memberId
		this.syncFingerCallback = callback
		this.syncFingerStep = 0
		console.log('start_sync_finger_print',this.syncFingerData,this.syncFingerMemberId)
		setTimeout(()=>{
			this.msg_send_finger_print()
		},800)
		
	}
	/**
	 * 唤醒门锁蓝牙
	*/
	msg_test_data(){
		var msg_head = "123" 
		this.write(msg_head)
	}
	// 发送同步指纹数据
	msg_send_finger_print(){
		
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "11"
		var msg_ts = ""
		var msg_type = "00"
		var msg_memberId =  get_hex_str(this.syncFingerMemberId,2)  //成员id 
		var hw_id = "FF"  //硬件id 写死FF  
		var step = get_hex_str(this.syncFingerStep,2)  //当前序号
		// 每个序包的指纹数据  //16进制 
		// arrayBuffer2Hex
		// string2Hex
		var msg_fingerData = this.syncFingerData.slice(this.syncFingerStep*128*2,(this.syncFingerStep+1)*128*2)
		// var msg_ts_start = get_time_ts(0)                                                 
		// var msg_ts_end = get_time_ts(600) 
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_data = msg_type + msg_memberId + hw_id + step + msg_fingerData + msg_ts_start + msg_ts_end
		console.log('发送同步指纹数据',step,msg_fingerData)
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.do_send_bt_msg(msg0, 1)
	}
	// 同步指纹应答
	res_sync_finger_print_hardler(data, len){
		let state = hex2int(data.slice(2, 4)) // 0x00开始录入 0xFC录入进行 0xFD录入失败 0xFF录入成功
		let memberId = data.slice(4, 6)  //成员id
		let hw_id = data.slice(6, 8)  //硬件id
		let sync_number = hex2int(data.slice(8, 10))  //接收到的包序号
		let ack  = hex2int(data.slice(10, 12))   //应答码
		
		this.syncFingerStep = Number(sync_number)+1
		console.log('同步指纹应答1',state,ack)
		console.log('同步指纹应答',hw_id,sync_number,this.syncFingerStep)
		//优先判断应答码
		if(ack != 0x00){
			this.res_fail_dispose(ack)
			this.syncFingerCallback(2,hw_id)
			this.clear_sync_finger()
			return
		}
		
		// 成功或者失败回调
		if( state ==0xFF || state == 0xFD){
			let callbackState = state ==0xFF?1:2
			this.syncFingerCallback(callbackState,hw_id)
			this.clear_sync_finger()
			return
		}
		// // 发的最后一包但是没返回结果,默认失败,停止发送
		// if(sync_number == 15){
		// 	this.syncFingerCallback(2,hw_id)
		// 	this.clear_sync_finger()
		// 	return
		// }
		this.msg_send_finger_print()

		
	}
	// 还原同步指纹操作
	clear_sync_finger(){
		this.syncFingerData = ''
		this.syncFingerMemberId = ''
		this.syncFingerCallback = {}
		this.syncFingerStep = 0
	}
	// 发送同步门卡数据
	msg_sync_card(data,memberId,callback){
		this.msg_test_data()
		
		
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "12"
		var msg_type = "00"
		var msg_memberId =  get_hex_str(memberId,2)  //成员id 
		var hw_id = "FF"  //硬件id 写死FF  
		var card_Data = data
		this.syncCardCallback = callback
		// var msg_ts_start = get_time_ts(0)                                                 
		// var msg_ts_end = get_time_ts(600) 
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		// 阶段/第几包/总包  000101
		var msg_data = msg_type + '000101'+ msg_memberId + hw_id  + card_Data + msg_ts_start + msg_ts_end
	
		var msg_len = get_msg_len(msg_data)
		
		console.log('msg',card_Data,msg_memberId)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		
		setTimeout(()=>{
			this.do_send_bt_msg(msg0, 1)
		},800)
	}
	// 同步卡片应答
	res_sync_card_hardler(data, len){
		let state = hex2int(data.slice(2, 4)) // 0x00开始录入 0xFC录入进行 0xFD录入失败 0xFF录入成功
		let memberId = data.slice(4, 6)  //成员id
		let hw_id = data.slice(6, 8)  //硬件id
		let ack  = hex2int(data.slice(10, 12))   //应答码
		console.log('同步卡片应答1',state,memberId,hw_id,ack)
		//优先判断应答码
		if(ack == 0x00){
			this.syncCardCallback(1,hw_id)
		}else{
			this.syncCardCallback(2,hw_id)
			this.res_fail_dispose(ack)
		}
		
	}
	
	// 采集器 -------------------------------end//
	get_add_fp_hw_id() {
		return this.dev_add_fp_hw_id
	}

	get_add_fp_step() {
		return this.dev_add_fp_step
	}

	get_fp_sample_cnt() {
		return this.dev_fp_sample_cnt
	}

	// 清空添加指纹步骤


	//添加指纹
	msg_add_new_finger_print(memberId, callback = {}) {
		this.clear_add_new_fp()
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "05"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		var msg_hw_id = "FF" //硬件id

		console.log('############ msg_add_new_finger_print添加指纹')
		console.log('添加指纹成员id', memberId)
		// var msg_ts_start = get_time_ts(0) 
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_step ="00"//阶段
		var memberId = get_hex_str(memberId, 2) //成员id
		this.addNewFingerCallback = callback
		var msg_data = msg_type + msg_step + memberId + msg_hw_id + msg_ts_start + msg_ts_end
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.repeat_send_bt_msg(msg0)

	}
	// 取消录入指纹
	msg_cancel_finger_print(memberId){
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "05"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"
		
		var msg_hw_id = "FF" //硬件id
		console.log('############ msg_add_new_finger_print取消指纹')
		console.log('添加指纹成员id', memberId)
		// var msg_ts_start = get_time_ts(0) 
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_step ="FE"//阶段  取消
		var memberId = get_hex_str(memberId, 2) //成员id
		var msg_data = msg_type + msg_step + memberId + msg_hw_id + msg_ts_start + msg_ts_end
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.repeat_send_bt_msg(msg0)
	}
	//添加指纹反馈
	rev_add_new_finger_print_hardler(data, len) {
		console.log("###  rev_add_new_finger_print_hardler添加指纹反馈")
		var step = data.slice(2, 4)
		this.dev_add_fp_step = hex2int(step)
	
		var user_id = data.slice(4, 6)
		var hw_id = data.slice(6, 8)
		var sample_cnt = data.slice(8, 10)
		// 
		if (this.dev_add_fp_step == 0x00) //录入开始
		{
			this.dev_fp_sample_cnt = 0
			this.dev_add_fp_step_sum = hex2int(sample_cnt)   //需录入次数
			this.addNewFingerCallback()
		} else if (this.dev_add_fp_step == 0xFC) //录入进行
		{
			this.dev_fp_sample_cnt = hex2int(sample_cnt)
		} else if (this.dev_add_fp_step == 0xFF) //录入完成
		{
			this.dev_add_fp_hw_id = hex2int(hw_id)
			this.dev_fp_sample_cnt = hex2int(sample_cnt)
		} else //0xFD录入失败  0xFE录入取消 
		{
	
			this.dev_fp_sample_cnt = hex2int(sample_cnt)
		}
	}
	clear_add_new_fp() {
		this.dev_fp_sample_cnt = 0
		this.dev_add_fp_step = 0
		this.dev_add_fp_hw_id = 0
		this.addNewFingerCallback = {}
	}
	//删除指纹
	msg_remove_finger_print(user_id, hw_id, callback) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "0D"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		this.remove_fp_callback = callback

	
		// var msg_ts_start = get_time_ts(0)
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死

		var msg_user_id = get_hex_str(user_id, 2)
		var msg_hw_id = get_hex_str(hw_id, 2)

		var msg_data = msg_type + msg_user_id + msg_hw_id

		var msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		// console.log('************ msg0', msg0)

		this.repeat_send_bt_msg(msg0)

	}

	//删除指纹反馈接收处理
	rev_remove_finger_print_hardler(data, len) {
		console.log("###  rev_remove_finger_print_hardler删除指纹反馈")
		var user_id = data.slice(2, 4)
		var hw_id = data.slice(4, 6)
		var ack = hex2int(data.slice(6, 8))
		console.log("删除指纹反馈", user_id, hw_id, ack)
			if(ack == 0x00){
				this.remove_fp_callback(1)
			}else{
				this.remove_fp_callback(2)
				this.res_fail_dispose(ack)
			}
	}

	//添加管理员新密码
	msg_add_new_admin_passwd(passwd, callback = {}) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "07"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		var msg_hw_id = "FF"
		this.set_new_admin_passwd_callback = callback
		console.log('############ start msg_add_new_admin_passwd添加管理员新密码')

		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_step = "00"
		var admin = "01"
		var memberId = "01"  //管理员写死01
		var msg_passwd_len = get_hex_str(passwd.length, 2)
		var msg_passwd = get_num2hex(passwd)
		var msg_data = msg_type + msg_step + admin + memberId + msg_hw_id + msg_ts_start + msg_ts_end +
			msg_passwd_len + msg_passwd
		var msg_len = get_msg_len(msg_data)
		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
		this.repeat_send_bt_msg(msg0)



	}
	//删除密码
	msg_remove_passwd(user_id, hw_id, callback) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "0E"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		this.remove_passwd_callback = callback
		// var msg_ts_start = get_time_ts(0)
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_user_id = get_hex_str(user_id, 2)
		var msg_hw_id = get_hex_str(hw_id, 2)

		var msg_data = msg_type + msg_user_id + msg_hw_id

		var msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		this.repeat_send_bt_msg(msg0)

	}
	//删除密码反馈
	rev_remove_passwd_hardler(data, len) {
		console.log("###  rev_remove_passwd_hardler删除密码反馈")

		var user_id = data.slice(2, 4)
		var hw_id = data.slice(4, 6)
		var ack = hex2int(data.slice(6, 8))
		console.log("###  删除密码反馈数据", user_id, hw_id, ack)
		if(ack == 0x00){
			this.remove_passwd_callback(1)
		}else{
			this.remove_passwd_callback(2)
			this.res_fail_dispose(ack)
		}

	}

	
	/**
	 * 设置设备音量
	 */
	msg_update_volume(volume, callback) {
		var msg_head = "55AA" //头部
		var msg_ext = "00" //版本 
		var msg_cmd = "03" //命令	
		var msg_ts = ""
		var msg_type = "03"

		this.update_volume_callback = callback


		var volume = get_hex_str(volume, 2)
		// var msg_hw_id = get_hex_str(hw_id, 2)
		// msg_type +
		var msg_data = msg_type + volume

		var msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		console.log('************ 设置音量', msg_data)

		this.repeat_send_bt_msg(msg0)

	}

	/**
	 * 设置设备音量反馈
	 */
	rev_update_volume_hardler(data, len) {
		

		var ack = hex2int(data.slice(2, 4))
		console.log("^^^^^rev_update_volume_hardler音量反馈", ack)
		if(ack == 0x00){
			this.update_volume_callback(1)
		}else{
			this.update_volume_callback(2)
			this.res_fail_dispose(ack)
		}

		
	}
	/**
	 * 设置设备语言
	 */
	msg_update_language(language, callback) {
		var msg_head = "55AA" //头部
		var msg_ext = "00" //版本 
		var msg_cmd = "0A" //命令	
		var msg_len = "0000" //命令长度
		var msg_ts = ""
		var msg_type = "00"
		this.update_language_callback = callback

		var language = get_hex_str(language, 2)

		var msg_data = msg_type + language

		var msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		console.log('************ 设置语言', msg_data)

		this.repeat_send_bt_msg(msg0)

	}

	/**
	 * 设置设备语言反馈
	 */
	rev_update_language_hardler(data, len) {
		
		var ack = hex2int(data.slice(2, 4))
		console.log("^^^^^rev_update_language_hardler设置语言回调", ack)
		if(ack == 0x00){
			this.update_language_callback(1)
		}else{
			this.update_language_callback(2)
			this.res_fail_dispose(ack)
		}
	

	}
	//添加普通用户新密码  添加密码
	msg_add_new_passwd(password, memberId, callback = {}) {
		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "07"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		var msg_hw_id = "FF"

		// console.log('############ start msg_add_new_passwd')
		this.set_new_admin_passwd_callback = callback
		// var msg_ts_start = get_time_ts(0)
		// var msg_ts_end = get_time_ts(600)
		var msg_ts_start = 'FFFFFFFF' //时间戳先写死
		var msg_ts_end = 'FFFFFFFF' //时间戳先写死
		var msg_step = "00"
		var user = "00" //00普通成员  01管理员

		var msg_user_id = get_hex_str(memberId, 2) //成员id

		var msg_passwd_len = get_hex_str(password.length, 2) //密码长度

		var msg_passwd = get_num2hex(password) //密码

		var msg_data = msg_type + msg_step + user + msg_user_id + msg_hw_id + msg_ts_start + msg_ts_end +
			msg_passwd_len + msg_passwd

		var msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		console.log('************ msg0', msg0)

		this.repeat_send_bt_msg(msg0)

	}
	
	//添加新密码反馈
	rev_add_new_passwd_hardler(data, len) {
		console.log("###  rev_add_new_passwd_hardler添加新密码反馈", data)
		var user_id = data.slice(4, 6)
		var hw_id = hex2int(data.slice(6, 8))
		var ack = hex2int(data.slice(8, 10)) //应答码  //判断是否添加成功
		console.log("添加新密码反馈,ack:",ack,'user_id:', user_id,'hw_id:',hw_id)
		this.hardwareId = hw_id
		if ("bt_pair_add_new_admin_passwd_start" == this.task_bt_pair_status) {
			this.task_bt_pair_status = "bt_pair_srv_create_bt_dev_start"
			console.log('设置管理员密码')
	
		}

		if (this.task_member_passwd_status == "member_passwd_add_start") {
			this.task_member_passwd_status = "member_passwd_add_ok"
		}
		
		if(ack == 0x00){
			// 设置密码回调  (成功状态,固件id)
			this.set_new_admin_passwd_callback(1, this.hardwareId)
		}else{
			this.set_new_admin_passwd_callback(2)
			this.res_fail_dispose(ack)
		}
		
		}
	
		/**
		 * @param {string} link  下载地址
		 * @param {Function} callback 回调
		 */
		download_update_fw(link, callback) {
			var that = this
		
			const downloadTask = uni.downloadFile({
				url: link,
				filePath: `${wx.env.USER_DATA_PATH}/ota.bin`,
				success: (res) => {
					if (res.statusCode === 200) {
						console.log('###################下载成功');
		
						uni.getFileSystemManager().readFile({
							filePath: `${wx.env.USER_DATA_PATH}/ota.bin`,
							encoding: 'hex',
							position: 0,
							success(res) {
								// var md5 = SparkMD5.hashBinary(res.data).toString().toUpperCase()
								that.update_file_data = res.data
								console.log('that.update_file_data文件数据:',res.data.length )
								console.log('************ 固件下载成功', get_hex_str(res.data.length,8))
								callback(1)
							},
							fail(res) {
								console.error(res)
								uni.showToast({
									title:'文件下载失败',
									icon:'none'
								})
								callback(-1)
							}
		
		
						})
		
					}
				},
				fail(err) {
					uni.showToast({
						title:'文件下载失败',
						icon:'none'
					})
					callback(-1)
				}
			});
		
		
		
		}
		// OTA升级任务
		task_update_hardler(callback={}) {
		
			console.log('OTA升级任务')
			this.msg_app_update_start()
			this.upgradeCallback = callback

		}	
	//校验设备是否可升级	
	msg_app_update_start() {
			var msg_head = "55AA"
			var msg_ext = "00"
			var msg_cmd = "FA" //APP下发升级指令
			var msg_len = "0000"
			var msg_ts = ""
			var msg_type = "00"
			var msg_update_status = "00" //升级状态(0x00有固件可升级 0x01升级开始 0x02升级成功 0x03升级失败)
			var msg_update_type = "01" //固件类型(0x00模组固件 0x01MCU固件)
			var msg_data = msg_type + msg_update_status + msg_update_type
			var msg_len = get_msg_len(msg_data)
			var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
			console.log('************校验设备是否可升级msg0', msg0)
			this.repeat_send_bt_msg(msg0)
			
	}

	//是否可升级反馈
	rev_app_update_start_hardler(data, len) {
	
			var ack = hex2int(data.slice(2, 4)) //(0x00允许升级 0x01电量不足拒绝升级 0x02其他原因)
			// console.log("###  update_hardler_status", this.update_hardler_status)
			console.log("###  rev_app_update_start_hardler是否可升级反馈", ack)
			if (ack == 0x00 ) {
				this.msg_app_update_pkg_start()
				
			}else if(ack == 0x01){
				uni.showToast({
					title:'电量过低,无法升级',
					icon:'error'
				})
				this.upgradeCallback('fail')
			}
		
		}

	//开始下发升级包
	msg_app_update_pkg_start() {
			var msg_head = "55AA"
			var msg_ext = "00"
			var msg_cmd = "FB" //APP下发升级包
			var msg_type = "00"
			var msg_pkg_len = get_hex_str(this.update_file_data.length/2,8)    //固件包大小(0000FC00=64512),4字节
			var msg_data = msg_type + msg_pkg_len
			var msg_len = get_msg_len(msg_data)
			var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
			console.log('************APP下发升级包msg0','包大小:', msg_pkg_len)
			this.repeat_send_bt_msg(msg0)

	}
	//开始下发升级包反馈
	rev_app_update_pkg_start_hardler(data, len) {
		
		var pkg_size = data.slice(2, 4) //升级包传输大小选择(0x00分包大小64字节 0x01分包大小128字节 0x02分包大小256字节)
		console.log("###  rev_app_update_pkg_start传输开始反馈传输大小",this.update_file_data.length, pkg_size)
			if (pkg_size == "00") {
				this.pkg_size = 64 *2
			} else if (pkg_size == "01") {
				this.pkg_size = 128 *2
			} else if (pkg_size == "02") {
				this.pkg_size = 256 *2
			}
			// 计算需要发送几包
		  this.page_num = Math.ceil(this.update_file_data.length/this.pkg_size)
		  this.current_page = 0
		  this.msg_app_update_pkg_data_send()
		
	}
	//开始下发升级包数据
	msg_app_update_pkg_data_send() {
	
			var msg_head = "55AA"
			var msg_ext = "00"
			var msg_cmd = "FC" //APP下发传输数据
			var msg_ts = ""
			var msg_type = "00"
			var msg_hw_id = "FF"
			// 偏移量
			var offset_str = get_hex_str(this.current_page*this.pkg_size/2,8) 
			// 文件数据包
			var msg_file_data =  this.update_file_data.slice(this.current_page*this.pkg_size,this.current_page*this.pkg_size+this.pkg_size)
			var msg_data = msg_type + offset_str + msg_file_data
			console.log('发送OTA升级数据', '第几包:',this.current_page,'偏移量:',offset_str,'数据:',msg_file_data)
			var msg_len = get_msg_len(msg_data)  
			var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data
			this.repeat_send_bt_msg(msg0)
	}
	//下发升级包数据反馈
	rev_app_update_pkg_data_send_hardler(data, len) {
			let pack = hex2int(data.slice(2, 10))
			let ack = hex2int(data.slice(10, 12))
			console.log("###  rev_app_update_pkg_data_send发包后反馈",ack, pack, this.current_page*this.pkg_size/2)
			console.log("###  rev_app_update_pkg_data_send发包后反馈",'当前包:',this.current_page,'总包:',this.page_num)
				if (ack == 0x00 && (pack == this.current_page*this.pkg_size/2) ) {
					this.upgradeCallback(this.current_page/(this.page_num-1))
					if((this.current_page+1) ==this.page_num ){
						// 最后一包发送成功
						// setTimeout(()=>{},3000)
						this.upgradeCallback('success')
						
						return
					}
				
					console.log("### 发包成功")
					this.current_page++
					this.msg_app_update_pkg_data_send()	
				}else{
					this.upgradeCallback('fail')
				} 
		}
	
	// 清空升级数据
	clear_pkg_data(){
		this.current_page = 0
		this.pkg_size = 0
		this.page_num = 0
		this.update_file_data=""
		this.upgradeCallback = {}
	}
	//获取锁信息						
	msg_get_dev_info(callback = {}) {
		console.log('msg_get_dev_info获取锁信息...')

		var msg_head = "55AA"
		var msg_ext = "00"
		var msg_cmd = "00"
		var msg_len = "0000"
		var msg_ts = ""
		var msg_type = "00"

		msg_ts = get_time_ts(0)
		this.get_dev_info_callback = callback
		console.log('deviceNum *****', this.deviceNum)
		var msg_data = msg_type + msg_ts + string2Hex(this.deviceNum)

		msg_len = get_msg_len(msg_data)

		var msg0 = msg_head + msg_ext + msg_cmd + msg_len + msg_data

		console.log('msg0 *****', msg0)

		this.repeat_send_bt_msg(msg0)

	}

	//获取锁信息反馈			
	rev_lock_info_hardler(data, len) {
		console.log("###  rev_lock_info_hardler获取锁信息反馈")
		this.dev_pid = data.slice(0, 15 * 2)
		// this.dev_soft_version = data.slice(15 * 2, 18 * 2 ) 
		// 版本号:每两位转成十进制再拼接
		 this.dev_soft_version ='' + hex2int(data.slice(15 * 2,16*2)) + hex2int(data.slice(16 * 2,17*2))  +hex2int(data.slice(17 * 2,18*2))  
		this.dev_passwd = data.slice(18 * 2, 20 * 2).toString().toUpperCase()
		this.dev_lock_status = data.slice(20 * 2, 21 * 2)
		// console.log("this.dev_pid", this.dev_pid)
		// console.log("this.dev_soft_version", this.dev_soft_version)
		// console.log("this.dev_passwd", this.dev_passwd)
		// console.log("this.dev_lock_status", this.dev_lock_status)
		if (JSON.stringify(this.get_dev_info_callback) != "{}") {
			this.get_dev_info_callback(this.dev_soft_version)
		}
		if (this.dev_lock_status == "58") {
			//this.task_bt_pair_status = "bt_pair_add_new_admin_passwd_start"
			this.task_bt_pair_status = "bt_pair_get_lock_info_end"
			
		} else {
			uni.showToast({
				title:'该设备未进入初始化模式',
				icon:'none',
			})
			this.task_bt_pair_status = "bt_pair_lock_status_busy"
		}

	}

	// report_type /family/log 		开锁记录
	// report_type /family/police   告警记录	
	srv_add_record(report_data, report_type) {
		console.log('@@@@@@@@@ srv_add_record  report_data记录上报', report_data)
		var myJSON = JSON.stringify(report_data);
		if (report_type == 1) {
			// postFamilyLog(myJSON).then(res => {
			// 	this.msg_get_open_record_ack()

			// })
		} else if (report_type == 2) {
			// postFamilyPolice(myJSON).then(res => {
			// 	this.msg_get_open_record_ack()

			// })
		}
		
		Promise.all()

	}

	

	//实际发送数据
	do_send_bt_msg(msg0, cnt) {
		if (!this.writeuuid) {
			console.log('UUID为空', this.writeuuid)
			return
		}
		var msg0_hex = hex2String(msg0)
		var md5 = SparkMD5.hashBinary(msg0_hex).toString().toUpperCase()
		var msg = msg0 + md5
		var sum_data = ''
		sum_data = get_sum(msg)
		msg = msg0 + md5 + sum_data
		console.log('#######发送的完整信息', msg)
		var hex2 = hex2String(msg)
		var encrypted = data_encrypt(hex2, this.dev_key_md5_hex)
		var data = string2Hex(encrypted.out)
		for (let i = 0; i < cnt; i++) {
			this.write(data)
		}
	}
	
	//实际发送数据  有重发机制
	 repeat_send_bt_msg(msg0) {
		if (!this.writeuuid) {
			console.log('UUID为空', this.writeuuid)
			return
		}
		var msg0_hex = hex2String(msg0)
	
		var md5 = SparkMD5.hashBinary(msg0_hex).toString().toUpperCase()
	
		var msg = msg0 + md5
	
		var sum_data = ''
	
		sum_data = get_sum(msg)
	
		msg = msg0 + md5 + sum_data
	
		console.log('#######发送的完整信息', msg)
	
		var hex2 = hex2String(msg)
	
		var encrypted = data_encrypt(hex2, this.dev_key_md5_hex)
		var data = string2Hex(encrypted.out)
		
		
		// 如果重复发送,清除之前的定时器
		this.clear_Interval()
		// 重发机制  
		var intervalFun = ()=>{
			if(this.second>5){
				console.log('重发数据失败')
				this.clear_Interval()
				if(JSON.stringify(this.upgradeCallback) != "{}") this.upgradeCallback('fail')
				return uni.showToast({
					title:'操作失败,请重试',
					icon:'none'
				})
				
			}
			this.second+=1
			console.log('重发数据....',`次数:第${this.second}`)
			this.write(data)
			// 第一次直接执行发送,所以写成这种形式
			return intervalFun
		}
		this.repeatFailTimer =  setInterval(intervalFun(),1000)
		
	}
	// 清除重发定时
	clear_Interval(){
		this.second = 0
		if(this.repeatFailTimer)clearInterval(this.repeatFailTimer)
		this.repeatFailTimer = null
	}

	//建立连接
	createBLEConnection() {
		if(this.searchTimer){
			clearTimeout(this.searchTimer)
		}
		// let that = this;
		uni.showLoading({
			title: '连接中,请稍等',
			mask: true,
		});
		console.log('建立连接-----this.deviceId', this.deviceId)
		uni.createBLEConnection({
			deviceId: this.deviceId,
			success: (res) => {
				console.log('##########蓝牙连接成功...')
				this.getBLEDeviceServices(); // 获取蓝牙的服务
				this.bluetoothState = 1
				store.commit('setBluetoothState',1)
				uni.hideLoading()
				uni.showToast({
					title: this.bt_info.name + "蓝牙连接成功!",
					icon: "none",
				});
			},
			fail: (err) => {
				console.log('连接err',err)
				uni.hideLoading()
				this.bluetoothState = 0
				store.commit('setBluetoothState',0)
				uni.showToast({
					title: (this.bt_info?.name || '') + "蓝牙连接失败",
					icon: "none",
				});
				this.closeBLEConnection()  //断开连接
				this.unloadBluetooth()	
			},
			complete:()=>{
				this.stopBluetoothDevicesDiscovery(); // 停止搜索蓝牙
			}
		});
	}

	startBluetoothDeviceDiscovery() {
		// 发现外围设备
		console.log('##########进去搜索...')
		 setTimeout(()=>{
			 uni.showLoading({
			 	title: "搜索中,请稍等",
			 	mask: true
			 });
			 uni.startBluetoothDevicesDiscovery({
				 allowDuplicatesKey:true,
			 	success: (res) => {
					this.bluetoothSearchState = 1
			 		console.log('##########成功搜索附近的蓝牙设备...')
			 		this.onBluetoothDeviceFound()
			 		// 10秒搜索时间失败处理
			 		this.searchBTFail()
			 	},
			 	fail: err => {
					this.bluetoothSearchState = 0
					this.bluetoothState = 0
					store.commit('setBluetoothState',0)
			 		uni.hideLoading()
			 		console.log(err, '开始搜索蓝牙设备备错误信息')
			 	}
			 })
		 },300)
		
	}
	// 设置搜索蓝牙超时定时器
	searchBTFail() {
		this.searchTimer = setTimeout(() => {
			uni.hideLoading()
			this.stopBluetoothDevicesDiscovery(); // 停止搜索蓝牙		
			uni.showToast({ 
				title: "蓝牙搜索超时,请靠近门锁",
				icon: "error",
				duration: 2000
			})
			this.bluetoothState = 0
			
			clearTimeout(this.searchTimer)
			this.searchTimer = null
		}, 15*1000)
	}
	// 停止搜索蓝牙
	stopBluetoothDevicesDiscovery() {
		if(this.searchTimer)clearTimeout(this.searchTimer)
		this.searchTimer = null
		uni.stopBluetoothDevicesDiscovery({
			success: e => {
				this.loading = false
				this.bluetoothSearchState = 0
				console.log('##########停止搜索蓝牙设备:' + e.errMsg);
			},
			fail: e => {
				console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
			}
		});
	}

	getBLEDeviceServices() {
		setTimeout(() => {
			uni.getBLEDeviceServices({
				// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
				deviceId: this.deviceId,
				success: (res) => {
					console.log('##########获取蓝牙设备的所有服务', res)
					// 可以和做硬件的沟通 他会直接给你一个 也可以自己从res里取值
					// res.services 是所有的服务
					this.serviceId =  this.bt_info['advertisServiceUUIDs'][0]
					// item["serviceId"] = item["advertisServiceUUIDs"][
					// 	0] //this.advertisServiceUUIDs[0] //'00004354-0000-1000-8000-00805F9B34FB';
					// // 	//进入特征
					this.getBLEDeviceCharacteristics();
					// 监听蓝牙状态

				}
			}, (err) => {
				console.log('##########获取蓝牙设备的所有服务失败', err)
			});
		}, 1000);
	}

	getBLEDeviceCharacteristics() {
		let that = this
		setTimeout(() => {
			uni.getBLEDeviceCharacteristics({
				deviceId: this.deviceId,
				serviceId: this.serviceId,
				success: (res) => {
					// res.characteristics 特征值列表
					// 读写都需要用到特征值
					console.log("##########获取特征值列表", res.characteristics);
					this.characteristics0 = res.characteristics[0]
					this.characteristics1 = res.characteristics[1]
					this.writeuuid = res.characteristics[0]['uuid']
					this.notifyuuid = res.characteristics[1]['uuid']
					console.log("#####uuid ", this.writeuuid, this.notifyuuid);
					
					this.notifyBLECharacteristicValueChange()
					this.onBLEConnectionStateChange()


				},
				fail: (res) => {
					console.log('##########fail...获取特征值列表失败', res);
				}
			});
		}, 1000);
	}

	// 16进制字符串转ArrayBuffer
	hex2ArrayBuffer(hex_str) {
		// let hex_str = 'AA5504B10000B5'
		let typedArray = new Uint8Array(hex_str.match(/[\da-f]{2}/gi).map(function(h) {
			return parseInt(h, 16)
		}))
		let buffer = typedArray.buffer
		return buffer
	}

	//设置蓝牙接受函数		
	notifyBLECharacteristicValueChange() {
		let that = this
		uni.notifyBLECharacteristicValueChange({
			state: true, // 启用 notify 功能					
			deviceId: that.deviceId,
			serviceId: that.serviceId,
			characteristicId: this.notifyuuid,
			success: (res) => {
				console.log("启用 notify 功能成功", res);
				this.listenValueChange()
				if (this.task_bt_pair_status == "bt_pair_connect_start"  ) {
					this.task_bt_pair_status = "bt_pair_connect_ok"
					this.bindStep = 1
					this.bindStepCallback(1)
					uni.showLoading({
						title:'设置中...',
						mask:true
					})
					// this.bindStep = 1
					// this.bindStepCallback(1)
				}
			},
			fail: (res) => {
				console.log("启用 notify 功能失败", res);
				uni.hideLoading();
			}
		});
	}

	//蓝牙设备搜索
	onBluetoothDeviceFound() {
		uni.onBluetoothDeviceFound((res) => {
			// res.devices 是所有的设备
			if (res.devices[0]["localName"] == "Lenovo") {	
				console.log('onBluetoothDeviceFound监听搜索到新设备的事件', res.devices[0])
				let bt_info = res.devices[0]
				let ad_info = res.devices[0]["advertisData"]
				let ad_info_i8 = new Uint8Array(ad_info)
				let ad = ad_info_i8[0].toString(16).padStart(2, 0).toUpperCase() + ad_info_i8[1].toString(
					16).padStart(2, 0).toUpperCase()
				console.log('******** ad3 ',ad_info,ad_info_i8, ad)
				bt_info.bt_mac = ad
				console.log('bt_info...', bt_info, this.deviceNum, this.dev_crc16)
				//当蓝牙的广播数据与设备号的crc16相同时认为是所搜索到的设备				
				if (bt_info.bt_mac == this.dev_crc16) {
					uni.hideLoading()
					console.log('******** 开始连接 ')
					this.bt_info = bt_info
					this.deviceId = this.bt_info.deviceId
					this.createBLEConnection()
				}
			} 
			// 采集器蓝牙   deviceNum为空时
			 if (this.deviceNum =='' && res.devices[0]["localName"] == "E5B_HARVESTER") {
				 uni.hideLoading()
				let bt_info = res.devices[0]
				this.bt_info = bt_info
				this.deviceId = this.bt_info.deviceId
				this.createBLEConnection()
			}
		})
	}

	//蓝牙数据接受处理函数
	listenValueChange() {
		uni.onBLECharacteristicValueChange(res => {
			try {
				var rev_data = arrayBuffer2Hex(res.value)
				var dcd = data_decrypt(hex2String(rev_data), this.dev_key_md5_hex)
				var data = string2Hex(dcd.out)
				console.log("###接收的明文数据data", data)
				var vesion = ''
				var cmd = ''
				var data_len = ''
				var head = ''
				var data_input = ''
				var head = data.slice(0, 4)
				if (head == "55aa") {
					vesion = data.slice(4, 6)
					cmd = data.slice(6, 8)
					data_input = data.slice(12)
					data_len = hex2int(data.slice(8, 12))
					var data_cal = data.slice(0, 12 + data_len * 2)
					var md5_cal = SparkMD5.hashBinary(hex2String(data_cal)).toString()
					var total_data = data_cal + md5_cal
					var sum_cal = get_sum(total_data).padStart(2, '0').toLowerCase()
					var md5 = data_input.slice(data_len * 2, -2)
					var sum = data_input.slice((data_len) * 2 + 32)
					// 锁端MD5和前端MD5对比,判断数据完整性
					if (md5_cal == md5 && md5_cal != "" && md5 != "") {
						if (sum_cal == sum && sum_cal != "" && sum != "") {
							this.clear_Interval()
								// console.log('cmd',cmd)
							if (cmd == "00") //获取锁信息
							{
								this.rev_lock_info_hardler(data_input, data_len)
							}
							if (cmd == "01") //获取开锁记录
							{
								this.rev_open_record_hardler(data_input, data_len)
							} else if (cmd == "02") //开锁反馈
							{
								this.rev_open_door_hardler(data_input, data_len)
							} else if (cmd == "03") //音量反馈
							{
								this.rev_update_volume_hardler(data_input, data_len)
							} else if (cmd == "05") //添加指纹反馈
							{
								this.rev_add_new_finger_print_hardler(data_input, data_len)
							} else if (cmd == "06") //添加卡片反馈
							{
								this.rev_add_new_card_hardler(data_input, data_len)
							} else if (cmd == "07") //添加密码反馈
							{
								this.rev_add_new_passwd_hardler(data_input, data_len)
							}else if (cmd == "08") //锁电量上报反馈
							{
								this.rev_electric_hardler(data_input, data_len)
							}
							 else if (cmd == "0a") //语言设置反馈
							{
								this.rev_update_language_hardler(data_input, data_len)
							} else if (cmd == "14") //恢复锁反馈
							{
								this.rev_reset_lock_hardler(data_input, data_len)
							} else if (cmd == "0e") //删除密码反馈
							{
								this.rev_remove_passwd_hardler(data_input, data_len)
							} else if (cmd == "0d") //删除指纹反馈
							{
								this.rev_remove_finger_print_hardler(data_input, data_len)
							} else if (cmd == "0f") //删除卡片反馈
							{
								this.rev_remove_card_hardler(data_input, data_len)
							} else if (cmd == "fa") //开始进入升级反馈(校验是否可以升级)
							{
								this.rev_app_update_start_hardler(data_input, data_len)
							} else if (cmd == "fb") //传输升级包信息反馈
							{
								this.rev_app_update_pkg_start_hardler(data_input, data_len)
							} else if (cmd == "fc") //开始接受升级包反馈
							{
								this.rev_app_update_pkg_data_send_hardler(data_input, data_len)
							} else if (cmd == "21") //采集器开始录入指纹反馈
							{
								this.res_collect_finger_print_hardler(data_input, data_len)
							} else if (cmd == "22") //采集器上发指纹数据反馈
							{
								this.rev_send_finger_print_hardler(data_input, data_len)
							} else if (cmd == "23") //采集器录入卡片接收反馈
							{
								this.res_collect_card_hardler(data_input, data_len)
							}
							else if (cmd == "11") //同步指纹数据到门锁
							{
								this.res_sync_finger_print_hardler(data_input, data_len)
							
							}
							else if (cmd == "12") //同步卡片数据到门锁
							{
								this.res_sync_card_hardler(data_input, data_len)
							
							}	
						}else{
							console.log("##### 长度不匹配!!!!!!! ")
						}
					} else {
						console.log("##### rev sum is not ok MD5验证不通过!!!!!!! ")
						console.log("##### rev this.update_hardler_status !!!!!!! ", this
							.update_hardler_status)

						//this.update_hardler_status = "app_pkg_data_ng"

					}

				}

			} catch (err) {
				console.log("##### rev err ", err);
			}	

		})


	}
	/**
	 * 应答码错误处理提示
	*/
	res_fail_dispose(code){
		let obj = [{
					msg:'操作失败',
					code:0x01,
				},{
					msg:'重复录入',
					code:0x02,
				},{
					msg:'硬件ID分配完',
					code:0x03,
				},{
					msg:'添加密码错误,字段为非数字',
					code:0x04,
				},{
					msg:'添加密码错误,密码长度错误',
					code:0x05,
				},{
					msg:'不支持添加的开锁方式',
					code:0x06,
				},{
					msg:'当前正在录入指纹',
					code:0x07,
				},{
					msg:'当前正在绑定门卡',
					code:0x08,
				},{
					msg:'当前正在绑定人脸',
					code:0x09,
				},{
					msg:'密码过于简单',
					code:0x0A,
				},{
					msg:'错误硬件',
					code:0x0B,
				}]
			obj.forEach(v=>{
				if(v.code ==code){
					uni.showToast({
						title:`${v.msg}`,
						icon:'none',
						duration:2000,
						mask:true
					})
				}
			})	
		
	}

	ab2hex(buffer, split = '') {
		var hexArr = Array.prototype.map.call(new Uint8Array(buffer), function(bit) {
			return ('00' + bit.toString(16)).slice(-2)
		})
		return hexArr.join(split)
	}
	/**
	 * 写入数据
	 * 微信小程序有数据大小限制,分包传输
	*/
	write(hexadecimal) {

		var buf = hex2ArrayBuffer(hexadecimal)

		return new Promise((resolve, reject) => {
			var byte_cnt = 20

			var index = Math.floor(buf.byteLength / byte_cnt)
			if (buf.byteLength % byte_cnt > 0) {
				index += 1
			}
			var i = 0
			var offset = 0

			for (i = 0; i < index; i++) {
				var buf_tmp = buf.slice(offset, offset + byte_cnt)

				offset += byte_cnt
				uni.writeBLECharacteristicValue({
					deviceId: this.deviceId,
					serviceId: this.serviceId,
					characteristicId: this.writeuuid,
					value: buf_tmp,
					success: (res) => {
						
					},
					fail: (err) => {
						console.log('write写入失败', err)
					}
				})

			}

		})
	}

	openBluetoothAdapter() {
	
		this.bluetoothState = 2
		let that = this
		uni.openBluetoothAdapter({ //打开蓝牙适配器接口
			success: (res) => { //已打开
				console.log('openBluetoothAdapter ok... ----蓝牙已打开')
				this.dev_crc16 = calculateCRC16Modbus(strToHexCharCode(this.deviceNum)).padStart(4, 0)
					.toUpperCase()
				// 获取已搜索到的蓝牙设备
				
				uni.getBluetoothDevices({
				  success:(res) => {
				    console.log('11111111获取之前搜索到的蓝牙设备',res)
					let flag = true
					res.devices.forEach(item=>{
						if (item["localName"] == "Lenovo_E5B") {
							console.log('onBluetoothDeviceFound监听搜索到新设备的事件', item)
							let bt_info = item
							let ad_info = item["advertisData"]
							let ad_info_i8 = new Uint8Array(ad_info)
							let ad = ad_info_i8[0].toString(16).padStart(2, 0).toUpperCase() + ad_info_i8[1].toString(
								16).padStart(2, 0).toUpperCase()
							console.log('******** ad3 ',ad_info,ad_info_i8, ad)
							bt_info.bt_mac = ad
							console.log('bt_info...', bt_info, this.deviceNum, this.dev_crc16)
							//当蓝牙的广播数据与设备号的crc16相同时认为是所搜索到的设备				
							if (bt_info.bt_mac == this.dev_crc16) {
								
								console.log('******** 开始连接 ')
								this.bt_info = bt_info
								flag = false
								this.deviceId = this.bt_info.deviceId
								this.createBLEConnection()
							}
						} 
						// 采集器蓝牙   deviceNum为空时
						 if (this.deviceNum =='' && res.devices[0]["localName"] == "E5B_HARVESTER") {
						
							this.bt_info = item
							flag = false
							this.deviceId = this.bt_info.deviceId
							this.createBLEConnection()
						}
					})
					
					if(flag)this.startBluetoothDeviceDiscovery()	
				  },fail:(err)=> {
				  	console.log('getBluetoothDevices获取搜索过的设备失败',err)
					this.startBluetoothDeviceDiscovery()	
				  }
				})
		
			},
			fail: err => { //未打开 
				this.bluetoothState = 0
				console.log('打开蓝牙适配器err', err)
				if (err.errMsg === 'openBluetoothAdapter:fail auth deny') {
					uni.showModal({
						title: '温馨提示',
						content: `获取蓝牙权限失败,是否进入设置页开启您的权限?`,
						confirmText: '开启授权',
						success: (showModalRes) => {
							if (showModalRes.confirm) {
								uni.openSetting({
									success: (openSettingRes) => {
										this.openBluetoothAdapter()
										// if (openSettingRes.authSetting['scope.bluetooth']) {
											
										// }
									}
								});
							}
						}
					})
				} else if (err.errCode == 10001) {
					uni.showToast({
						icon: 'none',
						title: '请查看手机蓝牙是否打开',
						duration:2000
					});
				} else {
					uni.showToast({
						icon: 'none',
						title: `蓝牙打开失败,${err.errMsg}`

					});
				}
			}

		})
	}
	closeBluetoothAdapter() {
		uni.closeBluetoothAdapter({
			success(res) {
				console.log(res)
			}
		})
	}

	/**
	 * 卸载本机蓝牙的事件
	 */
	unloadBluetooth() {
		uni.closeBluetoothAdapter();
	}
	/**
	 * 断开与低功耗蓝牙设备的连接
	 */
	closeBLEConnection(){
		store.commit('setBluetoothState',0)
		uni.closeBLEConnection({
			deviceId:this.deviceId,
			success(res) {
				console.log(res)
			}
		})
	}
	
	/**
	 * 监听蓝牙适配器状态变化事件
	 * @param {function} cb 处理状态变化的函数
	 */
	onBluetoothStateChange(cb) {
		uni.onBluetoothAdapterStateChange(res => {
			const {
				available,
				discovering
			} = res;
			  console.log('onBluetoothAdapterStateChange 监听蓝牙适配器状态变化事件',res)
			// this.updateBluetoothState(res); // 更新蓝牙适配器状态
			if (res.available && !res.discovering && !initSuccess) {
			      console.log('deviceManage 手机蓝牙打开')
			  }
			    
			  // 适配器关闭
			  if (!res.available) {
			    console.log('deviceManage 手机蓝牙关闭')
			    initSuccess = false
				
				this.bluetoothState = 0
				// this.unloadBluetooth();
			  }  
			  
			  // 适配器打开并且处于搜索状态
			  if (res.available && res.discovering) {
			    console.log('deviceManage 处于搜索状态')
			  }
			    
			  // 适配器打开并且处于停止搜索状态
			  if (!res.discovering && initSuccess) {
			     console.log('deviceManage 停止搜索状态')   
			  }
		})
	}
	/**
	 * 监听低功耗蓝牙连接状态的改变事件。
	 * 包括开发者主动连接或断开连接,设备丢失,连接异常断开等等
	 * 重连
	 */
	onBLEConnectionStateChange() {
		uni.onBLEConnectionStateChange((res) => {
			console.log('连接状态变更', res)
			// 该方法回调中可以用于处理连接意外断开等异常情况
			if (!res.connected) {
				this.bluetoothState = 0
				store.commit('setBluetoothState',0)
				uni.showToast({
					title: '蓝牙已断开',
					icon: 'none',
					mask:true,
					duration:2000
				})
				// uni.showModal({
				// 	title: "蓝牙连接断开",
				// 	content: "是否重连",
				// 	success: (e) => {
				// 		if (e.confirm) this.reconnectBlue()
				// 	}
				// })
				
			}
		})


	}
	/**
	 * 蓝牙重连
	*/
	reconnectBlue() {
		this.closeBLEConnection()
		this.bluetoothState = 2
		
		if(!this.deviceId){
			this.bt_open_start()
		}else {
			uni.showLoading({
				title: '连接中,请稍等...',
				mask: true,
			});
			uni.createBLEConnection({
				deviceId: this.deviceId,
				success:()=> {
					this.bluetoothState = 1
					store.commit('setBluetoothState',1)
					uni.hideLoading()
					uni.showToast({
						title: this.bt_info.name + "蓝牙连接成功!",
						icon: "none",
					});
					this.getBLEDeviceServices(); // 获取蓝牙的服务
					console.log("蓝牙重连成功!")
				},
				fail:(err)=> {
					console.log("蓝牙重连失败",err)
					uni.hideLoading()
					// uni.showToast({
					// 	title: this.bt_info.name + "蓝牙连接成功!",
					// 	icon: "none",
					// });
					this.bluetoothState = 0
					store.commit('setBluetoothState',0)
				}
				})
			}
		}	



	}

var APP_BT_TASK
var APP_BT_TASK_LIST
var APP_BT_TASK_LIST_MAP
export function unloadBluetooth() {
	console.log('1111closeBluetoothAdapter')
		uni.closeBluetoothAdapter();
	}
export function create_bt_task(id) {
	if (APP_BT_TASK_LIST_MAP) {

	} else {
		APP_BT_TASK_LIST_MAP = new Map();
	}

	if (false == APP_BT_TASK_LIST_MAP.has(id)) {
		console.log("*********** new BtTask @@@@@@@");
		var bt = new BtTask(id)
		APP_BT_TASK_LIST_MAP.set(id, bt)

		return APP_BT_TASK_LIST_MAP.get(id)
	} else {
		console.log("*********** seek BtTask @@@@@@@");
		return APP_BT_TASK_LIST_MAP.get(id)
	}
}

export function get_bt_task(id) {
	if (true == APP_BT_TASK_LIST_MAP.has(id)) {
		return APP_BT_TASK_LIST_MAP.get(id)
	} else {
		return false
	}
}

export function stop_all_bt_task() {
	if (APP_BT_TASK_LIST_MAP) {
		APP_BT_TASK_LIST_MAP.forEach((item, key) => {
			console.log("##########key ", key)

			console.log("stop_all_bt_task item ", item)

			item && item.clear_task()

		})

	}
}
  • 25
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑一个吧*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值