diff --git a/manifest.json b/manifest.json index f4b7d3c..7c5ff47 100644 --- a/manifest.json +++ b/manifest.json @@ -56,7 +56,8 @@ "", "", "", - "" + "", + "" ], "minSdkVersion" : 21, "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ], diff --git a/pages/100J/HBY100-J.vue b/pages/100J/HBY100-J.vue index 518460e..c9b7e72 100644 --- a/pages/100J/HBY100-J.vue +++ b/pages/100J/HBY100-J.vue @@ -50,7 +50,8 @@ 蓝牙状态 - {{device.getbleStatu}} + {{getbleStatu}} 设备状态 @@ -469,6 +470,17 @@ onLoad: function() { const eventChannel = this.getOpenerEventChannel(); var these = this; + + this.$watch("deviceInfo.batteryPercentage", (newVal, oldVal) => { + if (newVal <= 20) { + uni.showToast({ + title: '设备电量低', + icon: 'none', + duration: 2000 + }); + } + + }); eventChannel.on('detailData', function(data) { var device = data.data; these.device = device; @@ -609,7 +621,9 @@ } // 尝试连接蓝牙:需先扫描获取 BLE deviceId,不能直接用 MAC;延迟 500ms 确保蓝牙适配器就绪 if (data.data.deviceMac) { - setTimeout(() => { these.tryConnect100JBle(data.data.deviceMac); }, 500); + setTimeout(() => { + these.tryConnect100JBle(data.data.deviceMac); + }, 500); } }); this.createThrottledFunctions(); @@ -641,10 +655,53 @@ this.Status.pageHide = false; }, computed: { - + getbleStatu() { + if (this.formData.bleStatu === true) { + return '已连接'; + } + if (this.formData.bleStatu === 'connecting') { + return '连接中'; + } + if (this.formData.bleStatu === 'dicconnect') { + return '正在断开'; + } + if (this.formData.bleStatu === 'err') { + return '连接异常'; + } + return '未连接'; + } }, methods: { + bleStatuToggle() { + let f = bleTool.data.LinkedList.find((v) => { + return v.macAddress == this.device.deviceMac; + }); + + if (!f) { + this.tryConnect100JBle(this.device.deviceMac); + return; + } + if (this.formData.bleStatu === true) { + this.formData.bleStatu = 'dicconnect'; + bleTool.disconnectDevice(f.deviceId).finally(r => { + this.formData.bleStatu = false; + }); + return; + } + + if (this.formData.bleStatu === false || this.formData.bleStatu === 'err') { + this.formData.bleStatu = 'connecting'; + bleTool.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { + these.formData.bleStatu = true; + }).catch(ex => { + these.formData.bleStatu = 'err'; + }); + return; + } + + + }, createThrottledFunctions() { // 创建节流函数 this.throttledBrightnessChange = this.throttle(this.handleBrightnessChange, 500); @@ -1014,20 +1071,31 @@ const NOTIFY = '0000AE02-0000-1000-8000-00805F9B34FB'; if (cached && cached.deviceId) { console.log('[100J] 使用缓存设备连接', cached.deviceId); + that.formData.bleStatu = 'connecting'; bleTool.LinkBlue(cached.deviceId, SVC, WRITE, NOTIFY, 2).then(() => { console.log('100J 蓝牙连接成功(缓存)'); - that.bleStateRecovry({ deviceId: cached.deviceId }); + that.formData.bleStatu = true; + that.bleStateRecovry({ + deviceId: cached.deviceId + }); }).catch(err => { console.log('100J 蓝牙连接失败(缓存),尝试扫描', err); + that.formData.bleStatu = 'err'; that.connect100JByScan(deviceMac, last6); }); return; } // 2. 无缓存:先尝试直连。Android 上 deviceId 多为 MAC 反序(11:22:33:44:55:02->02:55:44:33:22:11) + that.formData.bleStatu = 'connecting'; const tryDirect = (id) => bleTool.LinkBlue(id, SVC, WRITE, NOTIFY, 2).then(() => { console.log('100J 蓝牙连接成功(直连)', id); - that.bleStateRecovry({ deviceId: id }); + that.formData.bleStatu = true; + that.bleStateRecovry({ + deviceId: id + }); + }).catch(ex => { + that.formData.bleStatu = 'err'; }); const deviceIdReversed = macToDeviceId(deviceMac); console.log('[100J] 尝试直连', deviceIdReversed, '(MAC反序)'); @@ -1070,11 +1138,16 @@ bleTool.StopSearch(); bleTool.removeDeviceFound('HBY100J_SCAN'); console.log('[100J] 扫描到目标设备', match.name, match.deviceId); + that.formData.bleStatu = 'connecting'; bleTool.LinkBlue(match.deviceId, SVC, WRITE, NOTIFY, 2).then(() => { console.log('100J 蓝牙连接成功(扫描)'); - that.bleStateRecovry({ deviceId: match.deviceId }); + that.formData.bleStatu = true; + that.bleStateRecovry({ + deviceId: match.deviceId + }); }).catch(err => { console.log('100J 蓝牙连接失败,将使用4G', err); + that.formData.bleStatu = 'err'; }); } }, 'HBY100J_SCAN'); @@ -1091,6 +1164,7 @@ }); }, bleStateBreak() { + this.formData.bleStatu = false; updateBleStatus(false, '', this.deviceInfo.deviceId); }, bleStateRecovry(res) { @@ -1115,7 +1189,8 @@ previewImg(img) {}, bleValueNotify: function(receive, device, path, recArr) { //订阅消息 // 仅处理当前设备的数据(device 为 LinkedList 中匹配 receive.deviceId 的项) - if (device && device.device && this.deviceInfo.deviceId && device.device.id != this.deviceInfo.deviceId) return; + if (device && device.device && this.deviceInfo.deviceId && device.device.id != this.deviceInfo + .deviceId) return; // 解析蓝牙上报数据 (协议: FC=MAC主动上报, FB=指令响应) if (!receive.bytes || receive.bytes.length < 3) return; const parsedData = parseBleData(receive.bytes); @@ -1144,9 +1219,7 @@ this.$set(this.deviceInfo, 'batteryRemainingTime', parsedData.batteryRemainingTime); } - if (this.deviceInfo.batteryPercentage <= 20) { - uni.showToast({ title: '设备电量低', icon: 'none', duration: 2000 }); - } + // 设备物理按键切换:蓝牙响应同步到 APP 页面(与 4G MQTT 逻辑一致) const fc = parsedData.funcCode; @@ -1191,13 +1264,17 @@ else if (this.formData.sta_VoiceType === '7') this.formData.sta_VoiceType = '-1'; } if (parsedData.volume !== undefined) this.formData.volume = parsedData.volume; - if (parsedData.strobeFrequency !== undefined) this.formData.strobeFrequency = parsedData.strobeFrequency; - if (parsedData.redBrightness !== undefined) this.formData.lightBrightness = parsedData.redBrightness; + if (parsedData.strobeFrequency !== undefined) this.formData.strobeFrequency = parsedData + .strobeFrequency; + if (parsedData.redBrightness !== undefined) this.formData.lightBrightness = parsedData + .redBrightness; } // 0x09 音量、0x0D 亮度:单独响应时同步 if (fc === 0x09 && parsedData.volume !== undefined) this.formData.volume = parsedData.volume; - if (fc === 0x0B && parsedData.strobeFrequency !== undefined) this.formData.strobeFrequency = parsedData.strobeFrequency; - if (fc === 0x0D && parsedData.redBrightness !== undefined) this.formData.lightBrightness = parsedData.redBrightness; + if (fc === 0x0B && parsedData.strobeFrequency !== undefined) this.formData.strobeFrequency = parsedData + .strobeFrequency; + if (fc === 0x0D && parsedData.redBrightness !== undefined) this.formData.lightBrightness = parsedData + .redBrightness; }, showBleUnConnect() {}, diff --git a/pages/102/HBY102.vue b/pages/102/HBY102.vue index 4f74e42..d7c368e 100644 --- a/pages/102/HBY102.vue +++ b/pages/102/HBY102.vue @@ -60,12 +60,12 @@ 蓝牙状态 - {{getbleStatu}} + {{getbleStatu}} + + + 信道:{{formData.sta_Channel}} + 修改 - @@ -177,7 +177,14 @@ :iconUrl="Status.Pop.iconUrl" :message="Status.Pop.message" :buttonText="Status.Pop.buttonText" @buttonClick="HidePop" :visiblePrompt="Status.Pop.visiblePrompt" :promptTitle="Status.Pop.promptTitle" v-model="Status.Pop.modelValue" @closePop="closePop" :buttonCancelText="Status.Pop.buttonCancelText" - :showCancel="Status.Pop.showCancel" @cancelPop="closePop" /> + :showCancel="Status.Pop.showCancel" @cancelPop="closePop" :showSlot="Status.Pop.showSlot"> + + 修改信道 + + + + @@ -221,6 +228,7 @@ curr: 0, total: 0, pageHide: false, + ShowEditChannel: false, Pop: { showPop: false, //是否显示弹窗 popType: 'custom', @@ -325,8 +333,8 @@ warnTime: '', sta_sosadd: "", sta_sosName: '', - sta_IntrusTime: '' - + sta_IntrusTime: '', + ins_Channel:23 }, dic: { sta_LightType: [ @@ -519,7 +527,7 @@ }); } - this.getLinkedCnt(); + // this.getLinkedCnt(); }, computed: { Distance: function() { @@ -561,6 +569,73 @@ } }, methods: { + onChannelChanging() { + + let f = this.getDevice(); + // #ifdef APP-PLUS + if (!f) { + this.showBleUnConnect(); + return; + } + // #endif + + let regex = /^([1-9]|[1-7][0-9]|80)$/; + if (!regex.test(this.formData.ins_Channel)) { + uni.showModal({ + title: '提示', + content: '只能输入1-80整数' + }); + return; + } + var buffer = { + ins_Channel: this.formData.ins_Channel + } + ble.sendString(f.deviceId, buffer); + }, + ShowChannelEdit() { + + if (!this.permissions.includes('55') && this.Status.apiType !== 'listA') { + + this.showPop({ + message: '无操作权限', + iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", + borderColor: "#e034344d", + buttonBgColor: "#E03434", + okCallback: null, + buttonText: "确定" + }) + return; + } + + this.Status.ShowEditChannel = true; + this.showPop({ + 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: () => { + this.onChannelChanging(); + this.Status.ShowEditChannel = false; + }, + showSlot: true, + buttonCancelText: '取消', + showCancel: true, + cancelCallback: () => { + this.Status.ShowEditChannel = false; + } + }); + }, getLinkedCnt() { //获取在线设备的数量 let f = this.getDevice(); @@ -2266,4 +2341,30 @@ /deep/ .uni-navbar--fixed { top: 0px; } + + .popup-prompt-input { + + width: 100%; + height: 60rpx; + line-height: 60rpx; + color: rgba(255, 255, 255, 0.87); + box-sizing: border-box; + border-bottom: 2rpx solid rgba(255, 255, 255, 0.4); + font-size: 28rpx; + font-weight: 400; + letter-spacing: 0.14px; + } + + .popup-prompt-input-placeHolder { + color: rgba(255, 255, 255, 0.4); + + font-family: PingFang SC; + font-size: 28rpx; + font-weight: 400; + + letter-spacing: 0.14px; + text-align: center; + + } + \ No newline at end of file diff --git a/pages/102/HBY102_History.vue b/pages/102/HBY102_History.vue index fc8fd88..4f0fd24 100644 --- a/pages/102/HBY102_History.vue +++ b/pages/102/HBY102_History.vue @@ -10,8 +10,8 @@ - - 连接记录 + 报警记录 @@ -90,7 +90,7 @@ 近三个月 近一个月 + @click.stop="mothItemChange('monthOne')" >近一个月 自定义 @@ -204,7 +204,7 @@ filterMode: true, //是否筛选日期 filterDayMode: 'end', //当前筛选的是开始还是结束 filterDayType: 'customer', //当前筛选的日期是哪种类型 - tabType: 'link', + tabType: 'warn', datePickValue: [999, 999, 999] //日期选择控件绑定的值 @@ -251,10 +251,10 @@ let eventChannel = this.getOpenerEventChannel(); - eventChannel.on('detailData', function(data) { + eventChannel.on('detailData', (data)=> { var device = data.data; - these.device = device; - these.tabChange('link'); + this.device = device; + this.tabChange('warn'); }); @@ -304,7 +304,7 @@ let today = new Date(); let end = Common.DateFormat(today, 'yyyy-MM-dd'); - let start = Common.DateFormat(today.setMonth(diff), 'yyyy-MM-dd'); + let start = Common.DateFormat(today.setMonth(today.getMonth()+ diff), 'yyyy-MM-dd'); this.filter.start = start; this.filter.end = end; @@ -595,7 +595,9 @@ if (!these.Status.filterMode) { if (these.filter.MM) { start = new Date(these.filter.MM + '-01'); - end = start.setMonth(1); + end = new Date(these.filter.MM + '-01') + end.setMonth(end.getMonth()+1); + end.setDate(end.getDate()+1); data = data.filter(v => { let t = v.linkEqs[0].linkTime @@ -613,7 +615,7 @@ console.log("these.filter.end=",these.filter.end); start = new Date(these.filter.start); end = new Date(these.filter.end); - end.setMonth(1); + end.setDate(end.getDate()+1); console.log("start=",start); console.log("end=",end); if(start && end){ @@ -643,7 +645,8 @@ return t >= start; }); } else if (these.filter.end) { - end = new Date(these.filter.end).setMonth(1); + end = new Date(these.filter.end); + end.setDate(end.getDate()+1); data = data.filter(v => { @@ -680,7 +683,7 @@ if (systemInfo.uniPlatform == 'web') { for (let i = 0; i < 20; i++) { - const timestamp = 1710072900000 + (i * 3600000); // 每小时递增 + const timestamp = new Date().getTime() - (i * 3600000); // 每小时递增 const numItems = Math.floor(Math.random() * 5) + 1; // 1-5条 const item = { @@ -740,7 +743,8 @@ console.log("hese.filter.end=" + these.filter.end); let start = new Date(these.filter.start); let end = new Date(these.filter.end); - end.setMonth(1); + + end.setDate(end.getDate()+ 1); data = data.filter(v => { let t = v.warnTime @@ -748,7 +752,7 @@ t = new Date(v.warnTime); } - return t >= start && t <= end; + return t >= start && t < end; }); } else if (these.filter.start) { let start = new Date(these.filter.start); @@ -762,7 +766,8 @@ return t >= start; }); } else if (these.filter.end) { - let end = new Date(these.filter.end).setMonth(1); + let end = new Date(these.filter.end); + end.setDate(end.getDate()+ 1); data = data.filter(v => { let t = v.warnTime if (!(t instanceof Date)) { @@ -774,7 +779,9 @@ } else { if (these.filter.MM) { let start = new Date(these.filter.MM + '-01'); - let end = start.setMonth(1); + let end = new Date(these.filter.MM + '-01'); + end.setMonth(end.getMonth()+1); + end.setDate(end.getDate()+1); data = data.filter((v) => { let t = v.warnTime if (!(t instanceof Date)){ diff --git a/pages/6155/BJQ6155.vue b/pages/6155/BJQ6155.vue index eb8d161..c4f0b0f 100644 --- a/pages/6155/BJQ6155.vue +++ b/pages/6155/BJQ6155.vue @@ -824,7 +824,7 @@ let packetData = these.rgb565Data.slice(startIndex, endIndex); // 构建数据包 - let bufferSize = os == 'Android' ? 505 :133; // 5 + packetData.length * 2; // 头部5字节 + 数据部分 + let bufferSize = os ==packetSize.length*2+5; // 5 + packetData.length * 2; // 头部5字节 + 数据部分 let buffer = new ArrayBuffer(bufferSize); let dataView = new DataView(buffer); diff --git a/utils/BleHelper.js b/utils/BleHelper.js index fe08a96..f700c1c 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -995,15 +995,15 @@ class BleHelper { // console.log("发现新设备",item.name+" "+item.RSSI); // } - let f = serviceDic.find(v => { - return item.advertisServiceUUIDs - .includes(v.serviceId); - }); - if (f) { + let f = serviceDic.find(v => { + return item.advertisServiceUUIDs + .includes(v.serviceId); + }); + if (f) { // console.log("发现目标设备:", item); arr.push(item); - } + } } if (arr.length === 0) { diff --git a/utils/Common.js b/utils/Common.js index e4be06d..58f0695 100644 --- a/utils/Common.js +++ b/utils/Common.js @@ -340,7 +340,7 @@ export default { value: "55", label: "修改信道", checked: false, - type: ['4877'] + type: ['4877','102'] }, { value: "56",