From b114f6690d22c7d8bee2f764b21e7eb9af90372d Mon Sep 17 00:00:00 2001 From: liub Date: Fri, 17 Oct 2025 11:52:26 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E7=89=99=E6=B7=BB=E5=8A=A0=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E3=80=81=E6=96=AD=E5=BC=80=E3=80=81=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E3=80=81=E4=B8=8D=E5=8F=AF=E7=94=A8=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 31 +- pages.json | 7 + pages/6155/deviceDetail.vue | 145 ++- pages/6331/BJQ6331.vue | 2048 ++++++++++++++++++++++++++++++ pages/650/HBY650.vue | 123 +- pages/670/HBY670.vue | 169 ++- pages/7305/BJQ7305.vue | 263 ++-- pages/common/addBLE/LinkBle.vue | 170 ++- pages/common/addBLE/addEquip.vue | 200 ++- pages/common/index/index.vue | 2 +- pages/common/login/index.vue | 3 +- pages/common/user/index.vue | 2 +- utils/BleHelper.js | 268 ++-- 13 files changed, 3024 insertions(+), 407 deletions(-) create mode 100644 pages/6331/BJQ6331.vue diff --git a/App.vue b/App.vue index 5a675da..be0e858 100644 --- a/App.vue +++ b/App.vue @@ -29,17 +29,23 @@ // uni.clearStorageSync(); //以上代码仅在开发时使用,否则会出现不可预知的问题。 - uni.getSystemInfo({success:function(res){ - if(res.uniPlatform=='app'){ - bleTool.getBleTool(); - upgrade.checkAndUpdateWgt(); - - } - }}); + }, onShow: function() { console.log('App Show'); - + //将检查更新换到onshow,因为苹果用户喜欢一直挂着 + uni.getSystemInfo({success:function(res){ + if(res.uniPlatform=='app'){ + let appid=plus.runtime.appid; + if(appid!=='HBuilder'){ + console.log("appid=",appid); + bleTool.getBleTool(); + upgrade.checkAndUpdateWgt(); + } + + + } + }}); }, onHide: function() { console.log('App Hide'); @@ -92,6 +98,15 @@ background: rgba(42, 42, 42, 1); } + .green{ + color: #BBE600 !important; + } + + .red{ + color:#E03434 !important; + } + + @font-face { font-family: "PingFang SC"; src: url("~@/static/fonts/PingFangSC.ttf") format("opentype"); diff --git a/pages.json b/pages.json index 75d84ba..8cd7fc6 100644 --- a/pages.json +++ b/pages.json @@ -250,6 +250,13 @@ "style": { "navigationBarTitleText": "BJQ7305" } + }, + { + "path" : "pages/6331/BJQ6331", + "style" : + { + "navigationBarTitleText" : "BJQ6331" + } } diff --git a/pages/6155/deviceDetail.vue b/pages/6155/deviceDetail.vue index 7c50afe..4f4fcff 100644 --- a/pages/6155/deviceDetail.vue +++ b/pages/6155/deviceDetail.vue @@ -34,6 +34,10 @@ 充电状态 {{formData.statu}} + + 蓝牙状态 + {{formData.bleStatu?'已连接':'未连接'}} + @@ -124,8 +128,8 @@ :borderColor="Status.Pop.borderColor" :textColor="Status.Pop.textColor" :buttonBgColor="Status.Pop.buttonBgColor" :buttonTextColor="Status.Pop.buttonTextColor" :iconUrl="Status.Pop.iconUrl" :message="Status.Pop.message" :buttonText="Status.Pop.buttonText" - @buttonClick="HidePop" @closePop="closePop" :visiblePrompt="Status.Pop.visiblePrompt" :promptTitle="Status.Pop.promptTitle" - v-model="Status.Pop.modelValue" /> + @buttonClick="HidePop" @closePop="closePop" :visiblePrompt="Status.Pop.visiblePrompt" + :promptTitle="Status.Pop.promptTitle" v-model="Status.Pop.modelValue" /> { + these.formData.bleStatu = true; + }); these.setBleFormData(); these.getDetail(); @@ -355,7 +368,10 @@ }, onHide: function() { - + this.Status.pageHide = true; + }, + onShow() { + this.Status.pageHide = false; }, onBackPress(e) { @@ -410,13 +426,83 @@ } }, methods: { - previewImg(img){ - if(!img){ + deviceRecovry(res) { + if (this.Status.pageHide) { return; } - + if (res.deviceId == these.formData.deviceId) { + this.formData.bleStatu = true; + setTimeout(() => { + hideLoading(these, 1000); + }); + uni.showToast({ + icon: 'success', + title: '蓝牙连接成功' + }); + } + + }, + deviceDispose(res) { + if (this.Status.pageHide) { + return; + } + if (res.deviceId == these.formData.deviceId) { + this.formData.bleStatu = false; + setTimeout(() => { + hideLoading(these, 1000); + }); + uni.showToast({ + icon: 'fail', + title: '蓝牙连接已断开' + }); + } + + }, + bleStateBreak() { + if (this.Status.pageHide) { + return; + } + //蓝牙适配器不可用 + this.formData.bleStatu = false; + uni.showToast({ + icon: 'fail', + title: '蓝牙已不可用' + }) + hideLoading(this); + }, + bleStateRecovry() { + console.log("蓝牙可用"); + if (this.Status.pageHide) { + return; + } + console.log("蓝牙可用"); + //蓝牙适配器再次可用,尝试恢复连接 + showLoading(this, { + text: "蓝牙恢复可用,正在连接设备" + }); + ble.LinkBlue(these.formData.deviceId).then(() => { + these.formData.bleStatu = true; + updateLoading(these, { + text: '连接成功' + }); + }).catch(ex => { + updateLoading(these, { + text: ex.msg + }) + }).finally(() => { + setTimeout(() => { + hideLoading(these); + }, 1000); + + }); + }, + previewImg(img) { + if (!img) { + return; + } + uni.previewImage({ - urls:[img] + urls: [img] }) }, getDevice: function() { @@ -429,18 +515,20 @@ return f; }, bleValueNotify: function(receive, device, path) { - - let json = recei.ReceiveData(receive, device, path); - if(!json){ + if (this.Status.pageHide) { return; } - let keys=Object.keys(json); - keys.forEach((key)=>{ - if(key in these.formData){ - these.formData[key] = json[key]; - } + let json = recei.ReceiveData(receive, device, path); + if (!json) { + return; + } + let keys = Object.keys(json); + keys.forEach((key) => { + if (key in these.formData) { + these.formData[key] = json[key]; + } }); - + if (this.formData.battary <= 20) { this.showPop({ message: "设备电量低", @@ -490,6 +578,7 @@ events: { BindOver: function(data) { console.log(data) + these.formData.bleStatu = true; } }, success: function(res) { @@ -921,12 +1010,12 @@ }, closePop: function() { - this.Status.Pop.showPop = false; - - if (this.Status.Pop.cancelCallback) { - this.Status.Pop.cancelCallback(); - } - }, + this.Status.Pop.showPop = false; + + if (this.Status.Pop.cancelCallback) { + this.Status.Pop.cancelCallback(); + } + }, HidePop: function() { // console.log("1111"); if (this.Status.Pop.clickEvt == 'SendUsr') { diff --git a/pages/6331/BJQ6331.vue b/pages/6331/BJQ6331.vue new file mode 100644 index 0000000..5df12b7 --- /dev/null +++ b/pages/6331/BJQ6331.vue @@ -0,0 +1,2048 @@ + + + + + \ No newline at end of file diff --git a/pages/650/HBY650.vue b/pages/650/HBY650.vue index 0ca6149..54d52e7 100644 --- a/pages/650/HBY650.vue +++ b/pages/650/HBY650.vue @@ -30,6 +30,10 @@ 设备名称 {{formData.deviceName}} + + 蓝牙状态 + {{formData.bleStatu?'已连接':'未连接'}} + 预警级别 {{formData.warnLevel}} @@ -180,6 +184,7 @@ import usrApi from '@/api/670/HBY670.js' const pagePath = "pages/650/HBY650"; + var ble = null; var these = null; var recei = null; @@ -263,7 +268,8 @@ name: '', job: '', id: '', - iswarn: false + iswarn: false, + bleStatu: false }, rgb565Data: [], videoHexArray: [], @@ -291,14 +297,21 @@ onUnload() { console.log("页面卸载,释放资源"); - ble.removeReceiveCallback(pagePath); + ble.removeAllCallback(pagePath); }, onLoad: function() { these = this; recei = BleReceive.getBleReceive(); ble = BleTool.getBleTool(); - console.log("650") - ble.addReceiveCallback(these.bleValueNotify); + + + ble.addReceiveCallback(these.bleValueNotify, pagePath); + ble.addStateBreakCallback(these.bleStateBreak, pagePath); + ble.addStateRecoveryCallback(these.bleStateRecovry, pagePath); + ble.addDisposeCallback(these.deviceDispose, pagePath); + ble.addRecoveryCallback(these.deviceRecovry, pagePath); + + let eventChannel = this.getOpenerEventChannel(); eventChannel.on('detailData', function(data) { @@ -332,9 +345,11 @@ these.formData.blename = f.name ? f.name : "Unname"; these.formData.deviceName = device.deviceName; these.formData.img = device.devicePic; - these.formData.id = device.id; + these.formData.deviceId = f.deviceId; - ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId); + ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res=>{ + these.formData.bleStatu=true; + }); these.setBleFormData(); these.getDetail(); @@ -343,10 +358,10 @@ }, onHide: function() { - + this.Status.pageHide = true; }, - onBackPress(e) { - ble.removeReceiveCallback(pagePath); + onShow() { + this.Status.pageHide = false; }, computed: { RSSIRemark: function() { @@ -367,13 +382,83 @@ } }, methods: { - previewImg(img){ - if(!img){ + deviceRecovry(res) { + if (this.Status.pageHide) { return; } - + if (res.deviceId == these.formData.deviceId) { + this.formData.bleStatu = true; + setTimeout(() => { + hideLoading(these, 1000); + }); + uni.showToast({ + icon: 'success', + title: '蓝牙连接成功' + }); + } + + }, + deviceDispose(res) { + if (this.Status.pageHide) { + return; + } + if (res.deviceId == these.formData.deviceId) { + this.formData.bleStatu = false; + setTimeout(() => { + hideLoading(these, 1000); + }); + uni.showToast({ + icon: 'fail', + title: '蓝牙连接已断开' + }); + } + + }, + bleStateBreak() { + if (this.Status.pageHide) { + return; + } + //蓝牙适配器不可用 + this.formData.bleStatu = false; + uni.showToast({ + icon: 'fail', + title: '蓝牙已不可用' + }) + hideLoading(this); + }, + bleStateRecovry() { + console.log("蓝牙可用"); + if (this.Status.pageHide) { + return; + } + console.log("蓝牙可用"); + //蓝牙适配器再次可用,尝试恢复连接 + showLoading(this, { + text: "蓝牙恢复可用,正在连接设备" + }); + ble.LinkBlue(these.formData.deviceId).then(() => { + these.formData.bleStatu = true; + updateLoading(these, { + text: '连接成功' + }); + }).catch(ex => { + updateLoading(these, { + text: ex.msg + }) + }).finally(() => { + setTimeout(() => { + hideLoading(these); + }, 1000); + + }); + }, + previewImg(img) { + if (!img) { + return; + } + uni.previewImage({ - urls:[img] + urls: [img] }) }, getWarnStyle(index) { @@ -474,7 +559,7 @@ getDetail() { var that = this; usrApi.getDetail(this.device.id).then(res => { - +console.log("res=",res); if (res && res.code == 200) { res = res.data; let personnelInfo = res.personnelInfo; @@ -599,9 +684,9 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', - buttonTextColor:'#FFFFFFde', + buttonTextColor: '#FFFFFFde', okCallback: function() { - + uni.navigateTo({ url: "/pages/common/addBLE/addEquip", events: { @@ -630,7 +715,7 @@ proParam: function() { uni.navigateTo({ - url: '/pages/common/productDes/index?id=' + this.formData.id, + url: '/pages/common/productDes/index?id=' + this.device.id, success(ev) { } @@ -638,7 +723,7 @@ }, handRemark: function() { uni.navigateTo({ - url: '/pages/common/operatingInstruct/index?id=' + this.formData.id, + url: '/pages/common/operatingInstruct/index?id=' + this.device.id, success(ev) { } @@ -646,7 +731,7 @@ }, handVideo: function() { uni.navigateTo({ - url: '/pages/common/operationVideo/index?id=' + this.formData.id, + url: '/pages/common/operationVideo/index?id=' + this.device.id, success(ev) { } diff --git a/pages/670/HBY670.vue b/pages/670/HBY670.vue index 27c9d75..cdcd8c1 100644 --- a/pages/670/HBY670.vue +++ b/pages/670/HBY670.vue @@ -33,10 +33,15 @@ 设备名称 {{device.deviceName}} + + 蓝牙状态 + {{formData.bleStatu?'已连接':'未连接'}} + 设备状态 {{formData.sta_system}} + 定位信息 @@ -293,6 +298,7 @@ data() { return { Status: { + pageHide: false, apiType: "listA", navbar: { icons: [{ @@ -369,7 +375,7 @@ showClose: false }, usrToggle: true, - bleLinkCnt:0 + bleLinkCnt: 0 }, formData: { battary: "", //电量 @@ -391,7 +397,8 @@ staticWarn: false, //静止报警 fourGStrenth: 0, //4G信号强度 deviceId: "", - sta_system: "" //设备状态,0关机,1仅充电,2开机未充电,3,开机且充电 + sta_system: "", //设备状态,0关机,1仅充电,2开机未充电,3,开机且充电 + bleStatu: false }, device: { id: "", @@ -446,7 +453,7 @@ onUnload() { console.log("页面卸载,释放资源"); let statusTopic = `A/${this.formData.imei?this.formData.imei:this.device.deviceImei}`; - ble.removeReceiveCallback(pagePath); + ble.removeAllCallback(pagePath); if (mqttClient) { mqttClient.unsubscribe(statusTopic); mqttClient.disconnect(); @@ -460,8 +467,14 @@ these = this; recei = BleReceive.getBleReceive(); ble = BleTool.getBleTool(); - console.log("670") - ble.addReceiveCallback(these.bleValueNotify); + + + ble.addReceiveCallback(these.bleValueNotify, pagePath); + ble.addStateBreakCallback(these.bleStateBreak, pagePath); + ble.addStateRecoveryCallback(these.bleStateRecovry, pagePath); + ble.addDisposeCallback(these.deviceDispose, pagePath); + ble.addRecoveryCallback(these.deviceRecovry, pagePath); + let eventChannel = this.getOpenerEventChannel(); eventChannel.on('detailData', function(data) { @@ -510,12 +523,17 @@ these.formData['imei'] = these.device.deviceImei; } these.getDetail(); - ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId); + ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { + these.formData.bleStatu = true; + }); }); }, + onShow() { + this.Status.pageHide=false; + }, onHide: function() { - + this.Status.pageHide=true; }, onBackPress(e) { ble.removeReceiveCallback(pagePath); @@ -524,22 +542,92 @@ }, methods: { - previewImg(img){ - if(!img){ + deviceRecovry(res) { + if (this.Status.pageHide) { return; } - + if (res.deviceId == these.formData.deviceId) { + this.formData.bleStatu = true; + setTimeout(() => { + hideLoading(these, 1000); + }); + uni.showToast({ + icon: 'success', + title: '蓝牙连接成功' + }); + } + + }, + deviceDispose(res) { + if (this.Status.pageHide) { + return; + } + if (res.deviceId == these.formData.deviceId) { + this.formData.bleStatu = false; + setTimeout(() => { + hideLoading(these, 1000); + }); + uni.showToast({ + icon: 'fail', + title: '蓝牙连接已断开' + }); + } + + }, + bleStateBreak() { + if (this.Status.pageHide) { + return; + } + //蓝牙适配器不可用 + this.formData.bleStatu = false; + uni.showToast({ + icon: 'fail', + title: '蓝牙已不可用' + }) + hideLoading(this); + }, + bleStateRecovry() { + console.log("蓝牙可用"); + if (this.Status.pageHide) { + return; + } + console.log("蓝牙可用"); + //蓝牙适配器再次可用,尝试恢复连接 + showLoading(this, { + text: "蓝牙恢复可用,正在连接设备" + }); + ble.LinkBlue(these.formData.deviceId).then(() => { + these.formData.bleStatu = true; + updateLoading(these, { + text: '连接成功' + }); + }).catch(ex => { + updateLoading(these, { + text: ex.msg + }) + }).finally(() => { + setTimeout(() => { + hideLoading(these); + }, 1000); + + }); + }, + previewImg(img) { + if (!img) { + return; + } + uni.previewImage({ - urls:[img] + urls: [img] }) }, showBleUnConnect() { this.Status.bleLinkCnt++; - if(this.Status.bleLinkCnt>3){ + if (this.Status.bleLinkCnt > 3) { return; } this.showPop({ - message: "蓝牙未连接过该设备,请使用蓝牙重新添加该设备", + message: "蓝牙未连接过该设备,请使用蓝牙重新添加该设备,取消"+(4-this.Status.bleLinkCnt)+"次后不再提醒", iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", borderColor: "#e034344d", buttonBgColor: "#E03434", @@ -571,7 +659,7 @@ }); }, gotoMap() { - let lnglat=lnglatConvert.wgs84_to_gcj02(this.formData.Lon,this.formData.Lat); + let lnglat = lnglatConvert.wgs84_to_gcj02(this.formData.Lon, this.formData.Lat); this.detailData.longitude = lnglat[0]; this.detailData.latitude = lnglat[1]; uni.navigateTo({ @@ -1175,6 +1263,7 @@ } if (this.formData.SOS == type) { + console.log("111111"); type = "close"; } @@ -1210,26 +1299,28 @@ message.deviceImei = these.device.deviceImei; let requestSend = (callback) => { - + debugger; message.isBluetooth = false; api.sendSos(message).then((res) => { console.log("res=>", res); if (res && res.code == 200) { console.log("接口发送SOS指令成功"); + if (callback) { + callback(); + } + return Promise.resolve({ code: 200, msg: '操作成功' }); - if(callback){ - callback(); - } + } else { return this.sendMQ(json); } }).then((res) => { console.log("res=", res); - if(callback){ + if (callback) { callback(); } }).catch((ex) => { @@ -1262,15 +1353,15 @@ dataView.setUint8(3, 0x00); // 数据长度 dataView.setUint8(4, 0x01); // 数据长度 dataView.setUint8(5, dic.ble[type]); // 数据 - + console.log("type=", type); ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10).then( () => { console.log("蓝牙发送成功了"); hideLoading(these); these.setBleFormData(); message.isBluetooth = true; - api.sendSos(message); - if(callback){ + // api.sendSos(message); + if (callback) { callback(); } }).catch((ex) => { @@ -1286,41 +1377,45 @@ } let OpenSOS = () => { - let execSos=()=>{ + let execSos = () => { these.formData.qzwarn = true; //标记为强制报警了 - + these.Status.staticWarn.time = 180; this.formData.SOS = type; - + let loopFunc = () => { if (these.Status.staticWarn.inteval === null) { return; } if (these.Status.staticWarn.time === 0) { - - + + clearInterval(these.Status.staticWarn.inteval); these.Status.staticWarn.inteval = null; these.formData.qzwarn = false; + + if(this.Status.Pop.okCallback){ + these.CloseWarn(false); these.formData.SOS = 'close'; - these.CloseWarn(false); + } + return; } these.Status.staticWarn.time = these.Status.staticWarn .time - 1; - + if (these.Status.Pop.clickEvt == 'time' && this.Status.Pop.showPop) { console.log("111111"); this.showQzWarn(this.Status.Pop.okCallback); } - - + + } these.Status.staticWarn.inteval = setInterval(() => { loopFunc(); }, 1000); } - + bleSendCmd(execSos); } @@ -1329,14 +1424,16 @@ if (type == 'rb') { //红蓝报警 console.log("11111"); let sendRb = () => { + this.formData.SOS = type; bleSendCmd(); these.formData.qzwarn = false; this.Status.staticWarn.time = 0; return; } - if (these.formData.qzwarn && these.Status.staticWarn.inteval) { + if (these.formData.qzwarn && these.Status.staticWarn.inteval && these.Status.staticWarn.time) { console.log("222222"); + this.Status.Pop.okCallback=null; these.showQzWarn(sendRb); } else { sendRb(); @@ -2121,8 +2218,8 @@ } let requestSend = () => { - - + + let json = { deviceId: this.device.id, deviceImei: this.device.deviceImei ? this.device.deviceImei : this.formData.imei, @@ -2283,7 +2380,7 @@ setTimeout(sendNextPacket, 200); }).catch(err => { if (err.code == '10007') { - setTimeout(sendNextPacket,200); + setTimeout(sendNextPacket, 200); } else { requestSend(); } diff --git a/pages/7305/BJQ7305.vue b/pages/7305/BJQ7305.vue index 213c4bc..0b8f6c6 100644 --- a/pages/7305/BJQ7305.vue +++ b/pages/7305/BJQ7305.vue @@ -34,6 +34,10 @@ 充电状态 {{formData.statu}} + + 蓝牙状态 + {{formData.bleStatu?'已连接':'未连接'}} + @@ -158,7 +162,7 @@ var these = null; var BrighInteval = null; var recei = null; - + var pagePath = "pages/7305/BJQ7305"; export default { components: { textToDotMatrix @@ -166,6 +170,7 @@ data() { return { Status: { + pageHide: false, Pop: { showPop: false, //是否显示弹窗 popType: 'custom', @@ -232,7 +237,8 @@ id: '', deviceId: '', textLines: ['', '', ''], - mode: '' + mode: '', + bleStatu: '' }, inteval: 200, device: { @@ -258,59 +264,18 @@ } }, onUnload() { - ble.removeReceiveCallback(this); + ble.removeAllCallback(pagePath); }, onLoad: function() { these = this; recei = BleReceive.getBleReceive(); ble = bleTool.getBleTool(); - // let bleName = 'FB_Site_UART'; //JQZM-EF4651 FB_Site_UART - - // let f = ble.data.LinkedList.find((v) => { - // if (v.name == bleName) { - // console.log("找到设备了", v); - // these.formData.deviceId = v.deviceId; - // return true; - // } - // return false; - // }); - - // let link = () => { - // if (bleName == 'FB_Site_UART') { - // ble.LinkBlue(f.deviceId, '0000AE30-0000-1000-8000-00805F9B34FB', - // '0000AE03-0000-1000-8000-00805F9B34FB', '0000AE02-0000-1000-8000-00805F9B34FB'); - // } else { - // ble.LinkBlue(f.deviceId, '0000FFE0-0000-1000-8000-00805F9B34FB', - // '0000FFE1-0000-1000-8000-00805F9B34FB', '0000FFE2-0000-1000-8000-00805F9B34FB'); - // } - - // } - // if (!f) { - - - // ble.addDeviceFound((res) => { - // // console.log("发现新设备", res); - // f = res.devices.find((v) => { - // return v.name == bleName; - // }); - // if (f) { - - // console.log("找到目标设备了", f); - // these.formData.deviceId = f.deviceId; - - // link(); - - // ble.StopSearch(); - // } - // }); - - // ble.StartSearch(); - // } else { - // link(); - // } - console.log("6155"); - ble.addReceiveCallback(these.bleValueNotify); + ble.addReceiveCallback(these.bleValueNotify, pagePath); + ble.addStateBreakCallback(these.bleStateBreak, pagePath); + ble.addStateRecoveryCallback(these.bleStateRecovry,pagePath); + ble.addDisposeCallback(these.deviceDispose,pagePath); + ble.addRecoveryCallback(these.deviceRecovry,pagePath); let eventChannel = this.getOpenerEventChannel(); eventChannel.on('detailData', function(data) { @@ -346,7 +311,10 @@ these.formData.img = device.devicePic; these.formData.id = device.id; these.formData.deviceId = f.deviceId; - ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId); + ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res=>{ + console.log("连接成功") + these.formData.bleStatu=true; + }); these.setBleFormData(); these.getDetail(); @@ -355,12 +323,11 @@ }, onHide: function() { - + this.Status.pageHide = true; + console.log("页面隐藏"); }, - onBackPress(e) { - - ble.removeReceiveCallback(); - + onShow: function() { + this.Status.pageHide = false; }, computed: { RSSIRemark: function() { @@ -410,6 +377,76 @@ } }, methods: { + deviceRecovry(res){ + if(this.Status.pageHide){ + return; + } + if(res.deviceId==these.formData.deviceId){ + this.formData.bleStatu=true; + setTimeout(()=>{ + hideLoading(these,1000); + }); + uni.showToast({ + icon:'success', + title:'蓝牙连接成功' + }); + } + + }, + deviceDispose(res){ + if(this.Status.pageHide){ + return; + } + if(res.deviceId==these.formData.deviceId){ + this.formData.bleStatu=false; + setTimeout(()=>{ + hideLoading(these,1000); + }); + uni.showToast({ + icon:'fail', + title:'蓝牙连接已断开' + }); + } + + }, + bleStateBreak() { + if(this.Status.pageHide){ + return; + } + //蓝牙适配器不可用 + this.formData.bleStatu = false; + uni.showToast({ + icon: 'fail', + title: '蓝牙已不可用' + }) + hideLoading(this); + }, + bleStateRecovry() { + console.log("蓝牙可用"); + if(this.Status.pageHide){ + return; + } + console.log("蓝牙可用"); + //蓝牙适配器再次可用,尝试恢复连接 + showLoading(this, { + text: "蓝牙恢复可用,正在连接设备" + }); + ble.LinkBlue(these.formData.deviceId).then(() => { + these.formData.bleStatu = true; + updateLoading(these,{ + text:'连接成功' + }); + }).catch(ex => { + updateLoading(these, { + text: ex.msg + }) + }).finally(() => { + setTimeout(() => { + hideLoading(these); + }, 1000); + + }); + }, previewImg(img) { if (!img) { return; @@ -429,19 +466,21 @@ return f; }, bleValueNotify: function(receive, device, path) { - - let json = recei.ReceiveData(receive, device, path); - if(!json){ + if (this.Status.pageHide) { return; } - let keys=Object.keys(json); - keys.forEach((key)=>{ - if(key in these.formData){ - these.formData[key] = json[key]; - } + let json = recei.ReceiveData(receive, device, path); + if (!json) { + return; + } + let keys = Object.keys(json); + keys.forEach((key) => { + if (key in these.formData) { + these.formData[key] = json[key]; + } }); - - if (this.formData.battary <= 20) { + + if ('battary' in json && this.formData.battary <= 20) { this.showPop({ message: "设备电量低", iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", @@ -491,6 +530,7 @@ events: { BindOver: function(data) { console.log(data) + these.formData.bleStatu=true; } }, success: function(res) { @@ -521,37 +561,37 @@ // 分包发送图片数据 var sendImagePackets = function(packetData) { return new Promise((resolve, reject) => { - + // 总数据包数 const totalPackets = 3; let currentPacket = 1; - - - + + + // 发送单个数据包 const sendNextPacket = () => { if (currentPacket > totalPackets) { setTimeout(() => { hideLoading(these); these.Status.BottomMenu.show = false; - + these.showPop({ message: "上传成功", iconUrl: "/static/images/6155/DeviceDetail/uploadSuccess.png", borderColor: '#BBE600', buttonBgColor: '#BBE600' }); - + resolve(); }, 0) - + return; } - - - + + + let start = 0; - let bufferSize = 343; //总共1029字节3包,正好每包343字节 + let bufferSize = 343; //总共1029字节3包,正好每包343字节 //FA 09 04 00 1024字节 FF var buffer = new ArrayBuffer(bufferSize); var dataView = new DataView(buffer); @@ -560,37 +600,37 @@ dataView.setUint8(1, 0x09); // 帧头 dataView.setUint8(2, 0x04); // 帧头 dataView.setUint8(3, 0x00); // 帧头 - - + + for (let i = 0; i < packetData.length; i++) { - dataView.setUint8(4 + i, parseInt(packetData[i],16)); + dataView.setUint8(4 + i, parseInt(packetData[i], 16)); } } - if (currentPacket == totalPackets) { + if (currentPacket == totalPackets) { dataView.setUint8(bufferSize - 1, 0xFF); } - + //发送数据包 ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30) .then(() => { - - + + updateLoading(these, { - text: "正在发送" + currentPacket + "/"+totalPackets - + text: "正在发送" + currentPacket + "/" + totalPackets + }) currentPacket++; - + setTimeout(sendNextPacket, 100); }).catch(err => { if (err.code == 10007) { setTimeout(sendNextPacket, 100); return; } - + console.log("发送数据包失败了", err); - + these.Status.BottomMenu.show = false; these.showPop({ message: "发送数据包失败了" + err.msg, @@ -598,14 +638,14 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", }); - + hideLoading(these); reject(err); }); } // 开始发送数据 sendNextPacket(); - + }); } @@ -620,7 +660,7 @@ url: "/pages/6155/ImgCrop", events: { ImgCutOver: function(data) { - + //将8位的二进制数组转换成16进制数据 let binaryToHex = (binaryArray) => { if (!Array.isArray(binaryArray) || binaryArray .length !== 8) { @@ -652,19 +692,14 @@ let imageData = data.piexls; let arr = []; - for (let x = 0; x < imageData.length; x += 4) { - let R = imageData[x]; - let G = imageData[x + 1]; - let B = imageData[x + 2]; - let A = imageData[x + 3]; - if (A < 128) { - arr.push(0); - continue; - } + for (let currIndex = 0; currIndex < imageData + .length; currIndex += 4) { + let R = imageData[currIndex]; + let G = imageData[currIndex + 1]; + let B = imageData[currIndex + 2]; + let A = imageData[currIndex + 3]; let grayVal = Math.floor(R * 0.299 + G * 0.587 + B * 0.114); - // console.log("RGBA", R + "," + G + "," + B + "," + A + - // ',' + grayVal); arr.push(grayVal < 128 ? 1 : 0); } @@ -732,6 +767,8 @@ sendImagePackets(matrix).catch(( ex) => { console.log("出现异常", ex); + hideLoading(these); + }); }, 0) @@ -741,7 +778,8 @@ ev.eventChannel.emit('checkImg', { data: res.tempFiles[0].path, width: 64, - height: 32 + height: 32, + times: 10 }) }, fail(ex) { @@ -1199,7 +1237,14 @@ if (f) { // 发送数据 - ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100); + ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100).catch(ex=>{ + these.showPop({ + message: "发送失败," + ex.msg, + iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", + borderColor: "#e034344d", + buttonBgColor: "#E03434", + }); + }); } @@ -1241,7 +1286,14 @@ if (f) { // 发送数据 - ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100); + ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100).catch(ex=>{ + these.showPop({ + message: "发送失败," + ex.msg, + iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", + borderColor: "#e034344d", + buttonBgColor: "#E03434", + }); + }); } @@ -1429,6 +1481,7 @@ letter-spacing: 0.07px; text-align: left; } + .lamp { margin-top: 24rpx; diff --git a/pages/common/addBLE/LinkBle.vue b/pages/common/addBLE/LinkBle.vue index 81bbddc..36da350 100644 --- a/pages/common/addBLE/LinkBle.vue +++ b/pages/common/addBLE/LinkBle.vue @@ -46,14 +46,14 @@ var these = null; var eventChannel = null; var ble = null; - + export default { data() { return { Statu: { bound: null, - timeInteval:null, - isSearch:false + timeInteval: null, + isSearch: false }, device: { "deviceId": "", @@ -64,12 +64,12 @@ "advertisServiceUUIDs": [ ], - "linkStatu": false, + "linkStatu": true, "macAddress": "", - "communicationMode":"", - "imei":"" + "communicationMode": "", + "imei": "" }, - serverDevice:null + serverDevice: null } }, computed: { @@ -83,51 +83,84 @@ return "red"; } }, - deviceStatu:function(){ - if(!this.device.name){ + deviceStatu: function() { + if (!this.device.name) { return ""; } - if(!this.device.macAddress){ + if (!this.device.linkStatu) { + return "蓝牙未连接"; + } + if (!this.device.macAddress) { return '等待设备上报Mac地址'; } - - if(!this.device.deviceName ){ - if(this.Statu.isSearch){ + + if (!this.device.deviceName) { + if (this.Statu.isSearch) { return "无效设备"; - }else{ - if(this.Statu.timeInteval===null){ + } else { + if (this.Statu.timeInteval === null) { return "等待查询设备" - }else{ + } else { return "正在查询设备"; } } - }else{ + } else { return "找到有效设备" } - + return ""; } }, onUnload() { - console.log("返回时断开蓝牙连接,取消订阅"); - - ble.removeReceiveCallback(pagePath); + console.log("返回取消订阅"); + + ble.removeAllCallback(pagePath); }, onLoad(option) { these = this; ble = bleTool.getBleTool(); - console.log("LinkBle") + + ble.addStateBreakCallback(res => { + these.device.linkStatu = false; + hideLoading(these); + uni.showToast({ + icon:'fail', + title:'蓝牙已不可用' + }) + },pagePath); + + ble.addStateRecoveryCallback(res => { + if (these.device.deviceId) { + showLoading(these, { + text: '蓝牙已恢复正在连接设备' + }); + + these.reLinkdevice(); + } + },pagePath); + ble.addDisposeCallback(res => { + console.log("处理蓝牙断开连接"); + these.device.linkStatu = false; + if (these.device.deviceId == res.deviceId) { + + showLoading(these, { + text: '蓝牙已断开,正在重连' + }); + these.reLinkdevice(); + } + },pagePath); + ble.addReceiveCallback((receive, f, path) => { console.log("收到设备消息,", receive); if (these.device.deviceId == receive.deviceId) { - console.log("11111:",receive); - these.device.imei=f.imei; + console.log("11111:", receive); + these.device.imei = f.imei; if (receive.bytes[0] == 0xFC || receive.str.indexOf('mac address:') == 0) { if (f && f.macAddress) { these.device.macAddress = f.macAddress; - console.log("222222"); - these.Statu.isSearch=false; + console.log("222222"); + these.Statu.isSearch = false; these.initDevice(); } } @@ -157,19 +190,41 @@ } }) - let inteval = setInterval(this.initDevice, 10000); + let inteval = setInterval(this.initDevice, 10000); }, methods: { - + reLinkdevice() { + ble.LinkBlue(these.device.deviceId).then(res => { + updateLoading(these, { + text: '连接成功' + }); + these.device.linkStatu = true; + setTimeout(() => { + hideLoading(these); + }, 2000); + }).catch(ex => { + updateLoading(these, { + text: ex.msg + }); + setTimeout(() => { + hideLoading(these); + }, 2000); + }); + }, initDevice: function() { - if(!these.device.macAddress){ + if (!these.device.macAddress) { return; } - + //无效的设备回调 + let deviceInvalid = () => { + + these.$set(these.device, "deviceName", ""); + + } clearTimeout(this.Statu.timeInteval); this.Statu.timeInteval = setTimeout(() => { - this.Statu.isSearch=true; + this.Statu.isSearch = true; showLoading(these, { text: '正在获取设备信息' }); @@ -181,45 +236,34 @@ deviceMac: these.device.macAddress } }).then(res => { - + console.log("获取设备信息", res); if (res && res.code == 200) { + console.log("res=", res); let data = res.data; - this.serverDevice=data; + this.serverDevice = data; if (data) { let keys = Object.keys(data); ble.data.LinkedList.find((v) => { if (v.deviceId == these.device.deviceId) { for (var i = 0; i < keys.length; i++) { - let key = keys[i]; - // if(!v.device){ - // v.device={}; - // } - // v.device[key] = data[key]; - // console.log("key="+key); - // console.log("value="+data[key]); - - + let key = keys[i]; these.$set(these.device, key, data[key]); - } - - // ble.setBleData(); } }); - - // console.log("device=", these.device); - // console.log("LinkedList=", ble.data.LinkedList); - - + } else { + deviceInvalid(); } + } else { + deviceInvalid(); } }).catch((ex) => { console.error("获取设备出现异常:", ex); }).finally(() => { - this.Statu.timeInteval=null; - this.Statu.isSearch=false; + this.Statu.timeInteval = null; + this.Statu.isSearch = false; hideLoading(these); }); @@ -242,7 +286,7 @@ these.Statu.boundRemark = "设备上报Mac地址异常"; return; } - if(!this.device.deviceName){ + if (!this.device.deviceName) { these.Statu.bound = false; these.Statu.boundRemark = "设备未入库"; return; @@ -267,26 +311,26 @@ if (res.code == 200) { these.Statu.bound = true; these.Statu.boundRemark = "设备绑定成功!"; - let data=these.serverDevice; + let data = these.serverDevice; let keys = Object.keys(data); ble.data.LinkedList.find((v) => { if (v.deviceId == these.device.deviceId) { for (var i = 0; i < keys.length; i++) { let key = keys[i]; - if(!v.device){ - v.device={}; + if (!v.device) { + v.device = {}; } - v.device[key] = data[key]; + v.device[key] = data[key]; } - - ble.updateCache(); + + ble.updateCache(); } }); - + ble.removeReceiveCallback(pagePath); clearTimeout(this.Statu.timeInteval); - this.device.macAddress=null; - this.Statu.timeInteval=null; + this.device.macAddress = null; + this.Statu.timeInteval = null; uni.$emit("refreshDeviceList"); setTimeout(() => { uni.switchTab({ @@ -300,7 +344,7 @@ }).catch((ex) => { these.Statu.bound = false; these.Statu.boundRemark = '出现了未知的异常,操作失败'; - console.log("ex=",ex); + console.log("ex=", ex); }).finally(() => { hideLoading(this); }); diff --git a/pages/common/addBLE/addEquip.vue b/pages/common/addBLE/addEquip.vue index 52b9465..0786bb7 100644 --- a/pages/common/addBLE/addEquip.vue +++ b/pages/common/addBLE/addEquip.vue @@ -32,7 +32,9 @@ - + + 信号:{{110+item.RSSI>100?100:110+item.RSSI}}% + @@ -63,7 +65,7 @@ - 信号强度:{{110+item.RSSI>100?100:110+item.RSSI}}% + 信号:{{110+item.RSSI>100?100:110+item.RSSI}}% @@ -116,6 +118,7 @@ data() { return { Status: { + isPageHidden: false, intval: null, time: null, BottomMenu: { @@ -156,13 +159,14 @@ }, onHide: function() { + this.Status.isPageHidden = true; ble.StopSearch(); }, onUnload() { ble.StopSearch(); - ble.removeDeviceFound(pagePath); - ble.removeReceiveCallback(pagePath); + ble.removeAllCallback(pagePath); + }, onLoad(option) { let search = option.search; @@ -203,14 +207,86 @@ let StartSubsrib = () => { - these.EquipMents=[]; + these.EquipMents = []; ble = bleTool.getBleTool(); + //蓝牙不可用的回调 + ble.addStateBreakCallback(res=>{ + if (these.Status.isPageHidden) { + return; + } + console.log("处理蓝牙不可用"); + hideLoading(these); + these.PairEquip=[]; + these.EquipMents=[]; + uni.showToast({ + icon:'fail', + title:'蓝牙已不可用' + }); + these.showOpenSetting(); + + },pagePath); + //蓝牙再次可用的回调 + ble.addStateRecoveryCallback(res=>{ + if (these.Status.isPageHidden) { + return; + } + uni.showToast({ + icon:'success', + title:'蓝牙恢复可用' + }); + these.Status.BottomMenu.show = false; + these.EquipMents=[]; + these.refreshBleList(); + },pagePath); + + //蓝牙断开连接的回调 + ble.addDisposeCallback(res => { + if (these.Status.isPageHidden) { + return; + } + console.log("处理蓝牙断开连接"); + hideLoading(these); + + these.PairEquip.find(function(v, ind) { + these.PairEquip.splice(ind, 1); + return v.deviceId == res.deviceId; + }); + }, pagePath); + //蓝牙连接已恢复的回调 + ble.addRecoveryCallback(res => { + if (these.Status.isPageHidden) { + return; + } + // hideLoading(these); + these.EquipMents.find(function(v, ind) { + if (v.deviceId == res.deviceId) { + these.PairEquip.push(v); + return true; + } + return false; + }); + if (these.device) { + clearInterval(this.Status.intval); + showLoading(these, { + text: '蓝牙连接已恢复,正在验证设备' + }); + + setTimeout(() => { + these.DeviceVerdict(res.deviceId); + }, 0); + } else { + hideLoading(these); + } + }, pagePath); + //搜索到新设备的回调 ble.addDeviceFound((arr) => { - + if (these.Status.isPageHidden) { + return; + } arr = arr.devices; for (var i = 0; i < arr.length; i++) { @@ -246,8 +322,11 @@ } console.log("EquipMents=", these.EquipMents) }, pagePath); - + //收到设备的消息回调 ble.addReceiveCallback((receivData, f, path, arr) => { + if (these.Status.isPageHidden) { + return; + } if (f.macAddress && these.device) { clearInterval(this.Status.intval); this.Status.intval = null; @@ -265,6 +344,7 @@ }, pagePath); + } if (search) { @@ -281,6 +361,7 @@ }, onShow: function() { + this.Status.isPageHidden = false; this.refreshBleList(); }, methods: { @@ -288,26 +369,37 @@ if (!ble) { return; } + let promis = []; + for (let index = 0; index < this.PairEquip.length; index++) { + let item = this.PairEquip[index]; + promis.push(ble.disconnectDevice(item.deviceId)); - ble.StopSearch().then(res => { - // console.log("停止搜索成功"); - this.EquipMents = []; - ble.StartSearch().then(result => { - // console.log("开始搜索成功"); - }).catch(err => { - console.error("开始搜索失败,err=", err); - if(err.code===10001){ - these.showOpenSetting(); - }else{ - uni.showModal({ - title:'提示', - content:'出现异常:'+err.msg - }); - } + } + + Promise.allSettled(promis).finally(() => { + ble.StopSearch().then(res => { + // console.log("停止搜索成功"); + these.EquipMents = []; + these.PairEquip = []; + ble.StartSearch().then(result => { + // console.log("开始搜索成功"); + }).catch(err => { + console.error("开始搜索失败,err=", err); + if (err.code === 10001) { + these.showOpenSetting(); + } else { + uni.showModal({ + title: '提示', + content: '出现异常:' + err.msg + }); + } + }); + }).catch(ex => { + console.error("ex=", ex); }); - }).catch(ex => { - console.error("ex=", ex); + }); + }, isItemLink: function(item, index) { let src = '/static/images/BLEAdd/noLink.png'; @@ -348,15 +440,16 @@ }); let removeLink = () => { ble.subScribe(deviceId, false); //取消订阅消息 - ble.DropDevice(deviceId); //从缓存中删除该设备 - ble.disconnectDevice(deviceId); //断开与该设备的连接 + ble.DropDevice(deviceId, null); //从缓存中删除该设备并断开连接 these.device.deviceMac = ""; - let index = this.PairEquip.findIndex(function(v) { + let index = these.PairEquip.findIndex(function(v) { return v.deviceId == deviceId; }); if (index > -1) { this.PairEquip.splice(index, 1); } + + } console.log("f=", f); @@ -372,24 +465,30 @@ hideLoading(these); }, 1000) return; - } + } else { + } hideLoading(these); ble.updateCache(); uni.navigateBack(); return true; } else { + + this.Status.time = 30; + showLoading(these, { - - + text: "等待设备上报Mac地址," + these.Status.time + 's' + }); + console.log("11111111", this.Status.time); + clearInterval(this.Status.intval); this.Status.intval = null; this.Status.intval = setInterval(() => { this.Status.time = this.Status.time - 1; if (this.Status.time < 0) { - + console.log("停止倒计时", this.Status.time); clearInterval(this.Status.intval) this.Status.intval = null; this.Status.time = null; @@ -408,15 +507,14 @@ setTimeout(() => { hideLoading(these) - }, 1000); + }, 1500); } return; } - updateLoading(these, { + updateLoading(these, { text: "等待设备上报Mac地址," + these.Status.time + 's' }); - }, 1000); return undefined; } @@ -617,22 +715,24 @@ } @keyframes expand { - 0% { - width: 0; - height: 0; - opacity: 0.8; - } - 80% { - width: 18.75rem; - height: 18.75rem; - opacity: 0.2; - } - 100% { - - width: 0.5rem; - height: 0.5rem; - opacity: 0.5; - } + 0% { + width: 0; + height: 0; + opacity: 0.8; + } + + 80% { + width: 18.75rem; + height: 18.75rem; + opacity: 0.2; + } + + 100% { + + width: 0.5rem; + height: 0.5rem; + opacity: 0.5; + } } .mainContent { diff --git a/pages/common/index/index.vue b/pages/common/index/index.vue index 50ba0fe..3995d7f 100644 --- a/pages/common/index/index.vue +++ b/pages/common/index/index.vue @@ -458,7 +458,7 @@ } console.log("111111",this.deviceId); console.log("ble==null,",ble) - ble && ble.DropDevice(this.deviceId.id); + ble && ble.DropDevice(null,this.deviceId.id); } else { uni.showToast({ title: res.msg, diff --git a/pages/common/login/index.vue b/pages/common/login/index.vue index 87a60b3..1bafbc8 100644 --- a/pages/common/login/index.vue +++ b/pages/common/login/index.vue @@ -84,6 +84,7 @@ } }, onLoad() { + this.phone= uni.getStorageSync('phone'); if (uni.getStorageSync("token") && uni.getStorageSync("clientID")) { //免登陆 let time = uni.getStorageSync("tokenTime"); if (!time) { @@ -101,7 +102,7 @@ uni.removeStorageSync("token") uni.removeStorageSync("clientID") uni.removeStorageSync("tokenTime") - this.phone= uni.getStorageInfoSync('phone'); + } } diff --git a/pages/common/user/index.vue b/pages/common/user/index.vue index 80d5060..d8fd6c3 100644 --- a/pages/common/user/index.vue +++ b/pages/common/user/index.vue @@ -22,7 +22,7 @@ 隐私协议 - + 版本更新 ({{appVersion}}) diff --git a/utils/BleHelper.js b/utils/BleHelper.js index 46411b6..bf80ac8 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -17,13 +17,13 @@ const serviceDic = [ //合作供应商的蓝牙主服务 class BleHelper { constructor() { this.StorageKey = "linkedDevices"; - + recei = receivTool.getBleReceive(); this.init(); } init() { - + var store = uni.getStorageInfoSync(); var f = store.keys.includes(this.StorageKey); var linkedDevices = []; @@ -39,7 +39,7 @@ class BleHelper { }); } - + setTimeout(() => { this.OpenBlue().then(() => { @@ -54,14 +54,15 @@ class BleHelper { searchList: [], //已搜索到的设备列表, isSubscribe: false, //是否开启了订阅 LinkedList: linkedDevices //已连接的设备列表 - + } this.cfg = { onDeviceFound: [], //发现新设备的事件 receivDataCallback: [], //接收到数据的事件 bleDisposeCallback: [], //蓝牙断开连接的事件 recoveryCallback: [], //蓝牙连接恢复的事件 - stateRecoveryCallback: [] //蓝牙适配器恢复可用事件 + stateRecoveryCallback: [], //蓝牙适配器恢复可用事件 + stateBreakCallback: [] //蓝牙适配器不可用事件 } // this.addReceiveCallback((a, b, c) => { // recei.ReceiveData(a, b, c); @@ -128,13 +129,13 @@ class BleHelper { } //从缓存中删除某个设备,bleId蓝牙id,deviceId数据库中的设备id DropDevice(bleId, deviceId) { - + let flag = false; for (var i = 0; i < this.data.LinkedList.length; i++) { let item = this.data.LinkedList[i]; - if (bleId && item.device) { - if (item.device.id == bleId) { - // console.log("找到要删除的设备", item); + if (deviceId && item.device) { + if (item.device.id == deviceId) { + console.log("找到要删除的设备", item); this.data.LinkedList.splice(i, 1); this.disconnectDevice(item.deviceId); flag = true; @@ -142,16 +143,16 @@ class BleHelper { } } else { - if (deviceId && item.deviceId == deviceId) { - // console.log("找到要删除的设备1,", item) + if (bleId && item.deviceId == bleId) { + console.log("找到要删除的设备1,", item) this.data.LinkedList.splice(i, 1); this.disconnectDevice(item.deviceId); - flag = true; + flag = true; break; } } } - if (flag) { + if (flag) { this.updateCache(); } @@ -159,9 +160,9 @@ class BleHelper { //更新缓存 updateCache() { - + uni.setStorageSync(this.StorageKey, this.data.LinkedList); - + } //连接所有已连接过的设备 linkAllDevices() { @@ -248,60 +249,80 @@ class BleHelper { } - //设置蓝牙适配器恢复可用的回调 - addstateRecoveryCallback(callback, currKey) { - addCallback(callback, currKey, 'stateRecoveryCallback'); - } - - //移除蓝牙适配器恢复的回调 - removestateRecoveryCallback(currKey) { - removeCallback(currKey, 'stateRecoveryCallback'); - } + //设置蓝牙恢复连接的回调 addRecoveryCallback(callback, currKey) { - addCallback(callback, currKey, 'recoveryCallback'); + this.addCallback(callback, currKey, 'recoveryCallback'); } //移除蓝牙恢复连接的回调 removeRecoveryCallback(currKey) { - removeCallback(currKey, 'recoveryCallback'); + this.removeCallback(currKey, 'recoveryCallback'); } //设置蓝牙断开连接的回调 addDisposeCallback(callback, currKey) { - addCallback(callback, currKey, 'bleDisposeCallback'); + this.addCallback(callback, currKey, 'bleDisposeCallback'); } //移除蓝牙断开连接的回调 removeDisposeCallback(currKey) { - removeCallback(currKey, 'bleDisposeCallback'); + this.removeCallback(currKey, 'bleDisposeCallback'); } //设置发现新设备的回调 addDeviceFound(callback, currKey) { - addCallback(callback, currKey, 'onDeviceFound'); + this.addCallback(callback, currKey, 'onDeviceFound'); } //移除发现新设备的回调 removeDeviceFound(currKey) { - removeCallback(currKey, 'onDeviceFound'); + this.removeCallback(currKey, 'onDeviceFound'); } //添加接收到数据的回调 addReceiveCallback(callback, currKey) { - addCallback(callback, currKey, 'receivDataCallback'); + this.addCallback(callback, currKey, 'receivDataCallback'); } - - - //设置接收到数据的回调 + //移除接收到数据的回调 removeReceiveCallback(currKey) { - removeCallback(currKey, 'receivDataCallback'); + this.removeCallback(currKey, 'receivDataCallback'); } + //添加蓝牙不可用的回调 + addStateBreakCallback(callback, currKey) { + this.addCallback(callback, currKey, 'stateBreakCallback'); + } + + //移除蓝牙不可用的回调 + removeStateBreakCallback(currKey) { + this.removeCallback(currKey, 'stateBreakCallback'); + } + + + //设置蓝牙适配器恢复可用的回调 + addStateRecoveryCallback(callback, currKey) { + this.addCallback(callback, currKey, 'stateRecoveryCallback'); + } + + //移除蓝牙适配器恢复的回调 + removeStateRecoveryCallback(currKey) { + this.removeCallback(currKey, 'stateRecoveryCallback'); + } + + //清除所有事件回调 + removeAllCallback(currKey) { + this.removeDeviceFound(currKey) + this.removeDisposeCallback(currKey); + this.removeReceiveCallback(currKey); + this.removeRecoveryCallback(currKey); + this.removeStateRecoveryCallback(currKey); + this.removeStateBreakCallback(currKey); + } getError(ex) { @@ -461,6 +482,9 @@ class BleHelper { console.log("开始订阅各类变化消息"); this.data.isSubscribe = true; + // 保存每个设备的连接状态 + let bleDeviceStates = {}; + var bytesToHexString = (bytes) => { return bytes.map(byte => byte.toString(16).padStart(2, @@ -468,21 +492,24 @@ class BleHelper { } uni.onBluetoothAdapterStateChange((state) => { - console.log('蓝牙状态发生变化:' + JSON.stringify(state)); + // console.log('蓝牙状态发生变化:' + JSON.stringify(state)); if (this.data.available !== state.available) { this.data.available = state.available; this.data.discovering = state.discovering; if (this.data.available && this.data .isOpenBlue) { //蓝牙状态再次可用,重连所有设备 - - if(this.cfg.stateRecoveryCallback.length>0){ - this.cfg.stateRecoveryCallback.forEach(c=>{ - try { - c.callback(); - } catch (error) { - console.error("蓝牙适配器已恢复,但回调函数发生错误",error); - } - }) + + if (this.cfg.stateRecoveryCallback.length > 0) { + this.cfg.stateRecoveryCallback.forEach( + c => { + try { + c.callback(); + } catch (error) { + console.error( + "蓝牙适配器已恢复,但回调函数发生错误", + error); + } + }) } } @@ -490,60 +517,99 @@ class BleHelper { if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接 + this.data.LinkedList.filter((v) => { v.Linked = false; v.notifyState = false; return true; }); + let keys = Object.keys(bleDeviceStates) + keys.filter(v => { + bleDeviceStates[v] = false; + }); + + this.cfg.stateBreakCallback.forEach(f => { + try { + f.callback(); + } catch (error) { + console.error("蓝牙状态不可用了,执行回调异常", + error) + } + + }) this.updateCache(); } }); + + uni.onBLEConnectionStateChange((res) => { - - if (!res.connected) { - - console.error("蓝牙已断开", res); - let f = this.data.LinkedList.find((v) => { - if (v.deviceId == res.deviceId) { - v.Linked = false; - v.notifyState = false; - return true; - } - return false; - }); - this.updateCache(); - if (f.device && f.device.id) { - console.log("尝试5次恢复连接,", f.deviceId); - this.LinkBlue(res.deviceId, f.writeServiceId, f - .wirteCharactId, f.notifyCharactId, 5); - } - - if (this.cfg.bleDisposeCallback.length > 0) { - this.cfg.bleDisposeCallback.forEach((c)=>{ - try { - c.callback(); - } catch (error) { - console.error("执行蓝牙断开连接的回调出现异常,", error) - } - }); - } - - } else { - console.log("蓝牙连接已恢复,", res); - if (this.cfg.recoveryCallback.length > 0) { - this.cfg.recoveryCallback.forEach((c)=>{ - try { - c.callback(); - } catch (error) { - console.error("执行蓝牙恢复连接的回调出现异常,", error) - } - }); - - - } + console.log("蓝牙连接状态变化了", res); + // 检查状态是否真的发生了变化 + if (bleDeviceStates[res.deviceId] === res.connected) { + console.error('专业给Uniapp填坑,连接状态'); + return; } + + // 更新状态记录 + bleDeviceStates[res.deviceId] = res.connected; + + setTimeout(() => { + if (!res.connected) { + console.error("蓝牙已断开", res); + let f = this.data.LinkedList.find(( + v) => { + if (v.deviceId == res + .deviceId) { + v.Linked = false; + v.notifyState = false; + return true; + } + return false; + }); + this.updateCache(); + if (f && f.device && f.device.id) { + console.log("尝试5次恢复连接,", f + .deviceId); + this.LinkBlue(res.deviceId, f + .writeServiceId, f + .wirteCharactId, f + .notifyCharactId, 5); + } + + if (this.cfg.bleDisposeCallback.length > + 0) { + this.cfg.bleDisposeCallback.forEach( + (c) => { + try { + c.callback(res); + } catch (error) { + console.error( + "执行蓝牙断开连接的回调出现异常,", + error) + } + }); + } + + } else { + console.log("蓝牙连接已恢复,", res); + if (this.cfg.recoveryCallback.length > + 0) { + this.cfg.recoveryCallback.forEach(( + c) => { + try { + c.callback(res); + } catch (error) { + console.error( + "执行蓝牙恢复连接的回调出现异常,", + error) + } + }); + } + } + + }, 0); }); uni.onBluetoothDeviceFound((res) => { @@ -556,11 +622,14 @@ class BleHelper { .includes(v.serviceId); }); if (f) { + + console.log("发现新设备:", item); arr.push(item); } } if (arr.length === 0) { + // console.error("发现了设备,但不是想要的设备", res); return; } res.devices = arr; @@ -569,7 +638,13 @@ class BleHelper { if (this.cfg.onDeviceFound) { if (this.cfg.onDeviceFound.length > 0) { this.cfg.onDeviceFound.forEach((found) => { - found.callback(res); + try { + found.callback(res); + } catch (error) { + console.error("处理发现设备的回调出现异常,", + error); + } + }); } @@ -745,12 +820,12 @@ class BleHelper { uni.closeBluetoothAdapter({ success: () => { // console.log("蓝牙模块已关闭"); - this.data.isOpenBlue = false; + }, fail: (ex) => { console.error('无法关闭蓝牙模块:', ex); ex = this.getError(ex); - ////console.log(msg); + }, complete: () => { resolve(); @@ -842,13 +917,14 @@ class BleHelper { err({ code: -1 }); - }, 50); + }, 100); }); return new Promise((resolve, reject) => { Promise.race([p1, p2]).then(resolve).catch(ex => { if (ex.code == -1) { + console.error('专业给Uniapp填坑,停止搜索'); resolve(); return; } @@ -960,6 +1036,7 @@ class BleHelper { Promise.race([p1, p2]).then(succ).catch(ex => { // console.error("异常了:",ex); if (ex.code == -1) { + console.error('专业给Uniapp填坑,订阅成功'); succ(); return; } @@ -1342,7 +1419,7 @@ class BleHelper { }, fail: () => { console.error( - "mtu设置失败"); + "mtu设置失败"); resolve( true ); // MTU设置失败不影响连接成功 @@ -1358,7 +1435,7 @@ class BleHelper { fail: (ex) => { ex = this.getError(ex); console.error("蓝牙" + deviceId + "连接失败" + JSON.stringify( - ex)); + ex)); // 连接超时后自动重试 if (ex.code === 10012 && retryCount < maxRetries) { @@ -1441,12 +1518,12 @@ class BleHelper { uni.closeBLEConnection({ deviceId: id, success: (res) => { - console.log("蓝牙连接已断开:" + id); + console.log("用户主动断开了蓝牙:" + id); this.subScribe(id, false); resolve(); }, fail: (ex) => { - + console.error("无法断开蓝牙连接", ex); reject(this.getError(ex)); } }); @@ -1570,6 +1647,7 @@ class BleHelper { Promise.race([timeOut(ms), promise]).then(resolve).catch((ex) => { // console.error("ex=", ex); if (ex.code == -1) { + console.error('专业给Uniapp填坑,发送成功'); resolve(ex); } else { reject(ex);