From 384376afd9908f82faa147f44df31084065adb02 Mon Sep 17 00:00:00 2001 From: sjchen <13418980720@163.com> Date: Thu, 6 Feb 2025 11:33:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9D=A1=E7=9C=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=8E=B7=E5=8F=96=E6=96=B9=E5=BC=8F=EF=BC=8C=E7=9D=A1?= =?UTF-8?q?=E7=9C=A0=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index/index.js | 40 ++++++++++++++++++++++++++++++++++------ utils/CommonUtil.js | 35 +++++++++++++++++++++++++++++++++++ utils/DataPacket.js | 29 +++++++++++++++++++++-------- utils/ParseDataPacket.js | 4 +++- 4 files changed, 93 insertions(+), 15 deletions(-) diff --git a/index/index.js b/index/index.js index 4f79eee..5e8fa3a 100644 --- a/index/index.js +++ b/index/index.js @@ -18,6 +18,7 @@ Page({ sleepDataBuffer: new DynamicArrayBuffer(), // 创建缓存对象 isDataComplete: false, // 判断数据是否上传完毕 sleepList:[], + sleepCount:0,//获取睡眠的次数 }, // 页面加载时触发的函数,用于初始化蓝牙适配器 @@ -81,8 +82,8 @@ Page({ // 连接指定设备 // if(device.deviceId=="03:02:02:07:65:98"){ // if(device.deviceId=="03:02:02:07:5C:B7"){ - // if(device.deviceId=="03:02:02:07:65:98"){ - if(device.deviceId=="03:02:02:07:5E:BE"){ + if(device.deviceId=="03:02:02:07:62:A3"){ + // if(device.deviceId=="03:02:02:07:5E:BE"){ this.connectToDevice(device.deviceId); } }); @@ -309,12 +310,25 @@ Page({ let result = CommonUtil.sortSleep(arr); console.log("接口需要的睡眠数据:",result); - // // 更新缓存 - // HealthDataCache.updateSleepData(list[0].date); + // 从缓存中获取睡眠日期 + let field = CommonUtil.commandToField(0x53);// 根据指令获取字段 + // console.log("field>>>:",field); + let lastDate = HealthDataCache.getLastTimeField(field); + console.log("lastDate>>>:",lastDate); + let data = CommonUtil.removeBeforeDate(result,lastDate); + console.log("data:",data) + // 更新缓存 + HealthDataCache.updateSleepData(result[result.length-1].date); // 调用接口传睡眠后,清空数据 this.setData({ sleepList: [] }); + + // 清空累加睡眠次数 + this.setData({ + sleepCount : 0 + }); + } } else { let sleepList = ParseDataPacket.parseSleepList(dataView,0); @@ -327,12 +341,26 @@ Page({ let currentSleepList = this.data.sleepList || []; // 将 sleepList 放在前面,currentSleepList 放在后面,实现新的数据插入在前 - let updatedSleepList = sleepList.concat(currentSleepList);; + let updatedSleepList = sleepList.concat(currentSleepList); // 更新 data 中的 sleepList this.setData({ sleepList: updatedSleepList }); + + // 累加睡眠获取次数 + this.setData({ + sleepCount : this.data.sleepCount + 1 + }); + if(this.data.sleepCount % 50 == 0){ + // 如果大于等于50次都没有获取到睡眠结束符,则再次从上一次的位置获取睡眠数据; + const sleepPacket = DataPacket.generateReadSleepDataPacket(); + console.log("继续获取睡眠数据:",sleepPacket) + console.log("sleepCount:",this.data.sleepCount) + SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); + + } + } break; default: @@ -443,7 +471,7 @@ Page({ getHealthData(){ // 睡眠数据 - const sleepPacket = DataPacket.generateReadSleepDataPacket(0x53); + const sleepPacket = DataPacket.generateReadSleepDataPacket(); SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); diff --git a/utils/CommonUtil.js b/utils/CommonUtil.js index fa2d713..0b726ff 100644 --- a/utils/CommonUtil.js +++ b/utils/CommonUtil.js @@ -377,7 +377,42 @@ const CommonUtil = { return result; + }, + + // 获取下一个日期 + getNextDay(dateString) { + // 解析传入的日期字符串 + let date = new Date(dateString); + + // 将日期加一天 + date.setDate(date.getDate() + 1); + + // 格式化为 "YYYY-MM-DD" 格式 + let year = date.getFullYear(); + let month = ('0' + (date.getMonth() + 1)).slice(-2); // 月份需要 +1,且补充 0 + let day = ('0' + date.getDate()).slice(-2); // 日期补充 0 + + return `${year}${month}${day}`; + }, + + /** + * 删除已上传的睡眠数据 + * @param {} arr + * @param {*} targetDate + */ + removeBeforeDate(arr, targetDate) { + // 将目标日期字符串转换为 Date 对象 + let target = new Date(targetDate.substring(0, 4), targetDate.substring(4, 6) - 1, targetDate.substring(6, 8)); + + // 过滤掉日期小于或等于目标日期的项 + return arr.filter(item => { + // 将数组中每个日期转换为 Date 对象 + let itemDate = new Date(item.date.substring(0, 4), item.date.substring(4, 6) - 1, item.date.substring(6, 8)); + // 只保留日期大于目标日期的项 + return itemDate > target; + }); } + } diff --git a/utils/DataPacket.js b/utils/DataPacket.js index c41a083..ba45a33 100644 --- a/utils/DataPacket.js +++ b/utils/DataPacket.js @@ -151,22 +151,35 @@ const DataPacket = { const packet = new Uint8Array(16); packet[0] = command; // 命令字节 + // 判断 command 是否是 0x53 packet[1] = 0x00; //0x99: 删除数据,0x00:读取最近数据,0x01:读取指定位置数据,0x02:继续读取上一次位置 let field = CommonUtil.commandToField(command);// 根据指令获取字段 // console.log("field>>>:",field); let lastTime = HealthDataCache.getLastTimeField(field);// 根据字段获取最近一次同步数据的时间戳 // console.log("lastTime1>>>:",lastTime); - let date = CommonUtil.getDateByTimestamp(lastTime); packet[2] = 0x00; // 占位 packet[3] = 0x00; // 占位 - packet[4] = "0x"+ date.year; //年 - packet[5] = "0x"+ date.month; //月 - packet[6] = "0x"+ date.day; //日 - packet[7] = "0x"+ date.hours; //时 - packet[8] = "0x"+ date.minutes; //分 - packet[9] = "0x"+ date.seconds; //秒 + if(command != 0x53){ + let date = CommonUtil.getDateByTimestamp(lastTime); + packet[4] = "0x"+ date.year; //年 + packet[5] = "0x"+ date.month; //月 + packet[6] = "0x"+ date.day; //日 + packet[7] = "0x"+ date.hours; //时 + packet[8] = "0x"+ date.minutes; //分 + packet[9] = "0x"+ date.seconds; //秒 + } else { + packet[4] = "0x00"; //年 + packet[5] = "0x00"; //月 + packet[6] = "0x00"; //日 + packet[7] = "0x00"; //时 + packet[8] = "0x00"; //分 + packet[9] = "0x00"; //秒 + } + + + packet.fill(0x00, 10, 15); // 填充其他字节为0 @@ -218,7 +231,7 @@ const DataPacket = { const packet = new Uint8Array(16); // 填充命令数据包 packet[0] = 0x53; - packet[1] = 0x00; + packet[1] = 0x02; packet.fill(0x00, 2, 15); // 计算并设置 CRC 校验字节 diff --git a/utils/ParseDataPacket.js b/utils/ParseDataPacket.js index 81273a5..b70dc08 100644 --- a/utils/ParseDataPacket.js +++ b/utils/ParseDataPacket.js @@ -376,11 +376,13 @@ const parseDataPacket = { // 开始循环遍历 sleepData 数据 for (let i = 0; i < secondPart.length; i++) { const status = secondPart[i]; + let date = CommonUtil.getNextDay(`${parseInt(year) + 2000}-${month}-${day}`); // 处理每分钟的睡眠数据 result.push({ minute: currentMinute, // 分钟递增 status: this.mapSleepStatus(status), // 映射睡眠状态 - yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd + // yyyyMMdd: `${parseInt(year) + 2000}${month}${(parseInt(day) + 1).toString().padStart(2, '0')}`, // 格式化为yyyyMMdd + yyyyMMdd: date }); // 递增分钟数