From 2b7ae4ebaacf5230fa149a481674fcd9f8cda3e0 Mon Sep 17 00:00:00 2001 From: liub Date: Mon, 6 Apr 2026 14:02:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=93=9D=E7=89=99=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E5=9C=A8=E9=A6=96=E9=A1=B5=E7=9A=84=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/6170/deviceControl/index.vue | 122 +++++++------- pages/common/addDevice/addBle.vue | 29 ++-- pages/common/index/index.vue | 11 +- utils/BleHelper.js | 19 +-- utils/BleReceive.js | 259 ++++++++++++++++------------- 5 files changed, 232 insertions(+), 208 deletions(-) diff --git a/pages/6170/deviceControl/index.vue b/pages/6170/deviceControl/index.vue index 04b3c39..067425d 100644 --- a/pages/6170/deviceControl/index.vue +++ b/pages/6170/deviceControl/index.vue @@ -58,6 +58,12 @@ {{getbleStatu}} + + 充电状态 + + {{deviceInfo.chargeState != 0?'充电中':'未充电'}} + + 定位信息 @@ -73,7 +79,7 @@ - + 设备强制报警中 { + if (this.deviceInfo.batteryPercentage < 20 && + this.deviceInfo.chargeState == 0) { + this.popupType = 'bettery'; + this.popupMessage = '请及时充电'; + this.showPopupFlag = true; + } + if (this.apiType === 'listA') { + this.fetchDeviceDetail(data.data.id) + } else { + // 分享权限详情 + this.fetchSharedDeviceDetail(data.data.id) + } + }, 10000); + // 上报电量,在列表里面同步 + uni.$emit('deviceStatusUpdate', { + message: parsedMessage, + timestamp: new Date().getTime() + }); + break; + default: + console.log('未知的 deviceState 类型:', deviceState[0]); + } + }, bleStatuToggle() { let f = this.getDevice(); if (!f) { @@ -532,11 +584,9 @@ } let data = rec.ReceiveData(receive, device, pagePath, recArr); console.log("蓝牙收到消息", data) - this.receivData(data); - }, - receivData(data) { - + this.onReceive(data.state); }, + bleStateBreak() { if (this.Status.pageHide) { return; @@ -1566,6 +1616,7 @@ // this.popupConfirmText=""; }, OpenWarn(val){//开启/解除强制报警 + debugger; const topic = `B/${this.itemInfo.deviceImei}`; let message={"instruct":[7,val,0,0,0,0]}; message=JSON.stringify(message); @@ -1575,6 +1626,8 @@ }); if(flag){ this.itemInfo.alarmStatus=val; + }else{ + MsgError("操作没有成功",'确定',this); } this.showPopupFlag = false; @@ -1644,11 +1697,11 @@ // 3.解除告警状态 const registerRes = await deviceSendAlarmMessage(data); if (registerRes.code !== 200) { - uni.showToast({ - title: registerRes.msg, - icon: 'none' - }) - + // uni.showToast({ + // title: registerRes.msg, + // icon: 'none' + // }) + this.OpenWarn(0); return } this.itemInfo.alarmStatus=0; @@ -1908,53 +1961,8 @@ const deviceState = parsedMessage.state; // 直接取 state 数组 // 切换主灯光模式,亮度值设备同步 if (!deviceState) return; - // 1设备切换灯光实时返回 - switch (deviceState[0]) { - case 1: - this.currentMainMode = this.getMainLightModeLabel( - deviceState[ - 1]); - this.sliderValue = deviceState[2]; - this.deviceInfo.batteryRemainingTime = deviceState[3]; - break; - // 12为设备实时上报 - case 12: - this.currentMainMode = this.getMainLightModeLabel( - deviceState[ - 1]); - this.isLaserOn = deviceState[2] === 1; //第3位表示当时激光灯档位 - this.currentlaserMode = this.isLaserOn ? "开启" : "关闭"; - if (this.deviceInfo) { - this.deviceInfo.batteryPercentage = deviceState[ - 3]; //第4位电量百分比 - this.deviceInfo.chargeState = deviceState[ - 4]; //第5位为充电状态(0没有充电,1正在充电,2为已充满) - this.deviceInfo.batteryRemainingTime = deviceState[ - 5]; //第6位200代表电池剩余续航时间200分钟 - } - setTimeout(() => { - if (this.deviceInfo.batteryPercentage < 20 && - this.deviceInfo.chargeState == 0) { - this.popupType = 'bettery'; - this.popupMessage = '请及时充电'; - this.showPopupFlag = true; - } - if (this.apiType === 'listA') { - this.fetchDeviceDetail(data.data.id) - } else { - // 分享权限详情 - this.fetchSharedDeviceDetail(data.data.id) - } - }, 10000); - // 上报电量,在列表里面同步 - uni.$emit('deviceStatusUpdate', { - message: parsedMessage, - timestamp: new Date().getTime() - }); - break; - default: - console.log('未知的 deviceState 类型:', deviceState[0]); - } + + this.onReceive(deviceState); } catch (error) { console.log('解析MQTT消息失败:', error, '原始消息:', payload); } diff --git a/pages/common/addDevice/addBle.vue b/pages/common/addDevice/addBle.vue index d963791..bddf46d 100644 --- a/pages/common/addDevice/addBle.vue +++ b/pages/common/addDevice/addBle.vue @@ -482,20 +482,20 @@ ble.addStateBreakCallback(() => { - uni.showModal({ - title: '提示', - content: '蓝牙不可用' - }); + + + MsgError('蓝牙不可用','',these); these.EquipMents.filter((v, i) => { these.$set(these.EquipMents[i], 'link', false); }); }, pagePath); ble.addStateRecoveryCallback(() => { - uni.showModal({ - title: '提示', - content: '蓝牙恢复可用' - }); + + + MsgSuccess('蓝牙恢复可用','',these,()=>{ + MsgClear(these); + }) }, pagePath); @@ -568,7 +568,7 @@ plus.runtime.openURL('weixin://', (err) => { - MsgError("打开微信失败,请手动打开微信粘贴"); + MsgError("打开微信失败,请手动打开微信,发送至'文件传输助手'"); }); }, fail(ex){ @@ -805,10 +805,8 @@ let json = getUrlParams(res.result); if (!json.key) { - uni.showModal({ - title: '错误', - content: "无效的二维码" - }) + + MsgError('无效的二维码','',these); return; } this.scanKey = json.key; @@ -1050,9 +1048,8 @@ these.sendEquipToMq(); }).catch(ex => { console.log("ex=", ex) - uni.showModal({ - content: "连接失败:" + ex.msg - }); + + MsgError("连接失败:" + ex.msg,'',these); hideLoading(these); }); } diff --git a/pages/common/index/index.vue b/pages/common/index/index.vue index 1fbee95..d9dc6cd 100644 --- a/pages/common/index/index.vue +++ b/pages/common/index/index.vue @@ -134,6 +134,9 @@ + + + @@ -772,7 +775,8 @@ this.downCallback(); }); ble = bleTool.getBleTool(); - recei = BleReceive.getBleReceive(); + console.log("this=",this); + recei = BleReceive.getBleReceive(this); //蓝牙连接成功的回调 ble.addRecoveryCallback((res) => { // console.log("蓝牙连接成功的回调"); @@ -799,8 +803,9 @@ //接收到消息的回调 ble.addReceiveCallback((receive, device, path, recArr) => { - // console.error("首页收到消息了"); - recei.ReceiveData(receive, device, path, recArr); + console.error("首页收到消息了"); + let json=recei.ReceiveData(receive, device, path, recArr); + console.error("消息内容",json); this.updateBleStatu(); }, pagePath); diff --git a/utils/BleHelper.js b/utils/BleHelper.js index c531e02..77abe9c 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -22,9 +22,6 @@ const serviceDic = [ //合作供应商的蓝牙主服务 class BleHelper { constructor() { this.StorageKey = "linkedDevices"; - - recei = receivTool.getBleReceive(); - this.init(); } init() { @@ -41,16 +38,12 @@ class BleHelper { if (!v) return false; v.Linked = false; v.notifyState = false; - return !!v.device; + return v.device; }); } - const systemInfo = uni.getSystemInfoSync(); - - - this.data = { isOpenBlue: false, //蓝牙模块是否开启 available: false, //蓝牙状态是否可用 @@ -71,17 +64,7 @@ class BleHelper { stateRecoveryCallback: [], //蓝牙适配器恢复可用事件 stateBreakCallback: [] //蓝牙适配器不可用事件 } - //蓝牙模块不再订阅,改到首页订阅 - // this.addReceiveCallback((receive, f, path, recArr) => { - // recei.ReceiveData(receive, f, path, recArr); - // }, "BleReceiveData"); - // setTimeout(() => { - // this.OpenBlue().then(() => { - // this.linkAllDevices(); - // }); - - // }, 10); this.dic = { errRemarks: [{ diff --git a/utils/BleReceive.js b/utils/BleReceive.js index a9175c7..c68768a 100644 --- a/utils/BleReceive.js +++ b/utils/BleReceive.js @@ -1,8 +1,20 @@ import Common from '@/utils/Common.js' -import { parseBleData } from '@/api/100J/HBY100-J.js' +import { + parseBleData +} from '@/api/100J/HBY100-J.js' +import { + MsgSuccess, + MsgError, + MsgClose, + MsgWarning, + showPop, + MsgClear, + MsgInfo +} from '@/utils/MsgPops.js'; class BleReceive { - constructor() { + constructor(_ref) { + this.ref = _ref; this.StorageKey = "linkedDevices"; this.HandlerMap = { '/pages/6155/deviceDetail': this.Receive_6155.bind(this), @@ -13,10 +25,11 @@ class BleReceive { '/pages/4877/BJQ4877': this.Receive_4877.bind(this), '/pages/100/HBY100': this.Receive_100.bind(this), '/pages/102/HBY102': this.Receive_102.bind(this), - '/pages/6170/deviceControl/index':this.Receive_6170.bind(this), + '/pages/6170/deviceControl/index': this.Receive_6170.bind(this), '/pages/100J/HBY100-J': this.Receive_100J.bind(this), - '/pages/6075J/BJQ6075J':this.Receive_6075.bind(this) + '/pages/6075J/BJQ6075J': this.Receive_6075.bind(this) }; + } @@ -63,23 +76,23 @@ class BleReceive { return receive; } - if (f && f.macAddress && f.device && f.device.id) { + if (fReady) { let handler = null; let keys = Object.keys(this.HandlerMap); let devKey = f.device.detailPageUrl ? f.device.detailPageUrl.replace(/\//g, '').toLowerCase() : ''; - + for (let index = 0; index < keys.length; index++) { let devKey = f.device.detailPageUrl ? f.device.detailPageUrl.replace(/\//g, "").toLowerCase() : ''; let key = keys[index].replace(/\//g, '').toLowerCase(); if (key == devKey) { handler = this.HandlerMap[keys[index]]; - + break; } } if (handler) { - let data = handler(receive, f, path, recArr); + let data = handler(receive, f, path, recArr); this.setBleFormData(data, f); return data; } else { @@ -89,7 +102,7 @@ class BleReceive { } else { // 100J AE30 二进制帧在 f 不完整时已在上方 parseBleData,此处不再误报「无法处理」 if (!is100JAe30) { - console.log("已收到该消息,但无法处理", receive, "f:", f); + console.error("已收到该消息,但无法处理", receive, "f:", f); } } @@ -180,40 +193,33 @@ class BleReceive { formData.modeCurr = modeCurr; formData.warnLevel = warn; formData.iswarn = iswarn; - + let recCnt = recArr.find(v => { return v.key.replace(/\//g, "").toLowerCase() == f.device.detailPageUrl .replace(/\//g, "").toLowerCase(); }); if (!recCnt) { + let msg = []; + if (f) { + if (formData.battary <= 20) { + msg.push("设备'" + f.device.deviceName + "'电量低"); + } + if (iswarn) { + msg.push("设备'" + f.device.deviceName + "'环境存在漏电电源"); + } - if (iswarn) { - uni.showModal({ - content: "'" + f.device.deviceName + "'环境存在漏电电源", - title: "警告", - success(res) { - if (res.confirm) { - - if (f) { - uni.navigateTo({ - url: f.detailPageUrl, - events: { - ack: function(data) {} - }, - success: (res) => { - res.eventChannel.emit('detailData', { - data: f, - deviceType: '', - apiType: 'listA' - }); - } - }); - } - } + if (this.ref && msg.length>0) { + if (msg.length > 0) { + msg = msg.join(','); + MsgError("'" + f.device.deviceName + "'环境存在漏电电源", '', this.ref, () => { + MsgClear(this.ref); + }); } - }) + } } + + } return formData; } catch (error) { @@ -229,7 +235,7 @@ class BleReceive { if (str.indexOf('mac address:') == 0) { let formData = {}; formData.macAddress = str.split(':')[1]; - + return formData; } else { let receiveData = { @@ -348,7 +354,7 @@ class BleReceive { receiveData.fourGStrenth = fourGStrenth; receiveData.SOS = sosTxt; receiveData.qzwarn = sosTxt === 'sg'; - + console.log("recArr=", recArr); let recCnt = recArr.find(v => { return v.key.replace(/\//g, "").toLowerCase() == f.device.detailPageUrl @@ -362,13 +368,22 @@ class BleReceive { if (staticWarn) { //有静止报警 msgs.push("静止报警中"); } + if (receiveData.battary <= 20) { + msg.push("设备'" + f.device.deviceName + "'电量低"); + } if (msgs.length > 0) { - msgs = "设备'" + f.device.deviceName + msgs.join(";"); - uni.showModal({ - title: "警告", - content: msgs, - showCancel: false - }); + msgs = msgs.join(";"); + if (this.ref) { + MsgError(msgs, '', this.ref, () => { + MsgClear(this.ref); + }); + } + + // uni.showModal({ + // title: "警告", + // content: msgs, + // showCancel: false + // }); } } @@ -436,7 +451,7 @@ class BleReceive { console.log('将数据转文本失败', ex); } } - + return receiveData; } @@ -514,12 +529,13 @@ class BleReceive { }); if (!recCnt) { - if (batteryLevel <= 20) { - // 会弹出两个框,暂且注释掉这段代码 - uni.showModal({ - content: "设备'" + f.device.deviceName + "'电量低", - title: "提示" - }); + if (batteryLevel <= 20 && warn == 0x00) { + + if (this.ref) { + MsgError("设备'" + f.device.deviceName + "'电量低", '', this.ref, () => { + MsgClear(this.ref); + }); + } } } @@ -613,13 +629,17 @@ class BleReceive { }); + console.log("formData=",formData) if (!recCnt) { - if (batteryLevel <= 20) { - // 会弹出两个框,暂且注释掉这段代码 - uni.showModal({ - content: "设备'" + f.device.deviceName + "'电量低", - title: "提示" - }); + console.log("11111"); + if (formData.battary <= 20 && bytes[5] == 0x00) { + console.log("2222") + if (this.ref) { + console.log("3333333"); + MsgError("设备'" + f.device.deviceName + "'电量低", '', this.ref, () => { + MsgClear(this.ref); + }); + } } } @@ -646,11 +666,13 @@ class BleReceive { }); if (!recCnt) { if (receiveData.sta_PowerPercent <= 20) { - uni.showModal({ - title: "提示", - content: "设备'" + f.device.deviceName + "'电量低", - showCancel: false - }); + + if (this.ref) { + MsgError("设备'" + f.device.deviceName + "'电量低", '', this.ref, () => { + MsgClear(this.ref); + }); + } + } } } catch (error) { @@ -674,12 +696,16 @@ class BleReceive { .replace(/\//g, "").toLowerCase(); }); if (!recCnt) { - if (receiveData.sta_battery <= 20) { - uni.showModal({ - title: "提示", - content: "设备'" + f.device.deviceName + "'电量低", - showCancel: false - }); + if (receiveData.sta_battery <= 20 && (receiveData.sta_system != '1' || receiveData.sta_system != + '3')) { + + if (this.ref) { + MsgError("设备'" + f.device.deviceName + "'电量低", '', this.ref, () => { + MsgClear(this.ref); + }); + } + + } } } catch (error) { @@ -695,19 +721,22 @@ class BleReceive { try { if (!receive.bytes || receive.bytes.length < 3) return receiveData; // 与 HBY100-J 页 bleValueNotify 共用 notify,避免 parseBleData 执行两次:重复日志、FB05 双次 resolve、onNotify 双次 - const parsed = parseBleData(receive.bytes, { skipSideEffects: true }); + const parsed = parseBleData(receive.bytes, { + skipSideEffects: true + }); if (!parsed) return receiveData; if (parsed.longitude !== undefined) receiveData.longitude = parsed.longitude; if (parsed.latitude !== undefined) receiveData.latitude = parsed.latitude; if (parsed.batteryPercentage !== undefined) receiveData.batteryPercentage = parsed.batteryPercentage; - if (parsed.batteryRemainingTime !== undefined) receiveData.batteryRemainingTime = parsed.batteryRemainingTime; + if (parsed.batteryRemainingTime !== undefined) receiveData.batteryRemainingTime = parsed + .batteryRemainingTime; } catch (e) { console.log('[100J] BleReceive 解析失败', e); } return receiveData; } -Receive_6170(receive, f, path, recArr) { + Receive_6170(receive, f, path, recArr) { let receiveData = {}; try { @@ -721,21 +750,20 @@ Receive_6170(receive, f, path, recArr) { .replace(/\//g, "").toLowerCase(); }); if (!recCnt) { - if (receiveData.sta_PowerPercent <= 20) { - uni.showModal({ - title: "提示", - content: "设备'" + f.device.deviceName + "'电量低", - showCancel: false - }); + let deviceState = receiveData.state; + if (deviceState && deviceState instanceof Array) { + if (deviceState[0] == 12 && deviceState[3] <= 20 && deviceState[4] == 0) { + if (this.ref) { + MsgError("设备'" + f.device.deviceName + "'电量低", '', this.ref, () => { + MsgClear(this.ref); + }); + } + } } - + + } - - - - - } catch (error) { receiveData = {}; console.error("文本解析失败", error) @@ -758,18 +786,21 @@ Receive_6170(receive, f, path, recArr) { .replace(/\//g, "").toLowerCase(); }); if (!recCnt) { - if (receiveData.sta_PowerPercent <= 20) { - uni.showModal({ - title: "提示", - content: "设备'" + f.device.deviceName + "'电量低", - showCancel: false - }); + + let msgs = []; + + if (receiveData.sta_PowerPercent <= 20 && receiveData.sta_charge == 0) { + msgs.push("设备'" + f.device.deviceName + "'电量低"); } if (receiveData.sta_Intrusion === 1) { - uni.showModal({ - title: "提示", - content: "闯入报警中", - showCancel: false + msgs.push("设备'" + f.device.deviceName + "'闯入报警中"); + } + + + if (this.ref && msg.length>0) { + msgs = msgs.join(","); + MsgError(msgs, '', this.ref, () => { + MsgClear(this.ref); }); } @@ -787,7 +818,7 @@ Receive_6170(receive, f, path, recArr) { if (receiveData.sta_tomac.indexOf(':') == -1) { receiveData.sta_tomac = receiveData.sta_tomac.replace(/(.{2})/g, '$1:').slice(0, - - 1); //mac地址自动补: + 1); //mac地址自动补: } uni.getStorageInfo({ success: function(res) { @@ -814,9 +845,9 @@ Receive_6170(receive, f, path, recArr) { let dev = arr.find(v => { if (v.linkId == f.linkId) { let vl = v.linkEqs.find(cvl => { - if(cvl.linkMac === receiveData.sta_tomac){ - v.read=false; - cvl.linkTime=time; + if (cvl.linkMac === receiveData.sta_tomac) { + v.read = false; + cvl.linkTime = time; return true; } return false; @@ -853,7 +884,7 @@ Receive_6170(receive, f, path, recArr) { console.error("某个设备闯入报警"); if (receiveData.sta_sosadd.indexOf(':') == -1) { receiveData.sta_sosadd = receiveData.sta_sosadd.replace(/(.{2})/g, '$1:').slice(0, - - 1); //mac地址自动补: + 1); //mac地址自动补: } warnArrs.push({ linkId: f.linkId, @@ -911,35 +942,33 @@ Receive_6170(receive, f, path, recArr) { } - Receive_6075(receive,f,path,recArr){ + Receive_6075(receive, f, path, recArr) { let receiveData = {}; - + try { receiveData = JSON.parse(receive.str); - + let recCnt = recArr.find(v => { return v.key.replace(/\//g, "").toLowerCase() == f.device.detailPageUrl .replace(/\//g, "").toLowerCase(); }); - if (!recCnt) { - // if (receiveData.sta_PowerPercent <= 20) { - // uni.showModal({ - // title: "提示", - // content: "设备'" + f.device.deviceName + "'电量低", - // showCancel: false - // }); - // } - - + if (!recCnt && this.ref) { + if (receiveData.sta_PowerPercent <= 20 && (receiveData.sta_system != 3 || receiveData.sta_system !=1)) { + + MsgError("设备'" + f.device.deviceName + "'电量低", '', this.ref, () => { + MsgClear(this.ref); + }); + + } } - + } catch (error) { receiveData = {}; console.log("文本解析失败", error) } return receiveData; - + } } @@ -947,10 +976,12 @@ Receive_6170(receive, f, path, recArr) { let receiveInstance = null; export default { - getBleReceive: function(found, receive) { + getBleReceive: function(_ref) { + console.log("_ref=",_ref); if (!receiveInstance) { - receiveInstance = new BleReceive(); - + receiveInstance = new BleReceive(_ref); + }else{ + console.log("使用现有实例receiveInstance") } return receiveInstance; }