From f1a693efc3a84f5a153d8bf958afabf4a7e8350b Mon Sep 17 00:00:00 2001 From: sjchen <13418980720@163.com> Date: Wed, 25 Jun 2025 10:10:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调试 --- index/index.js | 166 +++++++++++++++++++++++------------- index/index.wxml | 3 +- project.private.config.json | 2 +- utils/DataPacket.js | 7 +- utils/ParseDataPacket.js | 7 +- 5 files changed, 121 insertions(+), 64 deletions(-) diff --git a/index/index.js b/index/index.js index 098ff6a..558a3ac 100644 --- a/index/index.js +++ b/index/index.js @@ -19,6 +19,8 @@ Page({ isDataComplete: false, // 判断数据是否上传完毕 sleepList:[], sleepCount:0,//获取睡眠的次数 + bloodOxygenCount:0, + deviceType:"Q2",// 设备型号 }, // 页面加载时触发的函数,用于初始化蓝牙适配器 @@ -42,7 +44,10 @@ Page({ } }); }, - + handleContact (e) { + console.log(e.detail.path) + console.log(e.detail.query) +}, getLocation(){ wx.getLocation({ type: 'gcj02', @@ -72,7 +77,8 @@ Page({ getBluetoothDevices() { wx.onBluetoothDeviceFound((res) => { // 过滤出名称以 "GJ-SH-01" 开头的设备 - const targetDevices = res.devices.filter(device => device.name && (device.name.startsWith("J2203") || device.name.startsWith("小柏"))); + // const targetDevices = res.devices.filter(device => device.name && (device.name.startsWith("J2203") || device.name.startsWith("小柏") ||device.name.startsWith("T1"))); + const targetDevices = res.devices.filter(device => device.name && (device.name.startsWith("2301B"))); // 遍历并连接符合条件的设备 targetDevices.forEach(device => { @@ -83,7 +89,7 @@ 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:5E:C6"){ - if(device.deviceId=="03:02:02:07:62:3E"){ + if(device.deviceId=="E2:B0:80:02:50:67"){ this.connectToDevice(device.deviceId); } }); @@ -169,8 +175,8 @@ Page({ }); wx.onBLECharacteristicValueChange((res) => { - // const hexStr = this.uint8ArrayToHex(new Uint8Array(res.value)) - // console.log("收到手表端发送的数据>>>>>>:",hexStr); + const hexStr = this.uint8ArrayToHex(new Uint8Array(res.value)) + console.log("收到手表端发送的数据>>>>>>:",hexStr); const dataView = new DataView(res.value); // 获取第一个字节 let cmdType = dataView.getUint8(0); @@ -221,7 +227,7 @@ Page({ if(dataView.byteLength % 25 == 2){ console.log("收到步数结束符号,最后一条指令【结束】",dataView.byteLength) } - // console.log("步数详情数据:",stepDetailList); + console.log("步数详情数据:",stepDetailList); // 调用后台接口 todo .... // 更新缓存 HealthDataCache.updateStepData(stepDetailList[0].startTime); @@ -246,8 +252,14 @@ Page({ let parseBloodList = ParseDataPacket.parseBloodPressureList(dataView,0); if(dataView.byteLength % 15 == 2){ console.log("收到血压结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) + if(this.data.deviceType.includes('T1') || this.data.deviceType.includes('J2203')){ // 需要调用下一个指令(体温) - this.sendHealthCommand(0x65) + // this.sendHealthCommand(0x65) + }else{ + // 戒指 + this.sendHealthCommand(0x62) + } + } // console.log("血压数据:",parseBloodList); // 调用后台接口 todo .... @@ -265,14 +277,27 @@ Page({ console.log("收到血氧结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) // 需要调用下一个指令(血压) this.sendHealthCommand(0x56) + // 由于是Q2戒指,没有血压,故而这里获取下一个数据应该是体温 + // 清空获取血氧的次数 + this.setData({ + bloodOxygenCount : 0 + }); + } + // 累加血氧获取次数 + this.setData({ + bloodOxygenCount : this.data.bloodOxygenCount + 1 + }); + if(this.data.bloodOxygenCount % 50 == 0){ + // 需要调用下一个指令(血压) + this.sendHealthCommand(0x56,2) } - // console.log("血氧数据:",bloodOxygenList); + console.log("血氧数据:",bloodOxygenList); // 调用后台接口 todo .... // 更新缓存 HealthDataCache.updateBloodOxygenData(bloodOxygenList[0].time); break; - case 0x65: + case 0x65,0x62: let tempList = ParseDataPacket.parseTempList(dataView,0); if(dataView.byteLength % 11 == 2){ console.log("收到体温结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) @@ -281,7 +306,7 @@ Page({ } // 目前返回的包括环境温度,后续固件改成只采集佩戴情况下的体温,暂时过滤掉 oneValue 小于 35.0 的数据 const filteredData = tempList.filter(item => item.oneValue >= 35.0); - // console.log("体温数据:",tempList); + console.log("体温数据:",tempList); if(filteredData.length > 0){ // todo 调用后端接口 @@ -295,8 +320,8 @@ Page({ // 睡眠数据结束符 if(dataView.byteLength == 2 && id == 0xff){ console.log("收到睡眠结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) - // 需要调用下一个指令(体温) - // this.sendHealthCommand(0x52) + // 需要调用下一个指令(步数) + this.sendHealthCommand(0x52) let list = this.data.sleepList; if(list.length > 0){ @@ -318,7 +343,7 @@ Page({ // let data = CommonUtil.removeBeforeDate(result,lastDate); // console.log("data:",data) // 更新缓存 - HealthDataCache.updateSleepData(result[result.length-1].date); + // HealthDataCache.updateSleepData(result[result.length-1].date); // 调用接口传睡眠后,清空数据 this.setData({ sleepList: [] @@ -336,9 +361,9 @@ Page({ sleepList.sort((a, b) => { return Number(a.minute) - Number(b.minute); // b.minute > a.minute 排前面 }); - if(sleepList.length > 0){ - console.log("日期打印:",sleepList[0].yyyyMMdd) - } + // if(sleepList.length > 0){ + // console.log("日期打印:",sleepList[0].yyyyMMdd) + // } // console.log("排序后数据:",sleepList) // 获取当前已存在的 sleepList(如果有) let currentSleepList = this.data.sleepList || []; @@ -361,9 +386,7 @@ Page({ // console.log("继续获取睡眠数据:",sleepPacket) // console.log("sleepCount:",this.data.sleepCount) SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); - } - } break; default: @@ -385,25 +408,50 @@ Page({ }, timeTest(){ - let dateRange = CommonUtil.getDayTimeRange("20250119",91); - console.log("dateRange",dateRange); + // let dateRange = CommonUtil.getDayTimeRange("20250119",91); + // console.log("dateRange",dateRange); + + // let time = CommonUtil.getTimestampFromDateAndMinutes("20250119",91); + // console.log("time",time); + + // console.log("对比结果:",time >= dateRange.startTimestamp && time <= dateRange.endTimestamp) + + // 准备测试数据 + const hexData = [0x65, 0x9C, 0x02, 0x25, 0x06, 0x19, 0x00, 0x31, 0x00, 0x7C, 0x01]; + const buffer = new ArrayBuffer(hexData.length); + const dataView = new DataView(buffer); + + // 将16进制数据写入DataView + hexData.forEach((value, index) => { + dataView.setUint8(index, value); + }); - let time = CommonUtil.getTimestampFromDateAndMinutes("20250119",91); - console.log("time",time); + var data = ParseDataPacket.parseTempList(dataView,0); + // console.log("data:"+data) + // // 解析体温值(T1 和 T2) + // const t1 = 380; // 小端数据,保留一位小数 + + // // 计算温度值,T1T2组合成一个16位数字,并转为浮动的值 + // const temperature = t1 / 10.0; // 保留1位小数 + // const temperatureStr = temperature.toString(); + // // 分割整数和小数部分 + // const [integerPart, decimalPart] = temperatureStr.split('.'); + // var oneValue = parseInt(integerPart, 10); // 获取整数部分 + // var twoValue = decimalPart ? decimalPart.charAt(0) : '0'; + // console.log(oneValue)//38 + // console.log(twoValue)//0 + - console.log("对比结果:",time >= dateRange.startTimestamp && time <= dateRange.endTimestamp) }, getPower(){ // 获取电量 - // const batteryPacket = DataPacket.generateBatteryCheckPacket(); - // SendCommandUtil.sendPackage(this.data.deviceId,batteryPacket); - - // const HRPacket = DataPacket.generateReadHRDataPacket(); - // SendCommandUtil.sendPackage(this.data.deviceId,HRPacket); - + const batteryPacket = DataPacket.generateBatteryCheckPacket(); + SendCommandUtil.sendPackage(this.data.deviceId,batteryPacket); + }, + getSleep(){ + // 睡眠数据 this.sendHealthCommand(0x53) - }, getStep(){ @@ -412,7 +460,12 @@ Page({ SendCommandUtil.sendPackage(this.data.deviceId,stepPacket); }, - sendHealthCommand(cmd){ + /** + * + * @param {*} cmd + * @param {获取数据标识,1:读取历史数据,2:继续从上一次的位置读取数据} flag + */ + sendHealthCommand(cmd,flag = 1){ // 如果不传则默认发送心率 if(cmd == null){ cmd = 0x55; @@ -442,7 +495,7 @@ Page({ } } - let packet = DataPacket.generateReadDataPacket(cmd); + let packet = DataPacket.generateReadDataPacket(cmd,flag); console.log("发送指令到设备端>>>:", this.uint8ArrayToHex(packet)); SendCommandUtil.sendPackage(this.data.deviceId, packet); }, @@ -474,33 +527,32 @@ Page({ getHealthData(){ // 睡眠数据 - const sleepPacket = DataPacket.generateReadSleepDataPacket(); - SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); - + // const sleepPacket = DataPacket.generateReadSleepDataPacket(); + // SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); // 获取当前时间 - // let currentTime = Math.floor(new Date().getTime() / 1000); - // // 如果是第一次调用,则不判断时间,如果是第二次调用,要判断本次调用与上次是否间隔18秒(因手表机制问题,不能频繁发送指令给手表端) - // console.log(this.data.initTime,this.data.initIndex) - // if(this.data.initIndex === 0){ - // this.sendHealthCommand(); - // this.setData({ - // initIndex: this.data.initIndex + 1, - // initTime: currentTime - // }) - // } else { - // // 初始时间 - // let initTime = this.data.initTime - // let timeDifference = currentTime - initTime; - // if(this.data.initIndex > 0 && timeDifference > 18){ - // console.log(timeDifference,this.data.initIndex) - // this.setData({ - // initIndex: this.data.initIndex + 1, - // initTime: currentTime - // }) - // this.sendHealthCommand(); - // } - // } + let currentTime = Math.floor(new Date().getTime() / 1000); + // 如果是第一次调用,则不判断时间,如果是第二次调用,要判断本次调用与上次是否间隔18秒(因手表机制问题,不能频繁发送指令给手表端) + console.log(this.data.initTime,this.data.initIndex) + if(this.data.initIndex === 0){ + this.sendHealthCommand(); + this.setData({ + initIndex: this.data.initIndex + 1, + initTime: currentTime + }) + } else { + // 初始时间 + let initTime = this.data.initTime + let timeDifference = currentTime - initTime; + if(this.data.initIndex > 0 && timeDifference > 18){ + console.log(timeDifference,this.data.initIndex) + this.setData({ + initIndex: this.data.initIndex + 1, + initTime: currentTime + }) + this.sendHealthCommand(); + } + } }, diff --git a/index/index.wxml b/index/index.wxml index 58a4e28..38e520e 100644 --- a/index/index.wxml +++ b/index/index.wxml @@ -8,10 +8,11 @@ - + + \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json index ad9a8af..8769ddd 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -4,5 +4,5 @@ "setting": { "compileHotReLoad": true }, - "libVersion": "3.6.4" + "libVersion": "3.8.9" } \ No newline at end of file diff --git a/utils/DataPacket.js b/utils/DataPacket.js index ba45a33..655bfc3 100644 --- a/utils/DataPacket.js +++ b/utils/DataPacket.js @@ -145,18 +145,17 @@ const DataPacket = { /** * * @param {指令} command + * @param {获取数据标识,1:读取历史数据,2:继续从上一次的位置读取数据} flag */ - generateReadDataPacket(command){ + generateReadDataPacket(command,flag){ // 创建 Uint8Array 数据包 const packet = new Uint8Array(16); packet[0] = command; // 命令字节 // 判断 command 是否是 0x53 - packet[1] = 0x00; //0x99: 删除数据,0x00:读取最近数据,0x01:读取指定位置数据,0x02:继续读取上一次位置 + packet[1] = flag == 1 ? 0x00 : 0x02; //0x99: 删除数据,0x00:读取最近数据,0x01:读取指定位置数据,0x02:继续读取上一次位置 let field = CommonUtil.commandToField(command);// 根据指令获取字段 - // console.log("field>>>:",field); let lastTime = HealthDataCache.getLastTimeField(field);// 根据字段获取最近一次同步数据的时间戳 - // console.log("lastTime1>>>:",lastTime); packet[2] = 0x00; // 占位 packet[3] = 0x00; // 占位 diff --git a/utils/ParseDataPacket.js b/utils/ParseDataPacket.js index e16e860..0bc5e86 100644 --- a/utils/ParseDataPacket.js +++ b/utils/ParseDataPacket.js @@ -240,10 +240,15 @@ const parseDataPacket = { let time = this.dateFormat(year,month,day,hour,minute,second); // 解析体温值(T1 和 T2) const t1 = dataView.getUint16(offset + 9, true); // 小端数据,保留一位小数 + console.log("t1",t1,typeof(t1)) // 计算温度值,T1T2组合成一个16位数字,并转为浮动的值 const temperature = t1 / 10.0; // 保留1位小数 - + const temperatureStr = temperature.toString();//38 + // 分割整数和小数部分 + const [integerPart, decimalPart] = temperatureStr.split('.'); + console.log("oneValue",parseInt(integerPart, 10)) + console.log("twoValue",decimalPart ? decimalPart.charAt(0) : '0') return { type: 4,//4.体温 oneValue:temperature,