diff --git a/App.vue b/App.vue index 3346b2f..8c8c38c 100644 --- a/App.vue +++ b/App.vue @@ -9,32 +9,34 @@ export default { onLaunch: function() { - //以下代码仅在开发时使用,否则会出现不可预知的问题。 - //清除登陆之外的所有信息; - // let store=uni.getStorageInfoSync(); - // store.keys.forEach((val,index,array)=>{ - // if(val=="tokenTime"){ - // let time=uni.getStorageSync(val); - // if(!time){ - // time=0; - // } - // let currTime=new Date().getTime(); - // if(currTime>=time){ - // uni.removeStorageSync(val); - // uni.removeStorageSync("token"); - // uni.removeStorageSync("clientID"); - // } - // } - // else if(val=="token" || val=="clientID" || val=='phone'){ - // console.log("忽略登陆信息"); - // }else{ - // uni.removeStorageSync(val); - // } - // }); - // uni.clearStorageSync(); - //以上代码仅在开发时使用,否则会出现不可预知的问题。 - + // #ifdef APP|APP-PLUS + let appid = plus.runtime.appid; + console.log("appid=", appid); + + if (appid === 'HBuilder') { + let store = uni.getStorageInfoSync(); + store.keys.forEach((val, index, array) => { + if (val == "tokenTime") { + let time = uni.getStorageSync(val); + if (!time) { + time = 0; + } + let currTime = new Date().getTime(); + if (currTime >= time) { + uni.removeStorageSync(val); + uni.removeStorageSync("token"); + uni.removeStorageSync("clientID"); + } + } else if (val == "token" || val == "clientID" || val == 'phone') { + console.log("忽略登陆信息"); + } else { + uni.removeStorageSync(val); + } + }); + } + + let system = uni.getSystemInfoSync(); diff --git a/pages.json b/pages.json index b688c26..c31d80a 100644 --- a/pages.json +++ b/pages.json @@ -365,7 +365,8 @@ "path" : "pages/018A/HBY018A", "style" : { - "navigationBarTitleText" : "HBY018A" + "navigationBarTitleText" : "HBY018A", + "navigationStyle": "custom" } }, { diff --git a/pages/018A/HBY018A.vue b/pages/018A/HBY018A.vue index 6378a92..db9752f 100644 --- a/pages/018A/HBY018A.vue +++ b/pages/018A/HBY018A.vue @@ -37,6 +37,10 @@ 设备名称 {{device.deviceName}} + + IMEI + {{device.deviceImei}} + Mac地址 {{device.deviceMac}} @@ -57,12 +61,12 @@ 定位信息 - {{formData.sta_longitude}} + {{formData?formData.sta_longitude:""}} - {{formData.sta_latitude}} + {{formData?formData.sta_latitude:""}} @@ -70,7 +74,7 @@ - {{formData.address}} + {{formData?formData.address:''}} @@ -318,10 +322,11 @@ let eventChannel = this.getOpenerEventChannel(); eventChannel.on('detailData', (data) => { - + this.initWatch(); // console.log("收到父页面的参数:" + JSON.stringify(data)); var device = data.data; these.device = device; + these.Status.apiType = data.apiType; if (data.apiType !== 'listA') { Common.getdeviceShareId(data.data.id).then(res => { if (res.code == 200) { @@ -364,7 +369,7 @@ these.setBleFormData(); - this.initWatch(); + }); }, @@ -736,7 +741,7 @@ console.log("this.formData[key] =", this.formData[key]); } }, - bleSend(json, validWarn = true) { + bleSend(json, validWarn = true,bleLink) { return new Promise((resolve, reject) => { if (this.formData.sta_ShakeBit != '' && this.formData.sta_ShakeBit != '0' && validWarn) { reject({ @@ -750,8 +755,10 @@ reject({ code: -1 }); - - this.showBleUnConnect(); + if(bleLink){ + this.showBleUnConnect(); + } + return; } @@ -882,10 +889,8 @@ let json = { ins_Side_Light: val } - this.bleSend(json, true).then(() => {}).catch(ex => { - if (ex.code == -1) { - return; - } + this.bleSend(json, true,false).then(() => {}).catch(ex => { + console.log("蓝牙发送失败,尝试用mq发送"); this.mqSend(json, true).catch(err => { if (err.code == -1) { @@ -933,10 +938,8 @@ ins_ShakeBit: type }; - this.bleSend(json, false).catch(ex => { - if (ex.code == -1) { - return; - } + this.bleSend(json, false,false).catch(ex => { + this.mqSend(json, false).catch(err => { if (err.code == -1) { diff --git a/pages/210/HBY210.vue b/pages/210/HBY210.vue index 08b0642..c7288db 100644 --- a/pages/210/HBY210.vue +++ b/pages/210/HBY210.vue @@ -29,7 +29,7 @@ 电量 - + @@ -118,8 +118,7 @@ - + @@ -128,7 +127,7 @@ 雷达感应 - {{formData.sta_RadarType==0?'关闭':formData.sta_RadarType+'M'}} + {{RadarType}} @@ -146,17 +145,15 @@ {{formData.sta_InfraRed=='1'?'开启':'关闭'}} - - + + - - + + 开机画面 - + @@ -173,32 +170,35 @@ 单位: - - - - 部门: - 姓名: - + + 部门: + + + ID: - - - - - - + + + + + @@ -228,7 +228,8 @@ import Common from '@/utils/Common.js'; import BleTool from '@/utils/BleHelper.js' import BleReceive from '@/utils/BleReceive'; - + import SendBatchData from '@/utils/SendBatchData.js'; + var batchTool = null; var eventChannel = null; var these = null; @@ -262,7 +263,7 @@ }, usrToggle: true, bleLinkCnt: 0, - PictureMenu:{ + PictureMenu: { show: false, showHeader: true, menuItems: [{ @@ -360,17 +361,17 @@ deviceId: "", bleStatu: false, - sta_AlarmTime:0, + sta_AlarmTime: 0, sta_PowerPercent: "", sta_PowerTime: "", - sta_SOSGrade:0, + sta_SOSGrade: 0, sta_longitude: "", sta_latitude: "", sta_system: "", //设备状态,0关机,1仅充电,2开机未充电,3,开机且充电 sta_RadarType: "", sta_ShakeBit: 0, //报警状态 - sta_InfraRed:0, - textLines: ['湖北星汉文化', '有限', '公司','12345678'] + sta_InfraRed: 0, + textLines: ['湖北星汉文化', '有限', '公司', '12345678'] }, device: { id: "", @@ -393,13 +394,13 @@ }, permissions: [], -inteval:80 + inteval: 80 } }, computed: { - AlarmTime(){ - if(this.formData.sta_AlarmTime){ - return Common.formatTime(this.formData.sta_AlarmTime,"second"); + AlarmTime() { + if (this.formData.sta_AlarmTime) { + return Common.formatTime(this.formData.sta_AlarmTime, "second"); } return ""; }, @@ -420,8 +421,8 @@ inteval:80 return v == this.formData.sta_ShakeBit; }); if (f) { - let str= dic[f] - + let str = dic[f] + return str; } return ""; @@ -455,6 +456,19 @@ inteval:80 if (this.formData.sta_system == '3') { return '开机充电中' } + }, + + RadarType(){ + + let f=this.Status.BottomMenu.menuItems.find(v=>{ + return v.value==this.formData.sta_RadarType; + }); + + if(f){ + return f.text; + } + + return '关闭'; } }, created() { @@ -564,64 +578,76 @@ inteval:80 }, methods: { - showAction(type){ - if(type=='BottomMenu'){ - this.Status.BottomMenu.show = true; - this.Status.PictureMenu.show=false; - this.Status.BottomMenu.menuItems.find((v,i)=>{ - if(this.formData.sta_RadarType==v.value){ - this.Status.BottomMenu.activeIndex=i; - return true; - } - }) ; - }else{ - this.Status.PictureMenu.show=true; + showAction(type) { + if (type == 'BottomMenu') { + this.Status.BottomMenu.show = true; + this.Status.PictureMenu.show = false; + this.Status.BottomMenu.menuItems.find((v, i) => { + if (this.formData.sta_RadarType == v.value) { + this.Status.BottomMenu.activeIndex = i; + return true; + } + }); + } else { + this.Status.PictureMenu.show = true; this.Status.BottomMenu.show = false; + this.Status.PictureMenu.activeIndex=0; } - + }, - btnPictureClick(li,i){ + btnPictureClick(li, i) { let f = this.getDevice(); if (!f) { this.showBleUnConnect(); return; } this.Status.PictureMenu.show = false; - - - console.log("li=",li) - if (li.value == 'img') { - //照片 - these.sendImg(); - } else { - //视频 - these.checkSendVideo(); + + if (!batchTool) { + batchTool = new SendBatchData(these, f, ble); } + + if (li.value == 'img') { + // sendImagePackets(index); + batchTool.SendImg(); + } else { + // sendVideoPackets(index); + batchTool.SendVideo(504); + } + + // console.log("li=",li) + // if (li.value == 'img') { + // //照片 + // these.sendImg(); + // } else { + // //视频 + // these.checkSendVideo(); + // } }, checkSendVideo() { - + if (!this.permissions.includes('3') && this.Status.apiType !== 'listA') { - + MsgError('无操作权限', '确定', these); return; } - + let f = this.getDevice(); - + let timeDelayCloseLoading = () => { setTimeout(() => { hideLoading(these); }, 1500); } - - + + let sendVideoPackets = (ReSendNo) => { console.log("开始发送分片数据"); return new Promise((resolve, reject) => { if (f) { // 总数据包数 var totalPackets = 1536; //36; - + let currentPacket = 1; console.log("发送数据准备中,总共" + totalPackets); if (ReSendNo) { @@ -635,7 +661,7 @@ inteval:80 if (currentPacket > totalPackets) { if (!ReSendNo) { setTimeout(() => { - + ble.sendString(f.deviceId, "transmit complete", f .writeServiceId, f.wirteCharactId, 20) .then( @@ -645,9 +671,9 @@ inteval:80 console.log("出现异常", ex); }); }, 500); - + } - + hideLoading(these); showPop({ showPop: true, @@ -656,14 +682,14 @@ inteval:80 }, these); these.videoHexArray = null; resolve(); - + return; } - + // 计算当前包的数据 let packetSize = 500; - - + + // 创建数据包 const startIndex = (currentPacket - 1) * packetSize; const endIndex = Math.min(startIndex + packetSize, these.videoHexArray @@ -674,40 +700,40 @@ inteval:80 } ////console.log("111111"); const packetData = these.videoHexArray.slice(startIndex, endIndex); - + // 构建数据包 ////console.log("packetData.length"+packetData.length); const bufferSize = 504; // 头部5字节 + 数据部分 const buffer = new ArrayBuffer(bufferSize); const dataView = new DataView(buffer); - + let sortNo = currentPacket.toString(16).padStart(4, '0'); - + // 填充头部 dataView.setUint8(0, 0x55); // 帧头 dataView.setUint8(1, 0x04); // 帧类型:开机画面 dataView.setUint8(2, '0x' + sortNo.substring(0, 2)); // 包序号 dataView.setUint8(3, '0x' + sortNo.substring(2, 4)); // 包序号 - + // dataView.setUint8(4, 0x01); // dataView.setUint8(5, 0xF4); - + for (let i = 0; i < packetData.length; i++) { dataView.setUint8(4 + i, '0x' + packetData[i]); } - + let inteval = 60; - + ble.sendData(f.deviceId, buffer, f.writeServiceId, f .wirteCharactId, 10).then(() => { - + updateLoading(these, { text: "正在发送:" + currentPacket + "/" + totalPackets }); - + currentPacket++; - + // console.log("发送一段成功,发送下一段"); setTimeout(sendNextVideoPacket, inteval); }).catch(err => { @@ -717,9 +743,9 @@ inteval:80 currentPacket); setTimeout(sendNextVideoPacket, 800); } else { - + hideLoading(these); - + showPop({ showPop: true, message: err.msg + ",发送失败了", @@ -732,34 +758,34 @@ inteval:80 these.videoHexArray = null; return; } - + }); }; - - + + sendNextVideoPacket(); - - + + } else { console.log("Fail.......") } }); } - + var sendVideo = (videoPath) => { let uploadVideo = () => { - + these.videoHexArray = []; console.log("开始处理,正在上传"); - + showLoading(these, { text: "上传中" }); let p1 = new Promise((resolve, reject) => { - + ble.sendString(f.deviceId, "video transmit start", f .writeServiceId, f.wirteCharactId).then(res => { - + setTimeout(() => { console.log("握手成功了"); resolve(true); @@ -768,10 +794,10 @@ inteval:80 reject(ex); }); }); - - + + let p2 = new Promise((succ, err) => { - + const token = uni.getStorageSync('token'); const clientid = uni.getStorageSync('clientID'); if (!token) { @@ -799,26 +825,26 @@ inteval:80 timeout: 600000, fail: (ex) => { console.log("上传视频失败" + JSON.stringify(ex)); - + err(ex); }, success: (res) => { - + console.log("上传完成,向蓝牙设备发送"); succ(res); } - + }); }); - + Promise.all([p1, p2]).then((arr) => { - - if (arr[0].status == 'rejected') { - MsgError("设备准备未就绪,请重试",'',these); + + if (arr[0].status == 'rejected') { + MsgError("设备准备未就绪,请重试", '', these); return; } - if(arr[1].status== 'rejected'){ - MsgError("读取视频失败",'',these); + if (arr[1].status == 'rejected') { + MsgError("读取视频失败", '', these); return; } let res = arr[1]; @@ -830,16 +856,16 @@ inteval:80 updateLoading(these, { text: "正在发送:0/1536" }); - - - + + + shotVideoClick(res.data); - - + + } else { console.log("服务器未返回正确的数据"); - - + + showPop({ message: "与服务器连接出现异常,请检查网络设置", iconUrl: "/static/images/common/uploadErr.png", @@ -847,7 +873,7 @@ inteval:80 buttonBgColor: "#E03434", }, these); } - + }).catch((ex) => { console.log("出现异常,", ex) hideLoading(these); @@ -859,27 +885,27 @@ inteval:80 }, these); }) } - - - - + + + + let shotVideoClick = () => { console.log("正在开始发送"); sendVideoPackets().then(() => { console.log("发送完成"); - + }).catch((ex1) => { //console.log("出现了异常", ex1) }).finally(() => { hideLoading(these); }); } - - + + uploadVideo(); - + } - + uni.chooseVideo({ sourceType: ['album'], compressed: false, // 关闭视频压缩,确保上传原始文件 @@ -890,37 +916,37 @@ inteval:80 let width = Math.round(res.width); let height = Math.round(res.height); let duration = res.duration; - + // 获取平台信息 const systemInfo = uni.getSystemInfoSync(); const platform = systemInfo.platform; const isIOS = platform === 'ios'; - + console.log("平台:", platform, "uni.chooseVideo返回 - 宽度:", width, "高度:", height, "时长:", duration); - + // iOS特殊处理:如果返回的是80*40,很可能是160*80的一半(iOS的bug) if (isIOS && width === 80 && height === 40) { console.log("检测到iOS特殊情况:返回80*40,实际应该是160*80,进行修正"); width = 160; height = 80; } - + // 检查分辨率是否符合要求 let checkResolution = (w, h) => { // 使用容差比较,允许1像素的误差 return Math.abs(w - 160) <= 1 && Math.abs(h - 80) <= 1; }; - + let err = []; if (duration < 2) { err.push("视频时长至少2秒"); } - + if (!checkResolution(width, height)) { err.push("视频宽高必须是160*80,当前分辨率:" + width + "*" + height); } - + if (err.length > 0) { err = err.join(";"); showPop({ @@ -931,41 +957,41 @@ inteval:80 }, these); return; } - + showLoading(these, { text: '正在上传' }); setTimeout(() => { sendVideo(path); }, 0); - + } }); - + }, sendImg() { if (!this.permissions.includes('3') && this.Status.apiType !== 'listA') { - + MsgError('无操作权限', '确定', these); return; } - + let f = this.getDevice(); - - + + var sendImagePackets = function(ReSendNo) { - + return new Promise((resolve, reject) => { - + // 总数据包数 let totalPackets = 52; let currentPacket = 1; - + if (ReSendNo) { totalPackets = ReSendNo; currentPacket = ReSendNo; } - + if (f) { // 发送单个数据包 const sendNextPacket = () => { @@ -977,18 +1003,18 @@ inteval:80 message: "上传成功", iconUrl: "/static/images/common/success.png", }); - + setTimeout(() => { ble.sendString(f.deviceId, "transmit complete", f .writeServiceId, f .wirteCharactId); }, 1000); - + these.rgb565Data = null; resolve(); return; } - + // 计算当前包的数据 let packetSize = 250; // if (currentPacket <= 51) { @@ -996,7 +1022,7 @@ inteval:80 // } else { // packetSize = 50; // 最后一个包100字节 // } - + // 创建数据包 const startIndex = (currentPacket - 1) * packetSize; const endIndex = Math.min(startIndex + packetSize, these.rgb565Data @@ -1010,37 +1036,37 @@ inteval:80 const bufferSize = 505; // 5 + packetData.length * 2; // 头部5字节 + 数据部分 const buffer = new ArrayBuffer(bufferSize); const dataView = new DataView(buffer); - + // 填充头部 dataView.setUint8(0, 0x55); // 帧头 dataView.setUint8(1, 0x02); // 帧类型:开机画面 dataView.setUint8(2, '0x' + currentPacket.toString(16).padStart(2, '0')); // 包序号 - - - dataView.setUint16(3, packetData.length*2,false); // 包t长度 - + + + dataView.setUint16(3, packetData.length * 2, false); // 包t长度 + // 填充数据(每个RGB565值占2字节) for (let i = 0; i < packetData.length; i++) { dataView.setUint16(5 + i * 2, packetData[i], false); // 大端字节序 } - - - - - + + + + + //发送数据包 ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10) .then(() => { - - + + updateLoading(these, { text: "正在发送:" + currentPacket + "/" + totalPackets }) currentPacket++; - + setTimeout(sendNextPacket, these.inteval); }).catch(err => { console.log("发送数据包失败了" + JSON.stringify(err)); @@ -1060,7 +1086,7 @@ inteval:80 reject(err); }); } - + if (ReSendNo) { sendNextPacket(ReSendNo); return; @@ -1069,7 +1095,7 @@ inteval:80 ble.sendString(f.deviceId, "picture transmit start", f.writeServiceId, f.wirteCharactId).then(() => { setTimeout(sendNextPacket, 120); - + }).catch((err) => { console.log("握手没有成功"); showPop({ @@ -1084,31 +1110,31 @@ inteval:80 } }); } - - + + uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], - sourceType: ['album','camera'], + sourceType: ['album', 'camera'], success: function(res) { uni.navigateTo({ url: "/pages/common/ImgCrop/ImgCrop", events: { ImgCutOver: function(data) { - + showLoading(these, { text: "正在发送0/52" }); - - + + these.rgb565Data = Common.convertToRGB565(data.piexls); - + setTimeout(function() { sendImagePackets().catch(() => { - + }); }, 0) - + } }, success(ev) { @@ -1120,24 +1146,26 @@ inteval:80 console.log("跳转页面失败" + JSON.stringify(ex)); } }); - + } }); - + }, - btnClick(){ - let f = this.getDevice(); + btnClick() { + let f = this.getDevice(); if (!f) { this.showBleUnConnect(); return; } - + this.Status.BottomMenu.show = false; - - let d=this.Status.BottomMenu.menuItems[this.Status.BottomMenu.activeIndex]; + + let d = this.Status.BottomMenu.menuItems[this.Status.BottomMenu.activeIndex]; let bleSend = () => { - let json = {ins_RadarType:d.value}; - + let json = { + ins_RadarType: d.value + }; + json = JSON.stringify(json); if (ble) { ble.sendString(f.deviceId, json).then(res => { @@ -1148,23 +1176,23 @@ inteval:80 }); } } - - + + bleSend(); - - + + }, itemClick(item, index) { - this.Status.BottomMenu.activeIndex=index; - - + this.Status.BottomMenu.activeIndex = index; + + }, - itemPictureClick(item,index){ - this.Status.PictureMenu.activeIndex=index; + itemPictureClick(item, index) { + this.Status.PictureMenu.activeIndex = index; }, closeActionSheet() { this.Status.BottomMenu.show = false; - this.Status.PictureMenu.show=false; + this.Status.PictureMenu.show = false; }, sendUsr() { if (!this.permissions.includes('4') && this.Status.apiType !== 'listA') { @@ -1179,186 +1207,195 @@ inteval:80 return; } - let toByteValue = (value) => { - if (typeof value === 'number') { - return value; - } - if (typeof value === 'string') { - if (value.startsWith('0x') || value.startsWith('0X')) { - return parseInt(value, 16); - } - return parseInt(`0x${value}`, 16); - } - return 0; + if (!batchTool) { + batchTool = new SendBatchData(these, f, ble); } + batchTool.SendUsr(4); + return; + + + + + // let toByteValue = (value) => { + // if (typeof value === 'number') { + // return value; + // } + // if (typeof value === 'string') { + // if (value.startsWith('0x') || value.startsWith('0X')) { + // return parseInt(value, 16); + // } + // return parseInt(`0x${value}`, 16); + // } + // return 0; + // } - let err = false; - this.formData.textLines.find((txt) => { - if (txt.length === 0) { - console.log("txt=", txt); - err = true; - return true; - } - return false; - }) - if (err) { - MsgError('单位、部门、姓名、ID必须填写', '', these); - return; - } - showLoading(these, { - text: "请稍候..." - }); - //握手 - let holdHand = () => { - return new Promise((resolve, reject) => { - updateLoading(these, { - text: '设备准备中...' - }) - let hexs = 'word transmit start'; - ble.sendString(f.deviceId, hexs, f.writeServiceId, f.wirteCharactId, 10).then(res => { - setTimeout(() => { - resolve(res) - }, 2200); + // let err = false; + // this.formData.textLines.find((txt) => { + // if (txt.length === 0) { + // console.log("txt=", txt); + // err = true; + // return true; + // } + // return false; + // }) + // if (err) { + // MsgError('单位、部门、姓名、ID必须填写', '', these); + // return; + // } + // showLoading(these, { + // text: "请稍候..." + // }); + // //握手 + // let holdHand = () => { + // return new Promise((resolve, reject) => { + // updateLoading(these, { + // text: '设备准备中...' + // }) + // let hexs = 'word transmit start'; + // ble.sendString(f.deviceId, hexs, f.writeServiceId, f.wirteCharactId, 10).then(res => { + // setTimeout(() => { + // resolve(res) + // }, 2200); - }).catch(ex => { - reject(ex) - }); + // }).catch(ex => { + // reject(ex) + // }); - }); - } - //画图 - let drawText = () => { - return new Promise((resolve, reject) => { - this.$refs.textToHex.drawAndGetPixels().then(allPixels => { - if (!allPixels) { - reject("文本初始化失败"); - return; - } - resolve(allPixels); - }).catch(compEx => { - reject(compEx); - }); + // }); + // } + // //画图 + // let drawText = () => { + // return new Promise((resolve, reject) => { + // this.$refs.textToHex.drawAndGetPixels().then(allPixels => { + // if (!allPixels) { + // reject("文本初始化失败"); + // return; + // } + // resolve(allPixels); + // }).catch(compEx => { + // reject(compEx); + // }); - }); - } - //发送3个分包的数据 - let task = (allPixels) => { - try { - let combinedData = []; - for (let i = 0; i < this.formData.textLines.length; i++) { - let linePixels = (allPixels[i] || []).flat(Infinity).map(item => - typeof item === 'string' ? toByteValue(item) : item - ); - for (var j = linePixels.length; j < 256; j++) { - linePixels.push(0x00); + // }); + // } + // //发送3个分包的数据 + // let task = (allPixels) => { + // try { + // let combinedData = []; + // for (let i = 0; i < this.formData.textLines.length; i++) { + // let linePixels = (allPixels[i] || []).flat(Infinity).map(item => + // typeof item === 'string' ? toByteValue(item) : item + // ); + // for (var j = linePixels.length; j < 256; j++) { + // linePixels.push(0x00); - } - combinedData.push([0xFA, 0x06, i + 1, 1].concat(linePixels.slice(0, 128))); - combinedData.push([0xFA, 0x06, i + 1, 2].concat(linePixels.slice(128, 256))); + // } + // combinedData.push([0xFA, 0x06, i + 1, 1].concat(linePixels.slice(0, 128))); + // combinedData.push([0xFA, 0x06, i + 1, 2].concat(linePixels.slice(128, 256))); - } - combinedData.push([0x74, 0x72, 0x61, 0x6E, 0x73, 0x6D, 0x69, 0x74, 0x20, 0x63, 0x6F, 0x6D, - 0x70, 0x6C, 0x65, 0x74, 0x65 - ]); + // } + // combinedData.push([0x74, 0x72, 0x61, 0x6E, 0x73, 0x6D, 0x69, 0x74, 0x20, 0x63, 0x6F, 0x6D, + // 0x70, 0x6C, 0x65, 0x74, 0x65 + // ]); - let curr = 1; - let len = combinedData.length; - console.log(combinedData); - showLoading(these, { - text: '正在发送' + (curr - 1) + '/' + len - }); + // let curr = 1; + // let len = combinedData.length; + // console.log(combinedData); + // showLoading(these, { + // text: '正在发送' + (curr - 1) + '/' + len + // }); - //分包发送 - let sendPacket = () => { + // //分包发送 + // let sendPacket = () => { - if (combinedData.length === curr - 1) { + // if (combinedData.length === curr - 1) { - these.setBleFormData(); + // these.setBleFormData(); - MsgSuccess("发送成功", '', these); - let json = { - deviceId: these.device.id, - name: these.formData.textLines[1], - position: these.formData.textLines[0], - unitName: these.formData.textLines[2], - code: "" - }; - usrApi.sendUsr(json); + // MsgSuccess("发送成功", '', these); + // let json = { + // deviceId: these.device.id, + // name: these.formData.textLines[1], + // position: these.formData.textLines[0], + // unitName: these.formData.textLines[2], + // code: "" + // }; + // usrApi.sendUsr(json); - hideLoading(these); - return; - } + // hideLoading(these); + // return; + // } - let array = combinedData[curr - 1]; + // let array = combinedData[curr - 1]; - ble.sendHexs(f.deviceId, array, f.writeServiceId, f.wirteCharactId, 10).then( - res => { + // ble.sendHexs(f.deviceId, array, f.writeServiceId, f.wirteCharactId, 10).then( + // res => { - updateLoading(these, { - text: '正在发送' + curr + '/' + len - }); - curr++; - setTimeout(sendPacket, 300); - }).catch(err => { - if (err.code == '10007') { + // updateLoading(these, { + // text: '正在发送' + curr + '/' + len + // }); + // curr++; + // setTimeout(sendPacket, 300); + // }).catch(err => { + // if (err.code == '10007') { - setTimeout(sendPacket, 300); - } else { - console.log("err:", err); - hideLoading(these); - MsgError("发送失败: " + (err.msg || err.message), '', these) + // setTimeout(sendPacket, 300); + // } else { + // console.log("err:", err); + // hideLoading(these); + // MsgError("发送失败: " + (err.msg || err.message), '', these) - } + // } - }); - } + // }); + // } - setTimeout(sendPacket, 0); - // 5. 发送成功处理 + // setTimeout(sendPacket, 0); + // // 5. 发送成功处理 - } catch (ex) { - hideLoading(these); + // } catch (ex) { + // hideLoading(these); - MsgError("发送失败: " + (ex.msg || ex.message), '', these); - } + // MsgError("发送失败: " + (ex.msg || ex.message), '', these); + // } - } + // } - setTimeout(() => { - Promise.allSettled([holdHand(), drawText()]).then(results => { - console.log("results=", results) - if (results[0].status == 'rejected') { - updateLoading(these, { - text: results[0].reason - }); - setTimeout(() => { - hideLoading(these) - }, 500); - return; - } - if (results[1].status == 'rejected') { - updateLoading(these, { - text: results[1].reason - }) - setTimeout(() => { - hideLoading(these) - }, 500); - return; - } + // setTimeout(() => { + // Promise.allSettled([holdHand(), drawText()]).then(results => { + // console.log("results=", results) + // if (results[0].status == 'rejected') { + // updateLoading(these, { + // text: results[0].reason + // }); + // setTimeout(() => { + // hideLoading(these) + // }, 500); + // return; + // } + // if (results[1].status == 'rejected') { + // updateLoading(these, { + // text: results[1].reason + // }) + // setTimeout(() => { + // hideLoading(these) + // }, 500); + // return; + // } - task(results[1].value); - }) + // task(results[1].value); + // }) - }, 0); + // }, 0); }, toggleSetting(val, type) { let f = this.getDevice(); @@ -1397,37 +1434,39 @@ inteval:80 }, - CloseWarn(){ + CloseWarn() { let f = this.getDevice(); - + // #ifdef APP if (!f) { this.showBleUnConnect(); return; } // #endif - + // #ifdef WEB - f={deviceId:12345} + f = { + deviceId: 12345 + } // #endif - + let bleSend = () => { let json = { - ins_ShakeBit: 0 + ins_ShakeBit: 0 }; json = JSON.stringify(json); if (ble) { ble.sendString(f.deviceId, json).then(res => { this.formData.sta_ShakeBit = 0; - this.formData.sta_InfraRed=0; + this.formData.sta_InfraRed = 0; }).catch(ex => { this.mqSend(json); this.formData.sta_ShakeBit = 0; - this.formData.sta_InfraRed=0; + this.formData.sta_InfraRed = 0; }); } } - + MsgError('确定解除报警?', '', these, bleSend); }, sosSetting(val) { diff --git a/pages/4877/BJQ4877.vue b/pages/4877/BJQ4877.vue index 03f9bdb..6e2fb1d 100644 --- a/pages/4877/BJQ4877.vue +++ b/pages/4877/BJQ4877.vue @@ -10,7 +10,7 @@ + @click.stop="handleRightClick(item,index)" v-for="item,index in Status.navbar.icons"> {{item.math>9?'9+':item.math}} @@ -95,13 +95,13 @@ + :class="{active:formData.sta_SOSType===item.val,marginLeft:index%2==1}" + v-on:click.stop="sosSetting(item,index)"> + :src="item.img" mode="aspectFit"> + :src="item.activeImg" mode="aspectFit"> {{item['text']}} @@ -109,7 +109,16 @@ + + + + + + 识别设备 + 蓝光闪烁中 + + @@ -128,8 +137,8 @@ + :class="{active:item.id==formData.sta_GroupType,marginNoLeft:index%3===0}" + @click.stop="groupSetting(item,index)"> @@ -153,7 +162,7 @@ + :class="formData.sta_ArrowMode=='right_off'?'active':''"> @@ -164,13 +173,13 @@ 朝左 + :class="formData.sta_ArrowMode=='right_on'?'active':''"> + mode="aspectFit"> 朝右 @@ -185,7 +194,7 @@ + :class="formData.sta_ArrowType=='red_front'?'redactive':''"> 红色 @@ -194,7 +203,7 @@ + :class="formData.sta_ArrowType=='green_back'?'greenactive':''"> 绿色 @@ -217,7 +226,7 @@ + :class="formData.sta_ArrowType=='red_all'?'active':''"> @@ -228,13 +237,13 @@ 红色双向 + :class="formData.sta_ArrowType=='green_all'?'active':''"> + mode="aspectFit"> 绿色双向 @@ -247,16 +256,16 @@ + :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" :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" :showSlot="Status.Pop.showSlot"> 修改信道 + placeholder-class="popup-prompt-input-placeHolder" v-model="formData.sta_Channel" /> @@ -285,15 +294,15 @@ } from '@/api/4877/BJQ4877.js'; import MqTool from '@/utils/MqHelper.js' - import { - MsgSuccess, - MsgError, - MsgClose, - MsgWarning, - showPop, - MsgInfo, + import { + MsgSuccess, + MsgError, + MsgClose, + MsgWarning, + showPop, + MsgInfo, MsgClear - } from '@/utils/MsgPops.js' + } from '@/utils/MsgPops.js' const pagePath = "/pages/4877/BJQ4877"; var ble = null; @@ -306,6 +315,7 @@ data() { return { Status: { + sendDisc: '', apiType: '', navbar: { icons: [{ @@ -398,6 +408,7 @@ groups: [ ] + }, dic: { SOS: [{ @@ -563,15 +574,15 @@ }, onShow() { this.Status.pageHide = false; - - let f=this.getDevice(); - if(f){ - these.formData.bleStatu = 'connecting'; - ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { - console.log("连接成功") - these.formData.bleStatu = true; - }); - } + + let f = this.getDevice(); + if (f) { + these.formData.bleStatu = 'connecting'; + ble.LinkBlue(f.deviceId, f.writeServiceId, f.wirteCharactId, f.notifyCharactId).then(res => { + console.log("连接成功") + these.formData.bleStatu = true; + }); + } }, computed: { getbleStatu() { @@ -707,7 +718,7 @@ buttonBgColor: "#E03434", okCallback: null, buttonText: "确定" - },these) + }, these) return; } @@ -738,7 +749,7 @@ cancelCallback: () => { this.Status.ShowEditChannel = false; } - },these); + }, these); }, onChannelChanging() { let regex = /^(0|([1-9]\d?)|1[01]\d|12[0-5])$/; @@ -788,7 +799,7 @@ buttonBgColor: "#E03434", okCallback: null, buttonText: "确定" - },these) + }, these) return; } @@ -851,7 +862,7 @@ buttonBgColor: "#E03434", okCallback: null, buttonText: "确定" - },these) + }, these) return; } uni.navigateTo({ @@ -934,7 +945,7 @@ buttonBgColor: "#E03434", okCallback: null, buttonText: "确定" - },these) + }, these) return; } @@ -982,7 +993,45 @@ this.formData.warnTime = 0; } }, + discern() { + //识别设备,连续发送20次识别指令 + let f = this.getDevice(); + if (!f) { + this.showBleUnConnect(); + return; + } + var json = { + ins_disc: 1 + } + let index = 0; + let total = 20; + + console.error("发送识别指令:", json); + this.Status.sendDisc = true; + + let sendNextPacket = () => { + if(index>total){ + this.Status.sendDisc = false; + + return; + } + ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res => { + index++; + setTimeout(sendNextPacket,300); + }).catch(err => { + if (err.code == '10007') { + setTimeout(sendNextPacket, 800); + return; + } + if(index==0){ + MsgError(err.msg,'',these); + } + this.Status.sendDisc = false; + }); + } + sendNextPacket(); + }, sosSetting(item, index) { if (!this.permissions.includes('42') && this.Status.apiType !== 'listA') { @@ -993,7 +1042,7 @@ buttonBgColor: "#E03434", okCallback: null, buttonText: "确定" - },these) + }, these) return; } let f = this.getDevice(); @@ -1035,7 +1084,7 @@ buttonText: (this.formData.sta_SOSType === 'sos' ? '关闭' : '开启'), showCancel: true, buttonCancelText: '取消' - },these); + }, these); } if (item.val === 'sos') { confirmTask(); @@ -1085,9 +1134,9 @@ // return; // } if (res.deviceId == these.formData.deviceId) { - if(res.device){ + if (res.device) { these.formData.bleStatu = 'connecting'; - }else{ + } else { this.formData.bleStatu = false; } setTimeout(() => { @@ -1181,7 +1230,7 @@ if (receive.deviceId !== this.formData.deviceId) { return; } - + console.log("收到设备的数据", receive) let data = recei.ReceiveData(receive, device, pagePath, recArr); console.log("处理后的数据:", data); @@ -1225,8 +1274,8 @@ }, getDevice: function() { - // console.log("LinkedList=", ble.data.LinkedList); - // console.log("formData=", these.formData); + console.log("LinkedList=", ble.data.LinkedList); + console.log("formData=", these.device); let f = ble.data.LinkedList.find((v) => { return v.macAddress == these.device.deviceMac; }); @@ -1255,7 +1304,7 @@ borderColor: "#e034344d", buttonBgColor: "#E03434", buttonText: '去连接', - buttonTextColor: '#FFFFFFde', + buttonTextColor: '#FFFFFFde', okCallback: function() { uni.navigateTo({ @@ -1277,10 +1326,10 @@ } }) } - },these); + }, these); }, - + @@ -1302,62 +1351,61 @@ this.Status.Pop.okCallback(); } }, - 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, - } - - 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] = 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'; - } - these.Status.Pop.showPop = true; - }, - - - showMsg(msg, isSucc) { - if (isSucc) { - MsgSuccess(msg,'',this); + 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, } - else{ - MsgError(msg,'',this); + + 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] = 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'; + } + these.Status.Pop.showPop = true; + }, + + + showMsg(msg, isSucc) { + if (isSucc) { + MsgSuccess(msg, '', this); + } else { + MsgError(msg, '', this); } } } @@ -1569,7 +1617,7 @@ border-color: #aed600 !important; } - .lampMode .mode.active .bigTxt { + .lampMode .mode.active .bigTxt,.lampMode .mode.active .smallTxt { color: #aed600 !important; } @@ -1724,7 +1772,7 @@ text-align: left; } - + .slider-container { diff --git a/pages/6075J/BJQ6075J.vue b/pages/6075J/BJQ6075J.vue index 4f10f91..c0d56e3 100644 --- a/pages/6075J/BJQ6075J.vue +++ b/pages/6075J/BJQ6075J.vue @@ -276,15 +276,19 @@ import BleTool from '@/utils/BleHelper.js' import BleReceive from '@/utils/BleReceive'; import MqttClient from '@/utils/mqtt.js'; - import lnglatConvert from '@/utils/wgs84_to_gcj02.js' + import lnglatConvert from '@/utils/wgs84_to_gcj02.js'; + import SendBatchData from '@/utils/SendBatchData.js'; + var batchTool=null; var eventChannel = null; var these = null; var ble = null; + var recei = null; var mq = null; var pagePath = "pages/6075J/BJQ6075J"; var brightnessTimer = null; var reGeoTime=null; + export default { components: { TextToHexV1 @@ -644,340 +648,15 @@ let f = this.getDevice(); - let timeDelayCloseLoading = () => { - setTimeout(() => { - hideLoading(these); - }, 1500); + if(!f){ + this.showBleUnConnect(); + return; } - - - let sendVideoPackets = (ReSendNo) => { - console.log("开始发送分片数据"); - return new Promise((resolve, reject) => { - if (f) { - // 总数据包数 - var totalPackets = 1536; //36; - - let currentPacket = 1; - console.log("发送数据准备中,总共" + totalPackets); - if (ReSendNo) { - totalPackets = ReSendNo; - currentPacket = ReSendNo; - } - - // 发送单个数据包 - const sendNextVideoPacket = () => { - // console.log("准备发送一段数据"); - if (currentPacket > totalPackets) { - if (!ReSendNo) { - setTimeout(() => { - - ble.sendString(f.deviceId, "transmit complete", f - .writeServiceId, f.wirteCharactId, 20) - .then( - () => { - console.log("全部发送完毕") - }).catch((ex) => { - console.log("出现异常", ex); - }); - }, 500); - - } - - hideLoading(these); - showPop({ - showPop: true, - message: "上传成功", - iconUrl: "/static/images/common/success.png" - }, these); - these.videoHexArray = null; - resolve(); - - return; - } - - // 计算当前包的数据 - let packetSize = 500; - - - // 创建数据包 - const startIndex = (currentPacket - 1) * packetSize; - const endIndex = Math.min(startIndex + packetSize, these.videoHexArray - .length); - if (startIndex > endIndex) { - resolve(); - return; - } - ////console.log("111111"); - const packetData = these.videoHexArray.slice(startIndex, endIndex); - - // 构建数据包 - ////console.log("packetData.length"+packetData.length); - const bufferSize = 504; // 头部5字节 + 数据部分 - const buffer = new ArrayBuffer(bufferSize); - const dataView = new DataView(buffer); - - let sortNo = currentPacket.toString(16).padStart(4, '0'); - - // 填充头部 - dataView.setUint8(0, 0x55); // 帧头 - dataView.setUint8(1, 0x04); // 帧类型:开机画面 - dataView.setUint8(2, '0x' + sortNo.substring(0, 2)); // 包序号 - dataView.setUint8(3, '0x' + sortNo.substring(2, 4)); // 包序号 - - // dataView.setUint8(4, 0x01); - // dataView.setUint8(5, 0xF4); - - for (let i = 0; i < packetData.length; i++) { - dataView.setUint8(4 + i, '0x' + packetData[i]); - } - - let inteval = 60; - - ble.sendData(f.deviceId, buffer, f.writeServiceId, f - .wirteCharactId, 10).then(() => { - - updateLoading(these, { - text: "正在发送:" + currentPacket + "/" + - totalPackets - }); - - currentPacket++; - - // console.log("发送一段成功,发送下一段"); - setTimeout(sendNextVideoPacket, inteval); - }).catch(err => { - console.log("发送失败了", err); - if (err.code == '10007') { //遇到这个错误自动重新发送 - console.log(err.errMsg + ",发送失败了,正在补偿:" + - currentPacket); - setTimeout(sendNextVideoPacket, 800); - } else { - - hideLoading(these); - - showPop({ - showPop: true, - message: err.msg + ",发送失败了", - borderColor: "#e034344d", - buttonBgColor: "#E03434", - buttonText: "确定", - iconUrl: "/static/images/common/uploadErr.png" - }, these); - reject(err); - these.videoHexArray = null; - return; - } - - }); - }; - - - sendNextVideoPacket(); - - - } else { - console.log("Fail.......") - } - }); - } - - var sendVideo = (videoPath) => { - let uploadVideo = () => { - - these.videoHexArray = []; - console.log("开始处理,正在上传"); - - showLoading(these, { - text: "上传中" - }); - let p1 = new Promise((resolve, reject) => { - - ble.sendString(f.deviceId, "video transmit start", f - .writeServiceId, f.wirteCharactId).then(res => { - - setTimeout(() => { - console.log("握手成功了"); - resolve(true); - }, 2200) - }).catch(ex => { - reject(ex); - }); - }); - - - let p2 = new Promise((succ, err) => { - - const token = uni.getStorageSync('token'); - const clientid = uni.getStorageSync('clientID'); - if (!token) { - err({ - code: 401, - msg: "请先登陆后再试" - }); - hideLoading(these); - return; - } - console.log("baseURL=", baseURL); - console.log("token", token); - console.log("clientID", clientid); - uni.uploadFile({ - // url: 'http://114.55.111.217/video/upload', - url: baseURL + "/app/video/upload", - filePath: videoPath, - name: 'file', - header: { - "Method": "POST", - "Content-Type": "multipart/form-data", - "Authorization": 'Bearer ' + token, - "clientid": clientid - }, - timeout: 600000, - fail: (ex) => { - console.log("上传视频失败" + JSON.stringify(ex)); - - err(ex); - }, - success: (res) => { - - console.log("上传完成,向蓝牙设备发送"); - succ(res); - } - - }); - }); - - Promise.all([p1, p2]).then((arr) => { - - if (arr[0].status == 'rejected') { - MsgError("设备准备未就绪,请重试",'',these); - return; - } - if(arr[1].status== 'rejected'){ - MsgError("读取视频失败",'',these); - return; - } - let res = arr[1]; - // console.log("11111111111111111111111",res); - res = JSON.parse(res.data); - // console.log("22222222222222222222"); - if (res.data) { - these.videoHexArray = res.data; - updateLoading(these, { - text: "正在发送:0/1536" - }); - - - - shotVideoClick(res.data); - - - } else { - console.log("服务器未返回正确的数据"); - - - showPop({ - message: "与服务器连接出现异常,请检查网络设置", - iconUrl: "/static/images/common/uploadErr.png", - borderColor: "#e034344d", - buttonBgColor: "#E03434", - }, these); - } - - }).catch((ex) => { - console.log("出现异常,", ex) - hideLoading(these); - showPop({ - message: "出现异常," + ex.msg, - iconUrl: "/static/images/common/uploadErr.png", - borderColor: "#e034344d", - buttonBgColor: "#E03434", - }, these); - }) - } - - - - - let shotVideoClick = () => { - console.log("正在开始发送"); - sendVideoPackets().then(() => { - console.log("发送完成"); - - }).catch((ex1) => { - //console.log("出现了异常", ex1) - }).finally(() => { - hideLoading(these); - }); - } - - - uploadVideo(); - - } - - uni.chooseVideo({ - sourceType: ['album'], - compressed: false, // 关闭视频压缩,确保上传原始文件 - success: function(res) { - console.log("res=", res); - let path = res.tempFilePath; - // iOS可能返回浮点数,需要转换为整数进行比较 - let width = Math.round(res.width); - let height = Math.round(res.height); - let duration = res.duration; - - // 获取平台信息 - const systemInfo = uni.getSystemInfoSync(); - const platform = systemInfo.platform; - const isIOS = platform === 'ios'; - - console.log("平台:", platform, "uni.chooseVideo返回 - 宽度:", width, "高度:", height, - "时长:", duration); - - // iOS特殊处理:如果返回的是80*40,很可能是160*80的一半(iOS的bug) - if (isIOS && width === 80 && height === 40) { - console.log("检测到iOS特殊情况:返回80*40,实际应该是160*80,进行修正"); - width = 160; - height = 80; - } - - // 检查分辨率是否符合要求 - let checkResolution = (w, h) => { - // 使用容差比较,允许1像素的误差 - return Math.abs(w - 160) <= 1 && Math.abs(h - 80) <= 1; - }; - - let err = []; - if (duration < 2) { - err.push("视频时长至少2秒"); - } - - if (!checkResolution(width, height)) { - err.push("视频宽高必须是160*80,当前分辨率:" + width + "*" + height); - } - - if (err.length > 0) { - err = err.join(";"); - showPop({ - message: err, - iconUrl: "/static/images/common/uploadErr.png", - borderColor: "#e034344d", - buttonBgColor: "#E03434", - }, these); - return; - } - - showLoading(these, { - text: '正在上传' - }); - setTimeout(() => { - sendVideo(path); - }, 0); - - } - }); - + + if(!batchTool){ + batchTool=new SendBatchData(these,f,ble); + } + batchTool.SendVideo(504); }, sendImg() { if (!this.permissions.includes('3') && this.Status.apiType !== 'listA') { @@ -987,179 +666,20 @@ } let f = this.getDevice(); - - - var sendImagePackets = function(ReSendNo) { - - return new Promise((resolve, reject) => { - - // 总数据包数 - let totalPackets = 52; - let currentPacket = 1; - - if (ReSendNo) { - totalPackets = ReSendNo; - currentPacket = ReSendNo; - } - - if (f) { - // 发送单个数据包 - const sendNextPacket = () => { - if (currentPacket > totalPackets) { - hideLoading(these); - these.closeAction(); - showPop({ - showPop: true, - message: "上传成功", - iconUrl: "/static/images/common/success.png", - }); - - setTimeout(() => { - ble.sendString(f.deviceId, "transmit complete", f - .writeServiceId, f - .wirteCharactId); - }, 1000); - - these.rgb565Data = null; - resolve(); - return; - } - - // 计算当前包的数据 - let packetSize = 250; - // if (currentPacket <= 51) { - // packetSize = 250; // 前51个包每个500字节 - // } else { - // packetSize = 50; // 最后一个包100字节 - // } - - // 创建数据包 - const startIndex = (currentPacket - 1) * packetSize; - const endIndex = Math.min(startIndex + packetSize, these.rgb565Data - .length); - if (startIndex > endIndex) { - return; - } - const packetData = these.rgb565Data.slice(startIndex, - endIndex); - // 构建数据包 - const bufferSize = 505; // 5 + packetData.length * 2; // 头部5字节 + 数据部分 - const buffer = new ArrayBuffer(bufferSize); - const dataView = new DataView(buffer); - - // 填充头部 - dataView.setUint8(0, 0x55); // 帧头 - dataView.setUint8(1, 0x02); // 帧类型:开机画面 - dataView.setUint8(2, '0x' + currentPacket.toString(16).padStart(2, - '0')); // 包序号 - - - dataView.setUint16(3, packetData.length*2,false); // 包t长度 - - // 填充数据(每个RGB565值占2字节) - for (let i = 0; i < packetData.length; i++) { - dataView.setUint16(5 + i * 2, packetData[i], false); // 大端字节序 - } - - - - - - //发送数据包 - ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, - 10) - .then(() => { - - - updateLoading(these, { - text: "正在发送:" + currentPacket + "/" + - totalPackets - }) - currentPacket++; - - setTimeout(sendNextPacket, these.inteval); - }).catch(err => { - console.log("发送数据包失败了" + JSON.stringify(err)); - if (err.code == '10007') { - setTimeout(sendNextPacket, these.inteval); - return; - } - these.closeAction(); - showPop({ - message: err.msg, - iconUrl: "/static/images/common/uploadErr.png", - borderColor: "#e034344d", - buttonBgColor: "#E03434", - }); - hideLoading(these); - these.rgb565Data = null; - reject(err); - }); - } - - if (ReSendNo) { - sendNextPacket(ReSendNo); - return; - } - // 开始牵手 - ble.sendString(f.deviceId, "picture transmit start", f.writeServiceId, - f.wirteCharactId).then(() => { - setTimeout(sendNextPacket, 120); - - }).catch((err) => { - console.log("握手没有成功"); - showPop({ - message: err.msg, - iconUrl: "/static/images/common/uploadErr.png", - borderColor: "#e034344d", - buttonBgColor: "#E03434", - }); - hideLoading(these); - reject(err); - }); - } - }); + if(!f){ + this.showBleUnConnect(); + return; } - - uni.chooseImage({ - count: 1, - sizeType: ['original', 'compressed'], - sourceType: ['album','camera'], - success: function(res) { - uni.navigateTo({ - url: "/pages/common/ImgCrop/ImgCrop", - events: { - ImgCutOver: function(data) { - - showLoading(these, { - text: "正在发送0/52" - }); - - - these.rgb565Data = Common.convertToRGB565(data.piexls); - - setTimeout(function() { - sendImagePackets().catch(() => { - - }); - }, 0) - - } - }, - success(ev) { - ev.eventChannel.emit('checkImg', { - data: res.tempFiles[0].path - }) - }, - fail(ex) { - console.log("跳转页面失败" + JSON.stringify(ex)); - } - }); - - } - }); - + if(!batchTool){ + batchTool=new SendBatchData(these,f,ble); + } + + + batchTool.SendImg(); + + return ; + }, sliderChanging(e) { this.formData.sta_brightness = e.detail.value; @@ -1508,152 +1028,10 @@ } - let toByteValue = (value) => { - if (typeof value === 'number') { - return value; - } - if (typeof value === 'string') { - if (value.startsWith('0x') || value.startsWith('0X')) { - return parseInt(value, 16); - } - return parseInt(`0x${value}`, 16); - } - return 0; - } - - - this.formData.textLines = [this.formData.company, this.formData.usrname, this.formData.job]; - console.log("data=", this.formData.textLines); - showLoading(these, { - text: "发送中" - }); - //握手 - let holdHand = (hexs, time) => { - return new Promise((resolve, reject) => { - - - this.sendData(hexs, 'ble', "string").then(res => { - setTimeout(() => { - resolve(res) - }, time); - - }).catch(ex => { - reject(ex) - }); - - }); - } - //画图 - let drawText = () => { - return new Promise((resolve, reject) => { - this.$refs.textToHex.drawAndGetPixels().then(allPixels => { - if (!allPixels) { - reject("文本初始化失败"); - return; - } - console.log("画图成功"); - resolve(allPixels); - }).catch(compEx => { - reject(compEx); - }); - - }); - } - //发送3个分包的数据 - let task = (allPixels) => { - try { - let combinedData = []; - for (let i = 0; i < 4; i++) { - let linePixels = (allPixels[i] || []).flat(Infinity).map(item => - typeof item === 'string' ? toByteValue(item) : item - ); - - for (var j = linePixels.length; j < 256; j++) { - linePixels.push(0x00); - } - linePixels = [0xFA, 0x06, 0x03, i + 1].concat(linePixels); - - linePixels.push(0xFF) - - combinedData.push(linePixels); - } - - - let curr = 1; - let len = combinedData.length; - - - - //分包发送 - let sendPacket = () => { - - if (combinedData.length === curr - 1) { - setTimeout(()=>{ - holdHand('transmit complete', 200).then(res => { - MsgSuccess("人员信息发送成功", "确定", these); - hideLoading(these); - this.setBleFormData(); - }); - },300); - - hideLoading(); - return; - } - - let array = combinedData[curr - 1]; - - - console.log("array=", array); - ble.sendHexs(f.deviceId, array, null, null, 15).then( - res => { - curr++; - console.log("发送成功", curr); - updateLoading(these, { - text: '发送中,' + (curr - 1) + '/' + combinedData.length - }) - setTimeout(sendPacket, 250); - }).catch(err => { - console.err("发送失败", err); - if (err.code == '10007') { - setTimeout(sendPacket, 250); - } else { - console.log("err:", err); - MsgError('发送失败' + (err.msg || err.code), '确定', these); - hideLoading(); - } - - }); - } - - setTimeout(sendPacket, 0); - // 5. 发送成功处理 - - - } catch (ex) { - MsgError('发送失败' + (ex.msg || ex.code), '确定', these); - } - - - } - - setTimeout(() => { - Promise.allSettled([holdHand('word transmit start', 2200), drawText()]).then(results => { - if (results[0].status == 'rejected') { - MsgError("与蓝牙设备握手失败,请重试",'',these); - setTimeout(() => { - hideLoading(these) - }, 500); - return; - } - if (results[1].status == 'rejected') { - MsgError("读取文字点阵失败,请重试",'',these); - return; - } - - task(results[1].value); - }) - - }, 0); + if(!batchTool){ + batchTool=new SendBatchData(these,f,ble); + } + batchTool.SendUsr(3); }, sendMsg() { debugger; @@ -2038,6 +1416,8 @@ } if (res.deviceId == these.formData.deviceId) { this.formData.bleStatu = true; + + batchTool=new SendBatchData(this,res,ble); setTimeout(() => { hideLoading(these, 1000); }); @@ -2053,6 +1433,7 @@ // return; // } if (res.deviceId == these.formData.deviceId) { + batchTool=null; if (res.device) { these.formData.bleStatu = 'connecting'; } else { diff --git a/pages/650/HBY650.vue b/pages/650/HBY650.vue index e71eadd..9119aad 100644 --- a/pages/650/HBY650.vue +++ b/pages/650/HBY650.vue @@ -113,7 +113,7 @@ - @@ -166,13 +166,6 @@ - - - - - - - @@ -202,7 +195,8 @@ import request, { baseURL } from '@/utils/request.js'; MsgInfo } from '@/utils/MsgPops.js' const pagePath = "/pages/650/HBY650"; - + import SendBatchData from '@/utils/SendBatchData.js'; + var batchTool=null; var ble = null; var these = null; var recei = null; @@ -226,16 +220,12 @@ import request, { baseURL } from '@/utils/request.js'; show: false, showHeader: true, menuItems: [{ - text: '强光', - icon: '/static/images/lightImg/qiang.png' + text: '照片', + value:'img' }, { - text: '弱光', - icon: '/static/images/lightImg/ruo.png' - }, - { - text: '爆闪', - icon: '/static/images/lightImg/shan.png' + text: '动画', + value:'flash' } ], activeIndex: -1, @@ -864,8 +854,31 @@ import request, { baseURL } from '@/utils/request.js'; }, checkImgUpload: function(type, index) { - console.log("123213213213"); let f = these.getDevice(); + if(!f){ + this.showBleUnConnect(); + return; + } + + if(!batchTool){ + batchTool=new SendBatchData(these,f,ble); + } + + + + if (type) { + if (type == 'img') { + // sendImagePackets(index); + batchTool.SendImg(); + } else{ + // sendVideoPackets(index); + batchTool.SendVideo(506); + } + + } + return; + console.log("123213213213"); + // 分包发送图片数据 var sendImagePackets = function(ReSendNo) { @@ -1337,12 +1350,11 @@ import request, { baseURL } from '@/utils/request.js'; },these) return; } - //上传开机画面 - this.Status.BottomMenu.menuItems = []; + //上传开机画面 this.Status.BottomMenu.title = "上传开机画面"; this.Status.BottomMenu.type = "checkImg"; this.Status.BottomMenu.show = true; - this.formData.cMode = "img"; + this.Status.BottomMenu.activeIndex=0; }, showMenu(flag) { @@ -1352,8 +1364,8 @@ import request, { baseURL } from '@/utils/request.js'; this.Status.BottomMenu.show = false; }, btnClick(item, index) { - - + this.Status.BottomMenu.show = false; + this.checkImgUpload(item.value,index); }, @@ -1365,14 +1377,7 @@ import request, { baseURL } from '@/utils/request.js'; }, handleItemClick(item, index) { - switch (this.Status.BottomMenu.type) { - case "main": - - break; - case "fu": - - break; - } + this.Status.BottomMenu.activeIndex = index; }, diff --git a/pages/670/HBY670.vue b/pages/670/HBY670.vue index f2fbd45..238bc8f 100644 --- a/pages/670/HBY670.vue +++ b/pages/670/HBY670.vue @@ -258,13 +258,7 @@ - - - - - - - + @@ -304,6 +298,8 @@ MsgInfo } from '@/utils/MsgPops.js' const pagePath = "/pages/670/HBY670"; + import SendBatchData from '@/utils/SendBatchData.js'; + var batchTool=null; var ble = null; var these = null; var recei = null; @@ -358,16 +354,12 @@ show: false, showHeader: true, menuItems: [{ - text: '强光', - icon: '/static/images/lightImg/qiang.png' + text: '照片', + value:'img' }, { - text: '弱光', - icon: '/static/images/lightImg/ruo.png' - }, - { - text: '爆闪', - icon: '/static/images/lightImg/shan.png' + text: '动画', + value:'flash' } ], activeIndex: -1, @@ -1694,7 +1686,26 @@ checkImgUpload: function(type, index) { console.log("123213213213"); let f = these.getDevice(); - + if(!f){ + this.showBleUnConnect(); + return; + } + + if(!batchTool){ + batchTool=new SendBatchData(these,f,ble); + } + + if (type) { + if (type == 'img') { + // sendImagePackets(index); + batchTool.SendImg(); + } else { + // sendVideoPackets(index); + batchTool.SendVideo(506); + } + + } + return; var sendImgByRequest = () => { return new Promise((resolve, reject) => { api.sendPic({ @@ -2208,11 +2219,12 @@ return; } //上传开机画面 - this.Status.BottomMenu.menuItems = []; + this.Status.BottomMenu.title = "上传开机画面"; this.Status.BottomMenu.type = "checkImg"; this.Status.BottomMenu.show = true; - this.Status.BottomMenu.showBtn = false; + this.Status.BottomMenu.showBtn = true; + this.Status.BottomMenu.activeIndex=0; }, showMenu(flag) { @@ -2222,10 +2234,8 @@ this.Status.BottomMenu.show = false; }, btnClick(item, index) { - - - - + this.Status.BottomMenu.show = false; + this.checkImgUpload(item.value,index); }, setMode(mode) { diff --git a/pages/common/addBLE/addEquip.vue b/pages/common/addBLE/addEquip.vue index 284c27e..7b0e368 100644 --- a/pages/common/addBLE/addEquip.vue +++ b/pages/common/addBLE/addEquip.vue @@ -272,7 +272,7 @@ } console.log("处理蓝牙不可用"); hideLoading(these); - console.error("1111111111") + these.PairEquip = []; these.EquipMents = []; uni.showToast({ @@ -285,13 +285,15 @@ //蓝牙恢复可用的回调 ble.addStateRecoveryCallback(res => { + console.log("蓝牙恢复可用"); + these.Status.BottomMenu.show = false; + these.PairEquip = []; + these.EquipMents = []; + if (these.Status.isPageHidden) { return; } - these.Status.BottomMenu.show = false; - console.error("1111111111") - these.PairEquip = []; - these.EquipMents = []; + uni.showToast({ icon: 'fail', title: '蓝牙恢复可用' diff --git a/utils/BleHelper.js b/utils/BleHelper.js index ac81cf9..1a402fa 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -871,7 +871,7 @@ class BleHelper { if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接 // 系统关蓝牙后原生 BLE 适配器已销毁;若仍认为 isOpenBlue=true,OpenBlue 会跳过重开, // 再开蓝牙后无法 createBLEConnection / 一直报 10001 适配器不可用 - this.data.isOpenBlue = false; + // this.data.isOpenBlue = false; console.log("蓝牙模块不可用了,将所有设备标记为断开连接"); this.data.connectingDevices = {}; //清空连接锁 this.data.LinkedList.filter((v) => { diff --git a/utils/SendBatchData.js b/utils/SendBatchData.js index d940ef5..5ac3943 100644 --- a/utils/SendBatchData.js +++ b/utils/SendBatchData.js @@ -1,68 +1,70 @@ import request, { - baseURL - } from '@/utils/request.js'; - import { - showLoading, - hideLoading, - updateLoading - } from '@/utils/loading.js'; + baseURL +} from '@/utils/request.js'; +import { + showLoading, + hideLoading, + updateLoading +} from '@/utils/loading.js'; - import { - MsgSuccess, - MsgError, - MsgClose, - MsgWarning, - showPop - } from '@/utils/MsgPops.js'; - import Common from '@/utils/Common.js'; - +import { + MsgSuccess, + MsgError, + MsgClose, + MsgWarning, + showPop +} from '@/utils/MsgPops.js'; +import Common from '@/utils/Common.js'; -class SendBatchData{ - - constructor(_these,_f,_ble){ - this.videoHexArray=[]; - this.rgb565Data=[]; - this.these=_these; - this.f=_f; - this.ble=_ble; + +class SendBatchData { + + constructor(_these, _f, _ble) { + this.videoHexArray = []; + this.rgb565Data = []; + this.these = _these; + this.f = _f; + this.ble = _ble; } - - - SendVideo(){ - - let these=this.these; - let f=this.f; - let ble=this.ble; - + + //发送开机视频 + SendVideo(bufferSize) { + + let these = this.these; + let f = this.f; + let ble = this.ble; + if (!bufferSize) { + bufferSize = 504; + } let timeDelayCloseLoading = () => { setTimeout(() => { hideLoading(these); }, 1500); } - - - + + + let sendVideoPackets = (ReSendNo) => { console.log("开始发送分片数据"); return new Promise((resolve, reject) => { if (f) { // 总数据包数 var totalPackets = 1536; //36; - + let currentPacket = 1; console.log("发送数据准备中,总共" + totalPackets); if (ReSendNo) { totalPackets = ReSendNo; currentPacket = ReSendNo; } - + // 发送单个数据包 const sendNextVideoPacket = () => { // console.log("准备发送一段数据"); if (currentPacket > totalPackets) { if (!ReSendNo) { setTimeout(() => { - + ble.sendString(f.deviceId, "transmit complete", f .writeServiceId, f.wirteCharactId, 20) .then( @@ -72,9 +74,9 @@ class SendBatchData{ console.log("出现异常", ex); }); }, 500); - + } - + hideLoading(these); showPop({ showPop: true, @@ -83,14 +85,14 @@ class SendBatchData{ }, these); these.videoHexArray = null; resolve(); - + return; } - + // 计算当前包的数据 let packetSize = 500; - - + + // 创建数据包 const startIndex = (currentPacket - 1) * packetSize; const endIndex = Math.min(startIndex + packetSize, these.videoHexArray @@ -101,40 +103,43 @@ class SendBatchData{ } ////console.log("111111"); const packetData = these.videoHexArray.slice(startIndex, endIndex); - + // 构建数据包 ////console.log("packetData.length"+packetData.length); - const bufferSize = 504; // 头部5字节 + 数据部分 + const buffer = new ArrayBuffer(bufferSize); const dataView = new DataView(buffer); - - let sortNo = currentPacket.toString(16).padStart(4, '0'); - + + + // 填充头部 dataView.setUint8(0, 0x55); // 帧头 dataView.setUint8(1, 0x04); // 帧类型:开机画面 - dataView.setUint8(2, '0x' + sortNo.substring(0, 2)); // 包序号 - dataView.setUint8(3, '0x' + sortNo.substring(2, 4)); // 包序号 - - // dataView.setUint8(4, 0x01); - // dataView.setUint8(5, 0xF4); - - for (let i = 0; i < packetData.length; i++) { - dataView.setUint8(4 + i, '0x' + packetData[i]); + dataView.setUint16(2, currentPacket, false); // 包序号 + let beginIndex = 4; + if (bufferSize == 506) { + beginIndex = 6; + dataView.setUint16(4, packetSize, false); //数据长度 } - - let inteval = 60; - + + + + for (let i = 0; i < packetData.length; i++) { + dataView.setUint8(beginIndex + i, packetData[i]); + } + + let inteval = 80; + ble.sendData(f.deviceId, buffer, f.writeServiceId, f .wirteCharactId, 10).then(() => { - + updateLoading(these, { text: "正在发送:" + currentPacket + "/" + totalPackets }); - + currentPacket++; - + // console.log("发送一段成功,发送下一段"); setTimeout(sendNextVideoPacket, inteval); }).catch(err => { @@ -144,9 +149,9 @@ class SendBatchData{ currentPacket); setTimeout(sendNextVideoPacket, 800); } else { - + hideLoading(these); - + showPop({ showPop: true, message: err.msg + ",发送失败了", @@ -159,34 +164,34 @@ class SendBatchData{ these.videoHexArray = null; return; } - + }); }; - - + + sendNextVideoPacket(); - - + + } else { console.log("Fail.......") } }); } - + var sendVideo = (videoPath) => { let uploadVideo = () => { - + these.videoHexArray = []; console.log("开始处理,正在上传"); - + showLoading(these, { text: "上传中" }); let p1 = new Promise((resolve, reject) => { - + ble.sendString(f.deviceId, "video transmit start", f .writeServiceId, f.wirteCharactId).then(res => { - + setTimeout(() => { console.log("握手成功了"); resolve(true); @@ -195,10 +200,10 @@ class SendBatchData{ reject(ex); }); }); - - + + let p2 = new Promise((succ, err) => { - + const token = uni.getStorageSync('token'); const clientid = uni.getStorageSync('clientID'); if (!token) { @@ -226,26 +231,26 @@ class SendBatchData{ timeout: 600000, fail: (ex) => { console.log("上传视频失败" + JSON.stringify(ex)); - + err(ex); }, success: (res) => { - + console.log("上传完成,向蓝牙设备发送"); succ(res); } - + }); }); - + Promise.all([p1, p2]).then((arr) => { - - if (arr[0].status == 'rejected') { - MsgError("设备准备未就绪,请重试",'',these); + + if (arr[0].status == 'rejected') { + MsgError("设备准备未就绪,请重试", '', these); return; } - if(arr[1].status== 'rejected'){ - MsgError("读取视频失败",'',these); + if (arr[1].status == 'rejected') { + MsgError("读取视频失败", '', these); return; } let res = arr[1]; @@ -257,16 +262,16 @@ class SendBatchData{ updateLoading(these, { text: "正在发送:0/1536" }); - - - + + + shotVideoClick(res.data); - - + + } else { console.log("服务器未返回正确的数据"); - - + + showPop({ message: "与服务器连接出现异常,请检查网络设置", iconUrl: "/static/images/common/uploadErr.png", @@ -274,7 +279,7 @@ class SendBatchData{ buttonBgColor: "#E03434", }, these); } - + }).catch((ex) => { console.log("出现异常,", ex) hideLoading(these); @@ -286,27 +291,27 @@ class SendBatchData{ }, these); }) } - - - - + + + + let shotVideoClick = () => { console.log("正在开始发送"); sendVideoPackets().then(() => { console.log("发送完成"); - + }).catch((ex1) => { //console.log("出现了异常", ex1) }).finally(() => { hideLoading(these); }); } - - + + uploadVideo(); - + } - + uni.chooseVideo({ sourceType: ['album'], compressed: false, // 关闭视频压缩,确保上传原始文件 @@ -317,37 +322,37 @@ class SendBatchData{ let width = Math.round(res.width); let height = Math.round(res.height); let duration = res.duration; - + // 获取平台信息 const systemInfo = uni.getSystemInfoSync(); const platform = systemInfo.platform; const isIOS = platform === 'ios'; - + console.log("平台:", platform, "uni.chooseVideo返回 - 宽度:", width, "高度:", height, "时长:", duration); - + // iOS特殊处理:如果返回的是80*40,很可能是160*80的一半(iOS的bug) if (isIOS && width === 80 && height === 40) { console.log("检测到iOS特殊情况:返回80*40,实际应该是160*80,进行修正"); width = 160; height = 80; } - + // 检查分辨率是否符合要求 let checkResolution = (w, h) => { // 使用容差比较,允许1像素的误差 return Math.abs(w - 160) <= 1 && Math.abs(h - 80) <= 1; }; - + let err = []; if (duration < 2) { err.push("视频时长至少2秒"); } - + if (!checkResolution(width, height)) { err.push("视频宽高必须是160*80,当前分辨率:" + width + "*" + height); } - + if (err.length > 0) { err = err.join(";"); showPop({ @@ -358,59 +363,65 @@ class SendBatchData{ }, these); return; } - + showLoading(these, { text: '正在上传' }); setTimeout(() => { sendVideo(path); }, 0); - + } }); } - - SendImg(){ - let these=this.these; - let f=this.f; - let ble=this.ble; - + + + //发送图片, + SendImg() { + let these = this.these; + let f = this.f; + let ble = this.ble; + var sendImagePackets = function(ReSendNo) { - + return new Promise((resolve, reject) => { - + // 总数据包数 let totalPackets = 52; let currentPacket = 1; - + if (ReSendNo) { totalPackets = ReSendNo; currentPacket = ReSendNo; } - + if (f) { // 发送单个数据包 const sendNextPacket = () => { if (currentPacket > totalPackets) { hideLoading(these); - these.closeAction(); + if (these.closeAction) { + these.closeAction(); + } + + showPop({ showPop: true, message: "上传成功", iconUrl: "/static/images/common/success.png", - }); - + }, these); + setTimeout(() => { ble.sendString(f.deviceId, "transmit complete", f .writeServiceId, f .wirteCharactId); }, 1000); - + these.rgb565Data = null; resolve(); return; } - + // 计算当前包的数据 let packetSize = 250; // if (currentPacket <= 51) { @@ -418,7 +429,7 @@ class SendBatchData{ // } else { // packetSize = 50; // 最后一个包100字节 // } - + // 创建数据包 const startIndex = (currentPacket - 1) * packetSize; const endIndex = Math.min(startIndex + packetSize, these.rgb565Data @@ -432,57 +443,54 @@ class SendBatchData{ const bufferSize = 505; // 5 + packetData.length * 2; // 头部5字节 + 数据部分 const buffer = new ArrayBuffer(bufferSize); const dataView = new DataView(buffer); - + // 填充头部 dataView.setUint8(0, 0x55); // 帧头 dataView.setUint8(1, 0x02); // 帧类型:开机画面 - dataView.setUint8(2, '0x' + currentPacket.toString(16).padStart(2, - '0')); // 包序号 - - - dataView.setUint16(3, packetData.length*2,false); // 包t长度 - + dataView.setUint8(2, currentPacket); // 包序号 + + + dataView.setUint16(3, packetData.length * 2, false); // 包t长度 + // 填充数据(每个RGB565值占2字节) for (let i = 0; i < packetData.length; i++) { dataView.setUint16(5 + i * 2, packetData[i], false); // 大端字节序 } - - - - - + //发送数据包 ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 10) .then(() => { - - + + updateLoading(these, { text: "正在发送:" + currentPacket + "/" + totalPackets }) currentPacket++; - - setTimeout(sendNextPacket, these.inteval); + + setTimeout(sendNextPacket, these.inteval ? these.inteval : 80); }).catch(err => { console.log("发送数据包失败了" + JSON.stringify(err)); if (err.code == '10007') { - setTimeout(sendNextPacket, these.inteval); + setTimeout(sendNextPacket, 800); return; } - these.closeAction(); + if (these.closeAction) { + these.closeAction(); + } showPop({ message: err.msg, iconUrl: "/static/images/common/uploadErr.png", borderColor: "#e034344d", buttonBgColor: "#E03434", - }); + }, these); hideLoading(these); these.rgb565Data = null; reject(err); }); } - + if (ReSendNo) { sendNextPacket(ReSendNo); return; @@ -491,7 +499,7 @@ class SendBatchData{ ble.sendString(f.deviceId, "picture transmit start", f.writeServiceId, f.wirteCharactId).then(() => { setTimeout(sendNextPacket, 120); - + }).catch((err) => { console.log("握手没有成功"); showPop({ @@ -499,38 +507,38 @@ class SendBatchData{ iconUrl: "/static/images/common/uploadErr.png", borderColor: "#e034344d", buttonBgColor: "#E03434", - }); + }, these); hideLoading(these); reject(err); }); } }); } - - + + uni.chooseImage({ count: 1, sizeType: ['original', 'compressed'], - sourceType: ['album','camera'], + sourceType: ['album', 'camera'], success: function(res) { uni.navigateTo({ url: "/pages/common/ImgCrop/ImgCrop", events: { ImgCutOver: function(data) { - + showLoading(these, { text: "正在发送0/52" }); - - + + these.rgb565Data = Common.convertToRGB565(data.piexls); - + setTimeout(function() { sendImagePackets().catch(() => { - + }); }, 0) - + } }, success(ev) { @@ -542,18 +550,40 @@ class SendBatchData{ console.log("跳转页面失败" + JSON.stringify(ex)); } }); - + } }); } - - SendUsr(){ - - let these=this.these; - let f=this.f; - let ble=this.ble; - + + //发送人员信息 + SendUsr(totalRows) { + + let these = this.these; + let f = this.f; + let ble = this.ble; + if (!totalRows) { + totalRows = 3; + } + let toByteValue = (value) => { + if (typeof value === 'number') { + return value; + } + if (typeof value === 'string') { + if (value.startsWith('0x') || value.startsWith('0X')) { + return parseInt(value, 16); + } + return parseInt(`0x${value}`, 16); + } + return 0; + } + + these.formData.textLines = [these.formData.company, these.formData.usrname, these.formData.job]; + if (totalRows == 4) { + these.formData.textLines.push(these.formData.usrid); + } + + console.log("data=", these.formData.textLines); showLoading(these, { text: "发送中" @@ -561,17 +591,18 @@ class SendBatchData{ //握手 let holdHand = (hexs, time) => { return new Promise((resolve, reject) => { - - + + these.sendData(hexs, 'ble', "string").then(res => { setTimeout(() => { resolve(res) }, time); - + }).catch(ex => { + console.error("握手失败") reject(ex) }); - + }); } //画图 @@ -587,53 +618,53 @@ class SendBatchData{ }).catch(compEx => { reject(compEx); }); - + }); } //发送3个分包的数据 let task = (allPixels) => { try { let combinedData = []; - for (let i = 0; i < 4; i++) { + for (let i = 0; i < totalRows; i++) { let linePixels = (allPixels[i] || []).flat(Infinity).map(item => typeof item === 'string' ? toByteValue(item) : item ); - + for (var j = linePixels.length; j < 256; j++) { linePixels.push(0x00); } linePixels = [0xFA, 0x06, 0x03, i + 1].concat(linePixels); - + linePixels.push(0xFF) - + combinedData.push(linePixels); } - - + + let curr = 1; let len = combinedData.length; - - - + + + //分包发送 let sendPacket = () => { - + if (combinedData.length === curr - 1) { - setTimeout(()=>{ + setTimeout(() => { holdHand('transmit complete', 200).then(res => { - MsgSuccess("人员信息发送成功", "确定", these); - hideLoading(these); - these.setBleFormData(); - }); - },300); - - hideLoading(); + MsgSuccess("人员信息发送成功", "确定", these); + hideLoading(these); + these.setBleFormData(); + }); + }, 300); + + hideLoading(these); return; } - + let array = combinedData[curr - 1]; - - + + console.log("array=", array); ble.sendHexs(f.deviceId, array, null, null, 15).then( res => { @@ -644,47 +675,69 @@ class SendBatchData{ }) setTimeout(sendPacket, 250); }).catch(err => { - console.err("发送失败", err); + + console.error("err:", err); + if (err.code == '10007') { setTimeout(sendPacket, 250); } else { - console.log("err:", err); - MsgError('发送失败' + (err.msg || err.code), '确定', these); - hideLoading(); + console.error("err:", err); + MsgError('发送失败:' + (err.msg || err.code), 'OK', these); + hideLoading(these); } - + }); } - + setTimeout(sendPacket, 0); // 5. 发送成功处理 - - + + } catch (ex) { + console.error("ex=", ex) MsgError('发送失败' + (ex.msg || ex.code), '确定', these); } - - + + } - + setTimeout(() => { Promise.allSettled([holdHand('word transmit start', 2200), drawText()]).then(results => { if (results[0].status == 'rejected') { - MsgError("与蓝牙设备握手失败,请重试",'',these); + MsgError("与蓝牙设备握手失败,请重试", '', these); setTimeout(() => { hideLoading(these) }, 500); return; } if (results[1].status == 'rejected') { - MsgError("读取文字点阵失败,请重试",'',these); + MsgError("读取文字点阵失败,请重试", '', these); return; } - + task(results[1].value); }) - + }, 0); } - -} \ No newline at end of file + //发送识别指令 + SendDisc() { + let these = this.these; + let f = this.f; + let ble = this.ble; + + var json = { + ins_disc: 1 + } + + ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30).then(res => { + + }).catch(ex => { + console.error("蓝牙发送失败", ex); + }).finally(() => { + + }); + } +} + +export default SendBatchData; \ No newline at end of file