From 61ed91695f15decff77a9fec9d7af3f7fae0226a Mon Sep 17 00:00:00 2001 From: liub Date: Mon, 27 Oct 2025 10:52:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E7=89=99=E6=A8=A1=E5=9D=97=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=9C=A8web=E5=B9=B3=E5=8F=B0=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E6=96=B9=E4=BE=BF=E8=B0=83=E8=AF=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD,4877=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 2 +- pages/100/HBY100.vue | 158 ++++++++++++++++++------------- pages/4877/BJQ4877.vue | 99 ++++++++++--------- pages/6155/deviceDetail.vue | 69 +++++++++----- pages/6331/BJQ6331.vue | 21 ++-- pages/650/HBY650.vue | 67 +++++++++---- pages/670/HBY670.vue | 96 +++++++++++-------- pages/7305/BJQ7305.vue | 66 ++++++++----- pages/common/addBLE/LinkBle.vue | 35 ++++++- pages/common/addBLE/addEquip.vue | 111 ++++++++++++---------- utils/BleHelper.js | 138 ++++++++++++++++++++------- utils/BleReceive.js | 3 + utils/Common.js | 28 ++++++ 13 files changed, 575 insertions(+), 318 deletions(-) diff --git a/manifest.json b/manifest.json index 092a023..a491f5d 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "name" : "星汉物联", "appid" : "__UNI__A21EF43", "description" : "设备管控", - "versionName" : "1.0.3", + "versionName" : "1.0.5", "versionCode" : "100", "transformPx" : false, /* 5+App特有相关 */ diff --git a/pages/100/HBY100.vue b/pages/100/HBY100.vue index 1204dd4..e602960 100644 --- a/pages/100/HBY100.vue +++ b/pages/100/HBY100.vue @@ -2,23 +2,24 @@ - + - {{formData.sta_PowerPercent}}% + {{formData.sta_battery}}% 电量 - + @@ -36,12 +37,7 @@ - - 设备强制报警中! - - {{formData.warnTime}}s - - + @@ -245,12 +241,12 @@ var ble = null; var these = null; var recei = null; - var interval=null; + var interval = null; export default { data() { return { Status: { - + pageHide: false, Pop: { showPop: false, //是否显示弹窗 popType: 'custom', @@ -311,7 +307,7 @@ }, formData: { img: '/static/images/4877/4877equip.png', - sta_PowerPercent: '', + sta_battery: '', xuhang: '', blename: '', deviceId: '', @@ -320,10 +316,14 @@ statu: '', macAddress: '', bleStatu: false, - sta_SOSType: '', //sos - sta_GroupType: '', //配组 - sta_ArrowType: '', //箭头方向 - warnTime:0 + sta_address: '', + sta_VoiceType: '', + sta_VoiceVolume: '', + sta_LightType: '', + sta_LightFreq: '', + sta_LightDimmer: '', + sta_system: '' + }, dic: { SOS: [{ @@ -438,7 +438,7 @@ these.formData.blename = f.name ? f.name : "Unname"; these.formData.deviceName = device.deviceName; these.formData.img = device.devicePic; - these.formData.bleStatu=false; + these.formData.bleStatu = false; these.formData.deviceId = f.deviceId; ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { these.formData.bleStatu = true; @@ -510,7 +510,7 @@ buttonBgColor: "#E03434", okCallback: () => { clearInterval(interval); - + this.sosSetting({ val: val }); @@ -528,30 +528,30 @@ return; } let task = () => { - + var json = { - ins_SOSType: this.formData.sta_SOSType==item.val?'sos_off':item.val + ins_SOSType: this.formData.sta_SOSType == item.val ? 'sos_off' : item.val } json = JSON.stringify(json); - ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res=>{ - - if (this.formData.sta_SOSType === item.val) { - this.formData.sta_SOSType = 'sos_off'; - } else { - this.formData.sta_SOSType = item.val; - } - - if(this.formData.sta_SOSType=='sos'){ - this.formData.warnTime=0; - clearInterval(interval); - interval=setInterval(()=>{ - this.formData.warnTime+=1; - },1000) - } - - - }) + ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res => { + + if (this.formData.sta_SOSType === item.val) { + this.formData.sta_SOSType = 'sos_off'; + } else { + this.formData.sta_SOSType = item.val; + } + + if (this.formData.sta_SOSType == 'sos') { + this.formData.warnTime = 0; + clearInterval(interval); + interval = setInterval(() => { + this.formData.warnTime += 1; + }, 1000) + } + + + }) .catch(ex => { this.showMsg(ex.msg); }); @@ -569,12 +569,12 @@ }); } else { - if(index!==undefined && this.formData.sta_SOSType=='sos'){ + if (index !== undefined && this.formData.sta_SOSType == 'sos') { this.showUnWarn(item.val); - }else{ - task(); + } else { + task(); } - + } @@ -688,36 +688,58 @@ return className; }, bleValueNotify: function(receive, device, path, recArr) { //订阅消息 + if (receive.deviceId !== this.formData.deviceId) { + return; + } console.log("收到设备的数据", receive) - let data = recei.ReceiveData(receive, device, pagePath, recArr); - console.log("处理后的数据:", data); - if (data) { - let keys = Object.keys(data); - keys.forEach(key => { - if (key in this.formData) { - this.formData[key] = data[key]; + let json = recei.ReceiveData(receive, device, pagePath, recArr); + + + let key = 'sta_VoiceDate'; + if (key in json) { + + let val = json[key]; + console.log("22222", val) + if (val === 'start') { + //开始发包 + + this.sendHex(); + return; + } else if (val === 'finish') { + + + uni.showModal({ + title: '提示', + content: "发送完成" + }); + return; + } else { + //重新发送某一包 + + + + if (val > this.audioData.packetCtn) { + + return; } - }); - let msg = []; - if (data.sta_SOSType == 'sos') { - msg.push("设备声光报警中"); - } - if (data.sta_PowerPercent <= 20) { - msg.push("设备电量低"); + this.sendHex(val); + return; } - if (msg.length) { - msg = msg.join(","); - this.showMsg(msg); - } - - these.setBleFormData(); } + let keys = Object.keys(json); + + keys.forEach(key => { + if (key in this.formData) { + this.formData[key] = json[key]; + } + + + }) + + - // // 转换为字节数组 - // const bytes = receive.bytes; - // parseData(bytes); @@ -754,7 +776,7 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', - buttonTextColor: '#FFFFFFde', + buttonTextColor: '#232323de', okCallback: function() { uni.navigateTo({ @@ -826,7 +848,7 @@ } }, showPop: function(option) { - + hideLoading(this); let def = { showPop: true, //是否显示弹窗 popType: 'custom', diff --git a/pages/4877/BJQ4877.vue b/pages/4877/BJQ4877.vue index 1204dd4..9dba199 100644 --- a/pages/4877/BJQ4877.vue +++ b/pages/4877/BJQ4877.vue @@ -2,7 +2,8 @@ - + @@ -36,7 +37,8 @@ - + 设备强制报警中! {{formData.warnTime}}s @@ -47,7 +49,7 @@ SOS - + @@ -245,12 +247,12 @@ var ble = null; var these = null; var recei = null; - var interval=null; + var interval = null; export default { data() { return { Status: { - + pageHide: false, Pop: { showPop: false, //是否显示弹窗 popType: 'custom', @@ -323,7 +325,7 @@ sta_SOSType: '', //sos sta_GroupType: '', //配组 sta_ArrowType: '', //箭头方向 - warnTime:0 + warnTime: 0 }, dic: { SOS: [{ @@ -398,11 +400,11 @@ ble = BleTool.getBleTool(); - 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); + ble.addReceiveCallback(this.bleValueNotify, pagePath); + ble.addStateBreakCallback(this.bleStateBreak, pagePath); + ble.addStateRecoveryCallback(this.bleStateRecovry, pagePath); + ble.addDisposeCallback(this.deviceDispose, pagePath); + ble.addRecoveryCallback(this.deviceRecovry, pagePath); let eventChannel = this.getOpenerEventChannel(); @@ -438,7 +440,7 @@ these.formData.blename = f.name ? f.name : "Unname"; these.formData.deviceName = device.deviceName; these.formData.img = device.devicePic; - these.formData.bleStatu=false; + these.formData.bleStatu = false; these.formData.deviceId = f.deviceId; ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { these.formData.bleStatu = true; @@ -467,19 +469,18 @@ return; } if (this.formData.sta_ArrowType === val) { - this.formData.sta_ArrowType = 'arrow_off'; - } else { - this.formData.sta_ArrowType = val; + val = 'arrow_off'; } var json = { - ins_ArrowType: this.formData.sta_ArrowType + ins_ArrowType: val } json = JSON.stringify(json); - ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30) - .catch(ex => { - this.showMsg(ex.msg); - }); + ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res => { + this.formData.sta_ArrowType = val; + }).catch(ex => { + this.showMsg(ex.msg); + }); }, groupSetting(item, index) { let f = this.getDevice(); @@ -510,7 +511,7 @@ buttonBgColor: "#E03434", okCallback: () => { clearInterval(interval); - + this.sosSetting({ val: val }); @@ -528,30 +529,31 @@ return; } let task = () => { - + var json = { - ins_SOSType: this.formData.sta_SOSType==item.val?'sos_off':item.val + ins_SOSType: this.formData.sta_SOSType == item.val ? 'sos_off' : item.val } json = JSON.stringify(json); - ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res=>{ - - if (this.formData.sta_SOSType === item.val) { - this.formData.sta_SOSType = 'sos_off'; - } else { - this.formData.sta_SOSType = item.val; - } - - if(this.formData.sta_SOSType=='sos'){ - this.formData.warnTime=0; - clearInterval(interval); - interval=setInterval(()=>{ - this.formData.warnTime+=1; - },1000) - } - - - }) + + ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res => { + + if (this.formData.sta_SOSType === item.val) { + this.formData.sta_SOSType = 'sos_off'; + } else { + this.formData.sta_SOSType = item.val; + } + + if (this.formData.sta_SOSType == 'sos') { + this.formData.warnTime = 0; + clearInterval(interval); + interval = setInterval(() => { + this.formData.warnTime += 1; + }, 1000) + } + + + }) .catch(ex => { this.showMsg(ex.msg); }); @@ -569,12 +571,12 @@ }); } else { - if(index!==undefined && this.formData.sta_SOSType=='sos'){ + if (index !== undefined && this.formData.sta_SOSType == 'sos') { this.showUnWarn(item.val); - }else{ - task(); + } else { + task(); } - + } @@ -688,6 +690,9 @@ return className; }, bleValueNotify: function(receive, device, path, recArr) { //订阅消息 + if (receive.deviceId !== this.formData.deviceId) { + return; + } console.log("收到设备的数据", receive) let data = recei.ReceiveData(receive, device, pagePath, recArr); console.log("处理后的数据:", data); @@ -754,7 +759,7 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', - buttonTextColor: '#FFFFFFde', + buttonTextColor: '#232323de', okCallback: function() { uni.navigateTo({ @@ -826,7 +831,7 @@ } }, showPop: function(option) { - + hideLoading(this); let def = { showPop: true, //是否显示弹窗 popType: 'custom', diff --git a/pages/6155/deviceDetail.vue b/pages/6155/deviceDetail.vue index e073e50..e49632b 100644 --- a/pages/6155/deviceDetail.vue +++ b/pages/6155/deviceDetail.vue @@ -357,7 +357,7 @@ these.formData.img = device.devicePic; these.formData.id = device.id; these.formData.deviceId = f.deviceId; - these.formData.bleStatu=false; + these.formData.bleStatu = false; ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { these.formData.bleStatu = true; }); @@ -515,11 +515,14 @@ return f; }, - bleValueNotify: function(receive, device, path,recArr) { + bleValueNotify: function(receive, device, path, recArr) { + if (receive.deviceId !== this.formData.deviceId) { + return; + } if (this.Status.pageHide) { return; } - let json = recei.ReceiveData(receive, device, path,recArr); + let json = recei.ReceiveData(receive, device, path, recArr); if (!json) { return; } @@ -572,6 +575,7 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', + buttonTextColor: '#232323de', okCallback: function() { // console.log("1111"); uni.navigateTo({ @@ -1028,39 +1032,52 @@ this.Status.Pop.showPop = false; }, showPop: function(option) { - hideLoading(this); - let defaultCfg = { - showHeader: false, - headerTxt: "", - showHeader: false, - showCancel: false, - borderColor: '#BBE600', - buttonBgColor: '#BBE600', - okCallback: null, - cancelCallback: null, + let def = { + showPop: true, //是否显示弹窗 popType: 'custom', + bgColor: '#383934bd', + borderColor: '#BBE600', + textColor: '#ffffffde', + buttonBgColor: '#BBE600', + buttonTextColor: '#232323DE', + iconUrl: '', + message: '', buttonText: '确定', - clickEvt: '' - }; - if (!option) { + clickEvt: '', + visiblePrompt: false, + promptTitle: '', + modelValue: '', + visibleClose: false, + okCallback: null, + showSlot: false, + buttonCancelText: '', + showCancel: false, + } - } - let keys = Object.keys(option); - for (var i = 0; i < keys.length; i++) { - let key = keys[i]; - this.Status.Pop[key] = option[key]; - } - keys = Object.keys(defaultCfg); - for (var i = 0; i < keys.length; i++) { + let keys = Object.keys(def); + + for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (key in option) { continue; } - this.Status.Pop[key] = defaultCfg[key]; + this.Status.Pop[key] = def[key]; + } + if (option) { + keys = Object.keys(option); + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + + this.Status.Pop[key] = option[key]; + } } - this.Status.Pop.showPop = true; + if (!option.borderColor) { + option.borderColor = '#BBE600'; + option.buttonBgColor = '#BBE600'; + } + these.Status.Pop.showPop = true; }, sendUsr() { let f = this.getDevice(); diff --git a/pages/6331/BJQ6331.vue b/pages/6331/BJQ6331.vue index e30db6a..8a5fcc9 100644 --- a/pages/6331/BJQ6331.vue +++ b/pages/6331/BJQ6331.vue @@ -247,6 +247,7 @@ data() { return { Status: { + pageHide: false, showLightingSet: false, showVolumeSet: false, Pop: { @@ -675,6 +676,9 @@ }, bleValueNotify: function(receive, device, path) { //订阅消息 + if (receive.deviceId !== this.formData.deviceId) { + return; + } console.log("收到设备的数据", receive) let data = recei.ReceiveData(receive, device, pagePath); @@ -717,13 +721,13 @@ showBleUnConnect() { - these.showPop({ + this.showPop({ message: "蓝牙未连接过该设备,请使用蓝牙重新添加该设备", iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', - buttonTextColor: '#FFFFFFde', + buttonTextColor: '#232323de', okCallback: function() { uni.navigateTo({ @@ -731,7 +735,7 @@ events: { BindOver: function(data) { console.log(data) - these.formData.bleStatu=true; + these.formData.bleStatu = true; } }, success: function(res) { @@ -797,6 +801,7 @@ } }, showPop: function(option) { + hideLoading(this); let def = { showPop: true, //是否显示弹窗 popType: 'custom', @@ -807,14 +812,16 @@ buttonTextColor: '#232323DE', iconUrl: '', message: '', - buttonText: '', + buttonText: '确定', clickEvt: '', visiblePrompt: false, promptTitle: '', modelValue: '', visibleClose: false, okCallback: null, - showSlot: false + showSlot: false, + buttonCancelText: '', + showCancel: false, } let keys = Object.keys(def); @@ -824,14 +831,14 @@ if (key in option) { continue; } - these.Status.Pop[key] = def[key]; + this.Status.Pop[key] = def[key]; } if (option) { keys = Object.keys(option); for (let i = 0; i < keys.length; i++) { let key = keys[i]; - these.Status.Pop[key] = option[key]; + this.Status.Pop[key] = option[key]; } } diff --git a/pages/650/HBY650.vue b/pages/650/HBY650.vue index b3d7e1b..641c8a3 100644 --- a/pages/650/HBY650.vue +++ b/pages/650/HBY650.vue @@ -192,7 +192,7 @@ data() { return { Status: { - + pageHide: false, Pop: { showPop: false, //是否显示弹窗 popType: 'custom', @@ -345,10 +345,10 @@ these.formData.blename = f.name ? f.name : "Unname"; these.formData.deviceName = device.deviceName; these.formData.img = device.devicePic; - these.formData.bleStatu=false; + these.formData.bleStatu = false; these.formData.deviceId = f.deviceId; - ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res=>{ - these.formData.bleStatu=true; + ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { + these.formData.bleStatu = true; }); these.setBleFormData(); these.getDetail(); @@ -490,9 +490,12 @@ return className; }, - bleValueNotify: function(receive, device, path,recArr) { //订阅消息 + bleValueNotify: function(receive, device, path, recArr) { //订阅消息 + if (receive.deviceId !== this.formData.deviceId) { + return; + } console.log("收到设备的数据", receive) - let data = recei.ReceiveData(receive, device, pagePath,recArr); + let data = recei.ReceiveData(receive, device, pagePath, recArr); if (data) { if ("staBlue_picture" in data) { @@ -559,7 +562,7 @@ getDetail() { var that = this; usrApi.getDetail(this.device.id).then(res => { -console.log("res=",res); + console.log("res=", res); if (res && res.code == 200) { res = res.data; let personnelInfo = res.personnelInfo; @@ -684,7 +687,7 @@ console.log("res=",res); borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', - buttonTextColor: '#FFFFFFde', + buttonTextColor: '#232323de', okCallback: function() { uni.navigateTo({ @@ -692,7 +695,7 @@ console.log("res=",res); events: { BindOver: function(data) { console.log(data) - these.formData.bleStatu=true; + these.formData.bleStatu = true; } }, success: function(res) { @@ -1261,17 +1264,47 @@ console.log("res=",res); } }, showPop: function(option) { + hideLoading(this); + let def = { + showPop: true, //是否显示弹窗 + popType: 'custom', + bgColor: '#383934bd', + borderColor: '#BBE600', + textColor: '#ffffffde', + buttonBgColor: '#BBE600', + buttonTextColor: '#232323DE', + iconUrl: '', + message: '', + buttonText: '确定', + clickEvt: '', + visiblePrompt: false, + promptTitle: '', + modelValue: '', + visibleClose: false, + okCallback: null, + showSlot: false, + buttonCancelText: '', + showCancel: false, + } - if (!option) { - option = { - a: 1 - }; - } - let keys = Object.keys(option); - for (var i = 0; i < keys.length; i++) { + let keys = Object.keys(def); + + for (let i = 0; i < keys.length; i++) { let key = keys[i]; - these.Status.Pop[key] = option[key]; + if (key in option) { + continue; + } + this.Status.Pop[key] = def[key]; } + if (option) { + keys = Object.keys(option); + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + + this.Status.Pop[key] = option[key]; + } + } + if (!option.borderColor) { option.borderColor = '#BBE600'; option.buttonBgColor = '#BBE600'; diff --git a/pages/670/HBY670.vue b/pages/670/HBY670.vue index 8159e85..120cf2c 100644 --- a/pages/670/HBY670.vue +++ b/pages/670/HBY670.vue @@ -523,7 +523,7 @@ these.formData['imei'] = these.device.deviceImei; } these.getDetail(); - these.formData.bleStatu=false; + these.formData.bleStatu = false; ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { these.formData.bleStatu = true; }); @@ -531,10 +531,10 @@ }, onShow() { - this.Status.pageHide=false; + this.Status.pageHide = false; }, onHide: function() { - this.Status.pageHide=true; + this.Status.pageHide = true; }, onBackPress(e) { ble.removeReceiveCallback(pagePath); @@ -628,11 +628,12 @@ return; } this.showPop({ - message: "蓝牙未连接过该设备,请使用蓝牙重新添加该设备,取消"+(4-this.Status.bleLinkCnt)+"次后不再提醒", + message: "蓝牙未连接过该设备,请使用蓝牙重新添加该设备,取消" + (4 - this.Status.bleLinkCnt) + "次后不再提醒", iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', + buttonTextColor: '#232323de', showCancel: true, cancelCallback: () => { // this.closePop(); @@ -644,7 +645,7 @@ events: { BindOver: function(data) { console.log(data) - these.formData.bleStatu=true; + these.formData.bleStatu = true; } }, success: function(res) { @@ -983,9 +984,11 @@ this.refreshFormData(receiveData, 'auto'); return receiveData; }, - bleValueNotify: function(receive, device, path,recArr) { //订阅消息 - - let data = recei.ReceiveData(receive, device, pagePath,recArr); + bleValueNotify: function(receive, device, path, recArr) { //订阅消息 + if (receive.deviceId !== this.formData.deviceId) { + return; + } + let data = recei.ReceiveData(receive, device, pagePath, recArr); console.log("收到设备的数据", data) if (data) { if ("staBlue_picture" in data) { @@ -1395,12 +1398,12 @@ 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'; + + if (this.Status.Pop.okCallback) { + these.CloseWarn(false); + these.formData.SOS = 'close'; } - + return; } these.Status.staticWarn.time = these.Status.staticWarn @@ -1433,9 +1436,10 @@ this.Status.staticWarn.time = 0; return; } - if (these.formData.qzwarn && these.Status.staticWarn.inteval && these.Status.staticWarn.time) { + if (these.formData.qzwarn && these.Status.staticWarn.inteval && these.Status.staticWarn + .time) { console.log("222222"); - this.Status.Pop.okCallback=null; + this.Status.Pop.okCallback = null; these.showQzWarn(sendRb); } else { sendRb(); @@ -2170,39 +2174,51 @@ }, showPop: function(option) { hideLoading(this); - let defaultCfg = { - showHeader: false, - headerTxt: "", - showHeader: false, - showCancel: false, - borderColor: '#BBE600', - buttonBgColor: '#BBE600', - okCallback: null, - cancelCallback: null, + let def = { + showPop: true, //是否显示弹窗 popType: 'custom', + bgColor: '#383934bd', + borderColor: '#BBE600', + textColor: '#ffffffde', + buttonBgColor: '#BBE600', + buttonTextColor: '#232323DE', + iconUrl: '', + message: '', buttonText: '确定', + clickEvt: '', + visiblePrompt: false, + promptTitle: '', + modelValue: '', + visibleClose: false, + okCallback: null, + showSlot: false, + buttonCancelText: '', showCancel: false, - buttonCancelText: '取消', - clickEvt: '' - }; - if (!option) { + } - } - let keys = Object.keys(option); - for (var i = 0; i < keys.length; i++) { - let key = keys[i]; - this.Status.Pop[key] = option[key]; - } - keys = Object.keys(defaultCfg); - for (var i = 0; i < keys.length; i++) { + let keys = Object.keys(def); + + for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (key in option) { continue; } - this.Status.Pop[key] = defaultCfg[key]; + this.Status.Pop[key] = def[key]; + } + if (option) { + keys = Object.keys(option); + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + + this.Status.Pop[key] = option[key]; + } } - this.Status.Pop.showPop = true; + if (!option.borderColor) { + option.borderColor = '#BBE600'; + option.buttonBgColor = '#BBE600'; + } + these.Status.Pop.showPop = true; }, sendUsr: function(ReSendNo) { @@ -2338,9 +2354,9 @@ // 获取当前行文字 const text = textLines[currentPacket - 1] || ''; let arr = gbk.encode(text) - console.log("arr=",arr); + console.log("arr=", arr); let gbkData = gbk.arr2hex(arr); - console.log("gbkData=",gbkData); + console.log("gbkData=", gbkData); // 构建数据包 const bufferSize = 5 + gbkData.length / 2; // 头部4字节 + 数据部分 diff --git a/pages/7305/BJQ7305.vue b/pages/7305/BJQ7305.vue index ad56a7a..457046c 100644 --- a/pages/7305/BJQ7305.vue +++ b/pages/7305/BJQ7305.vue @@ -313,7 +313,7 @@ these.formData.img = device.devicePic; these.formData.id = device.id; these.formData.deviceId = f.deviceId; - these.formData.bleStatu=false; + these.formData.bleStatu = false; ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { console.log("连接成功") these.formData.bleStatu = true; @@ -469,7 +469,9 @@ return f; }, bleValueNotify: function(receive, device, path, recArr) { - + if (receive.deviceId !== this.formData.deviceId) { + return; + } if (this.Status.pageHide) { return; } @@ -534,6 +536,7 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', + buttonTextColor: '#232323de', okCallback: function() { console.log("1111"); uni.navigateTo({ @@ -992,39 +995,52 @@ this.Status.Pop.showPop = false; }, showPop: function(option) { - hideLoading(this); - let defaultCfg = { - showHeader: false, - headerTxt: "", - showHeader: false, - showCancel: false, - borderColor: '#BBE600', - buttonBgColor: '#BBE600', - okCallback: null, - cancelCallback: null, + let def = { + showPop: true, //是否显示弹窗 popType: 'custom', + bgColor: '#383934bd', + borderColor: '#BBE600', + textColor: '#ffffffde', + buttonBgColor: '#BBE600', + buttonTextColor: '#232323DE', + iconUrl: '', + message: '', buttonText: '确定', - clickEvt: '' - }; - if (!option) { + clickEvt: '', + visiblePrompt: false, + promptTitle: '', + modelValue: '', + visibleClose: false, + okCallback: null, + showSlot: false, + buttonCancelText: '', + showCancel: false, + } - } - let keys = Object.keys(option); - for (var i = 0; i < keys.length; i++) { - let key = keys[i]; - this.Status.Pop[key] = option[key]; - } - keys = Object.keys(defaultCfg); - for (var i = 0; i < keys.length; i++) { + let keys = Object.keys(def); + + for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (key in option) { continue; } - this.Status.Pop[key] = defaultCfg[key]; + this.Status.Pop[key] = def[key]; + } + if (option) { + keys = Object.keys(option); + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + + this.Status.Pop[key] = option[key]; + } } - this.Status.Pop.showPop = true; + if (!option.borderColor) { + option.borderColor = '#BBE600'; + option.buttonBgColor = '#BBE600'; + } + these.Status.Pop.showPop = true; }, sendUsr() { let f = this.getDevice(); diff --git a/pages/common/addBLE/LinkBle.vue b/pages/common/addBLE/LinkBle.vue index 36da350..b3d95a3 100644 --- a/pages/common/addBLE/LinkBle.vue +++ b/pages/common/addBLE/LinkBle.vue @@ -156,14 +156,39 @@ if (these.device.deviceId == receive.deviceId) { console.log("11111:", receive); these.device.imei = f.imei; - if (receive.bytes[0] == 0xFC || receive.str.indexOf('mac address:') == 0) { + let flag=false; + if (receive.bytes && receive.bytes.length && receive.bytes[0] == 0xFC) {//6155 7305 if (f && f.macAddress) { - these.device.macAddress = f.macAddress; - console.log("222222"); - these.Statu.isSearch = false; - these.initDevice(); + flag=true; + } + } + else if(receive.str.indexOf('mac address:') == 0){//650 670 + if (f && f.macAddress) { + flag=true; + } + } + else{ + try{ + let json=JSON.parse(receive.str); + let key = "sta_address"; + if (key in json) {//100 + if (f && f.macAddress) { + flag=true; + } + } + }catch(err){ + console.log("出现异常,",err); } } + + + if(flag){ + these.device.macAddress = f.macAddress; + console.log("222222"); + these.Statu.isSearch = false; + these.initDevice(); + } + } }, pagePath); eventChannel = this.getOpenerEventChannel(); diff --git a/pages/common/addBLE/addEquip.vue b/pages/common/addBLE/addEquip.vue index 914554d..e5ae397 100644 --- a/pages/common/addBLE/addEquip.vue +++ b/pages/common/addBLE/addEquip.vue @@ -27,7 +27,8 @@ - + @@ -172,73 +173,80 @@ let search = option.search; these = this; eventChannel = this.getOpenerEventChannel(); - // this.EquipMents = [{ - // "RSSI": -55, - // "advertisData": "", - // "advertisServiceUUIDs": [ - // "0000FFE0-0000-1000-8000-00805F9B34FB" - // ], - // "deviceId": "EBDA4E6F-3A28-FF65-A845-AE8CC7B78375", - // "name": "HBY670-BF74EA", - // "linkStatu": false - // }, - // { - // "RSSI": -61, - // "advertisData": "", - // "advertisServiceUUIDs": [ - // "0000FFE0-0000-1000-8000-00805F9B34FB" - // ], - // "deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB", - // "name": "EF4651", - // "linkStatu": false, - // "isTarget": true - // }, - // { - // "RSSI": -69, - // "advertisData": "", - // "advertisServiceUUIDs": [ - // "0000FFE0-0000-1000-8000-00805F9B34FB" - // ], - // "deviceId": "4F0DAC91-4391-CB07-905E-72D7F03EFCD3", - // "name": "4877-BF743D", - // "linkStatu": false - // } - // ]; + const systemInfo = uni.getSystemInfoSync(); + if (systemInfo.uniPlatform == 'web') { + this.EquipMents = [{ + "RSSI": -55, + "advertisData": "", + "advertisServiceUUIDs": [ + "0000FFE0-0000-1000-8000-00805F9B34FB" + ], + "deviceId": "EBDA4E6F-3A28-FF65-A845-AE8CC7B78375", + "name": "HBY670-BF74EA", + "linkStatu": false + }, + { + "RSSI": -61, + "advertisData": "", + "advertisServiceUUIDs": [ + "0000FFE0-0000-1000-8000-00805F9B34FB" + ], + "deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB", + "name": "EF4651", + "linkStatu": false, + "isTarget": true + }, + { + "RSSI": -69, + "advertisData": "", + "advertisServiceUUIDs": [ + "0000FFE0-0000-1000-8000-00805F9B34FB" + ], + "deviceId": "4F0DAC91-4391-CB07-905E-72D7F03EFCD3", + "name": "4877-BF743D", + "linkStatu": false + } + ]; + + + these.PairEquip = [this.EquipMents[0]]; + return; + } let StartSubsrib = () => { these.EquipMents = []; ble = bleTool.getBleTool(); //蓝牙不可用的回调 - ble.addStateBreakCallback(res=>{ + ble.addStateBreakCallback(res => { if (these.Status.isPageHidden) { return; } console.log("处理蓝牙不可用"); hideLoading(these); - these.PairEquip=[]; - these.EquipMents=[]; + these.PairEquip = []; + these.EquipMents = []; uni.showToast({ - icon:'fail', - title:'蓝牙已不可用' + icon: 'fail', + title: '蓝牙已不可用' }); these.showOpenSetting(); - - },pagePath); + + }, pagePath); //蓝牙再次可用的回调 - ble.addStateRecoveryCallback(res=>{ + ble.addStateRecoveryCallback(res => { if (these.Status.isPageHidden) { return; } uni.showToast({ - icon:'success', - title:'蓝牙恢复可用' + icon: 'success', + title: '蓝牙恢复可用' }); these.Status.BottomMenu.show = false; - these.EquipMents=[]; + these.EquipMents = []; these.refreshBleList(); - },pagePath); - + }, pagePath); + //蓝牙断开连接的回调 ble.addDisposeCallback(res => { if (these.Status.isPageHidden) { @@ -469,9 +477,9 @@ } hideLoading(these); - - eventChannel.emit('BindOver',these.device); - + + eventChannel.emit('BindOver', these.device); + ble.updateCache(); uni.navigateBack(); return true; @@ -941,4 +949,9 @@ color: #232323; } + + .filterNone { + filter: none !important; + -webkit-filter: none !important; + } \ No newline at end of file diff --git a/utils/BleHelper.js b/utils/BleHelper.js index 9e65d02..ac03070 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -33,15 +33,18 @@ class BleHelper { if (linkedDevices && linkedDevices.length && linkedDevices.length > 0) { // console.log("111111", linkedDevices); linkedDevices = linkedDevices.filter((v) => { - if(v){ + if (v) { v.Linked = false; v.notifyState = false; - } - return v?true:false; + } + return v ? true : false; }); } + const systemInfo = uni.getSystemInfoSync(); + + setTimeout(() => { this.OpenBlue().then(() => { @@ -55,8 +58,8 @@ class BleHelper { discovering: false, //蓝牙是否正在搜索 searchList: [], //已搜索到的设备列表, isSubscribe: false, //是否开启了订阅 - LinkedList: linkedDevices //已连接的设备列表 - + LinkedList: linkedDevices, //已连接的设备列表 + platform: systemInfo.uniPlatform } this.cfg = { onDeviceFound: [], //发现新设备的事件 @@ -169,7 +172,9 @@ class BleHelper { //连接所有已连接过的设备 linkAllDevices() { // console.log("模块启动时,自动连接已连接过的设备", this.data.LinkedList); - + if(this.data.platform=='web'){ + return; + } if (this.data.LinkedList && this.data.LinkedList.length > 0) { let flag = false; for (var i = 0; i < this.data.LinkedList.length; i++) { @@ -424,7 +429,12 @@ class BleHelper { //获取蓝牙适配器状态 CheckBlue() { - + if (this.data.platform == 'web') { + return Promise.resolve({ + available: true, + discovering: false + }); + } return new Promise((resolve, reject) => { if (this.data.available) { // console.log("蓝牙模块是可用状态"); @@ -463,6 +473,12 @@ class BleHelper { //打开蓝牙适配器 OpenBlue() { + if (this.data.platform == 'web') { + this.data.isOpenBlue = true; + this.data.available = true; + this.data.isSubscribe = true; + return Promise.resolve(true); + } var init = () => { return new Promise((resolve, reject) => { if (this.data.isOpenBlue) { @@ -678,6 +694,7 @@ class BleHelper { } let header = "mac address:"; + let isUpdate = false; if (str.indexOf(header) == 0) { //650以文本传输mac console.log("str=", str); this.data.LinkedList.find((v) => { @@ -698,10 +715,11 @@ class BleHelper { .macAddress) } }); - this.updateCache(); + isUpdate = true; + } - if (str.indexOf('imei:') == 0) { + if (str.indexOf('imei:') == 0) { //670以此方式传输imei let imei = str.split(':')[1]; @@ -709,9 +727,10 @@ class BleHelper { if (v.deviceId == receive .deviceId) { v.imei = imei; + isUpdate = true; } }); - this.updateCache(); + } @@ -725,17 +744,48 @@ class BleHelper { if (v.deviceId == receive .deviceId) { v.macAddress = mac; - // console.log("收到mac地址:", str) + isUpdate = true; } }); - this.updateCache(); + } } + + try { + let receivJson = JSON.parse(str); + let key = "sta_address"; //HBY100以此方式上传mac地址 + if (key in receivJson) { + this.data.LinkedList.find((v) => { + if (v.deviceId == receive + .deviceId) { + let macStr = receivJson[ + key]; + if (macStr.includes(':')) { + v.macAddress = macStr; + } else { + v.macAddress = macStr + .replace(/(.{2})/g, + '$1:').slice(0, + -1) + } + + isUpdate = true; + } + }); + + } + } catch (convertException) { + console.error("文本无法转json", convertException) + } + + if (isUpdate) { + this.updateCache(); + } // console.log("str1=", str); } catch (ex) { console.error("将数据转文本失败", ex); } - + try { console.log("11111"); let recData = { @@ -746,7 +796,7 @@ class BleHelper { str: str, hexs: hexs }; - console.log("监听到特征值:" + JSON.stringify(recData)); + console.log("监听到特征值:" + JSON.stringify(recData)); if (this.cfg.receivDataCallback) { if (this.cfg.receivDataCallback.length > 0) { @@ -771,10 +821,10 @@ class BleHelper { } }) } else { - console.log("无人订阅消息"); + console.log("无人订阅消息"); } } else { - console.log("无人订阅receivDataCallback,不处理数据"); + console.log("无人订阅receivDataCallback,不处理数据"); } } catch (ex) { console.error("处理订阅消息失败,ex=", ex); @@ -811,6 +861,14 @@ class BleHelper { } //关闭蓝牙适配器 CloseBlue() { + if (this.data.platform == 'web') { + this.data.available = false; + this.data.discovering = false; + this.data.isOpenBlue = false; + this.data.searchList = []; + + return Promise.resolve(); + } return new Promise((resolve, reject) => { this.data.available = false; this.data.discovering = false; @@ -842,6 +900,9 @@ class BleHelper { //开始搜索新设备 StartSearch() { + if (this.data.platform == 'web') { + return Promise.resolve({}); + } this.data.searchList = []; var these = this; //开始搜索 @@ -902,6 +963,9 @@ class BleHelper { //停止搜索 StopSearch() { + if (this.data.platform == 'web') { + return Promise.resolve(); + } let p1 = new Promise((resolve, reject) => { uni.stopBluetoothDevicesDiscovery({ success: (res) => { @@ -1225,8 +1289,8 @@ class BleHelper { } setTimeout(function() { startgetService(id); - - }, 100+repeatCnt*300); + + }, 100 + repeatCnt * 300); } }, fail: (ex) => { @@ -1341,7 +1405,9 @@ class BleHelper { //连接某个设备 LinkBlue(deviceId, targetServiceId, writeCharId, notifyCharId, maxRetries) { - + if(this.data.platform=='web'){ + return Promise.resolve(true); + } if (maxRetries === undefined) { maxRetries = 0; // 最大重试次数 } @@ -1414,11 +1480,11 @@ class BleHelper { // .LinkedList); // 处理 MTU 设置 - if (plus.os.name === 'Android') { + if (plus.os.name === 'Android') { this.setMtu(deviceId); - } - resolve(true); - + } + resolve(true); + }).catch((ex) => { reject(this.getError(ex)); }); @@ -1502,9 +1568,9 @@ class BleHelper { } - - setMtu(deviceId){ - let prom=new Promise((_succ,_err)=>{ + + setMtu(deviceId) { + let prom = new Promise((_succ, _err) => { uni.setBLEMTU({ deviceId: deviceId, mtu: 512, @@ -1514,12 +1580,13 @@ class BleHelper { }, fail: (ex) => { console.error( - "mtu设置失败",ex); - ex=this.getError(ex); + "mtu设置失败", ex); + ex = this.getError(ex); _err( ex ); // MTU设置失败不影响连接成功 - },complete(){ + }, + complete() { console.log("设置mtu完毕"); } }); @@ -1528,6 +1595,9 @@ class BleHelper { } //断开连接 disconnectDevice(deviceId) { + if(this.data.platform=='web'){ + return Promise.resolve(); + } var disconnect = (id) => { return new Promise((resolve, reject) => { uni.closeBLEConnection({ @@ -1587,11 +1657,11 @@ class BleHelper { } //向蓝牙设备发送一个字符串的ASCII码 sendString(deviceid, str, writeServiceId, wirteCharactId, ms) { - if(str && typeof(str)=='object'){ - str=JSON.stringify(str); + if (str && typeof(str) == 'object') { + str = JSON.stringify(str); } if (str) { - + let buffer = new ArrayBuffer(str.length); let dataView = new DataView(buffer); @@ -1631,7 +1701,9 @@ class BleHelper { } //向蓝牙设备发送数据,如果没连接将自动连接后再发 sendData(deviceid, buffer, writeServiceId, wirteCharactId, ms) { - + if (this.data.platform == 'web') { + return Promise.resolve("h5平台默认成功"); + } // console.log("deviceid=" + deviceid + ",writeServiceId=" + writeServiceId + ",wirteCharactId=" + // wirteCharactId + ",timeout=" + ms) if (ms === undefined) { diff --git a/utils/BleReceive.js b/utils/BleReceive.js index df86874..3897d3f 100644 --- a/utils/BleReceive.js +++ b/utils/BleReceive.js @@ -7,6 +7,7 @@ class BleReceive { '/pages/650/HBY650': this.Receive_650.bind(this), '/pages/670/HBY670': this.Receive_670.bind(this), '/pages/4877/BJQ4877': this.Receive_4877.bind(this), + '/pages/100/HBY100': this.Receive_4877.bind(this) }; } @@ -519,6 +520,8 @@ class BleReceive { return receiveData; } + + } diff --git a/utils/Common.js b/utils/Common.js index db0ae79..5fa6c55 100644 --- a/utils/Common.js +++ b/utils/Common.js @@ -280,5 +280,33 @@ export default { } } return arr; + }, + //10进制转换为16进制字符串 + decimalToHexLittleEndian(num, byteCount,revers) { + // 处理负数(如果需要支持负数,可先转为补码) + if (num < 0) { + num = 0xFFFFFFFF + num + 1; + } + + // 转为16进制,去除前缀0x,转为大写 + let hex = num.toString(16).toUpperCase(); + + // 计算需要补充的0的数量,确保每个字节占2位 + let padLength = (byteCount || Math.ceil(hex.length / 2) * 2) - hex.length; + if (padLength > 0) { + hex = '0'.repeat(padLength) + hex; + } + + // 分割为字节数组(每2位一个字节) + const bytes = []; + for (let i = 0; i < hex.length; i += 2) { + bytes.push(hex.substr(i, 2)); + } + + // 是否反转字节顺序(低位在前)并拼接 + if(revers){ + return bytes.reverse().join(''); + } + return bytes.join(''); } } \ No newline at end of file