diff --git a/index/index.js b/index/index.js index 9b83709..dd2fb99 100644 --- a/index/index.js +++ b/index/index.js @@ -80,8 +80,8 @@ Page({ console.log("advertisData: ",hexStr) // 连接指定设备 // if(device.deviceId=="03:02:02:07:65:98"){ - // if(device.deviceId=="03:02:02:07:5F:AF"){ - if(device.deviceId=="03:02:02:07:64:B4"){ + if(device.deviceId=="03:02:02:07:5F:AF"){ + // if(device.deviceId=="03:02:02:07:5E:BE"){ this.connectToDevice(device.deviceId); } }); @@ -172,7 +172,7 @@ Page({ const dataView = new DataView(res.value); // 获取第一个字节 let cmdType = dataView.getUint8(0); - console.log("cmdType",cmdType); + // console.log("cmdType",cmdType); switch (cmdType) { case 0x01: console.log("同步时间成功"); @@ -216,17 +216,23 @@ Page({ break; case 0x52: let stepDetailList = ParseDataPacket.parseStepDetailList(dataView,0); - console.log("步数详情数据:",stepDetailList); + if(dataView.byteLength % 25 == 2){ + console.log("收到步数结束符号,最后一条指令【结束】",dataView.byteLength) + } + // console.log("步数详情数据:",stepDetailList); // 调用后台接口 todo .... - - // 更新缓存 HealthDataCache.updateStepData(stepDetailList[0].startTime); break; case 0x55: let heartRateList = ParseDataPacket.parseDataList(dataView,0); - let respList = this.getRespiratoryList(heartRateList); - console.log("心率数据:",heartRateList); + let respList = this.getRespiratoryList(heartRateList); + if(dataView.byteLength % 10 == 2){ + console.log("收到心率结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) + // 需要调用下一个指令(血氧) + this.sendHealthCommand(0x66) + } + // console.log("心率数据:",heartRateList); // console.log("呼吸率数据:",respList); // 调用后台接口 todo .... @@ -236,7 +242,12 @@ Page({ break; case 0x56: let parseBloodList = ParseDataPacket.parseBloodPressureList(dataView,0); - console.log("血压数据:",parseBloodList); + if(dataView.byteLength % 15 == 2){ + console.log("收到血压结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) + // 需要调用下一个指令(体温) + this.sendHealthCommand(0x65) + } + // console.log("血压数据:",parseBloodList); // 调用后台接口 todo .... // 更新缓存 @@ -248,17 +259,27 @@ Page({ break; case 0x66: let bloodOxygenList = ParseDataPacket.parseDataList(dataView,0); - console.log("血氧数据:",bloodOxygenList); + if(dataView.byteLength % 10 == 2){ + console.log("收到血氧结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) + // 需要调用下一个指令(血压) + this.sendHealthCommand(0x56) + } + // console.log("血氧数据:",bloodOxygenList); // 调用后台接口 todo .... // 更新缓存 HealthDataCache.updateBloodOxygenData(bloodOxygenList[0].time); break; case 0x65: - let tempList = ParseDataPacket.parseTempList(dataView,0); + let tempList = ParseDataPacket.parseTempList(dataView,0); + if(dataView.byteLength % 11 == 2){ + console.log("收到体温结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) + // 需要调用下一个指令(体温) + this.sendHealthCommand(0x53) + } // 目前返回的包括环境温度,后续固件改成只采集佩戴情况下的体温,暂时过滤掉 oneValue 小于 35.0 的数据 const filteredData = tempList.filter(item => item.oneValue >= 35.0); - console.log("体温数据:",tempList); + // console.log("体温数据:",tempList); if(filteredData.length > 0){ // todo 调用后端接口 @@ -271,17 +292,35 @@ Page({ let id = dataView.getUint8(1); // 睡眠数据结束符 if(dataView.byteLength == 2 && id == 0xff){ + console.log("收到睡眠结束符号>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",dataView.byteLength) + // 需要调用下一个指令(体温) + // this.sendHealthCommand(0x52) + let list = this.data.sleepList; - let arr = CommonUtil.assembleSleepData(list); - console.log("接口需要的睡眠数据:",arr); - - // // 更新缓存 - // HealthDataCache.updateSleepData(list[0].time); - - // 调用接口传睡眠后,清空数据 - this.setData({ - sleepList: [] - }); + if(list.length > 0){ + let arr = CommonUtil.assembleSleepData(list); + arr.forEach(item =>{ + // 排序算法 + item.sleepList.sort((a, b) => { + // 先比较 yyyyMMdd + if (a.yyyyMMdd !== b.yyyyMMdd) { + return a.yyyyMMdd.localeCompare(b.yyyyMMdd); + } + // 再比较 minute + return a.minute - b.minute; + }); + }) + + console.log("接口需要的睡眠数据:",arr); + + // // 更新缓存 + // HealthDataCache.updateSleepData(list[0].time); + + // 调用接口传睡眠后,清空数据 + this.setData({ + sleepList: [] + }); + } } else { let sleepList = ParseDataPacket.parseSleepList(dataView,0); // 排序,minute 越大排前面 @@ -299,7 +338,7 @@ Page({ this.setData({ sleepList: updatedSleepList }); - + console.log("data数据:",this.data.sleepList) } break; default: @@ -322,8 +361,10 @@ Page({ getPower(){ // 获取电量 - const batteryPacket = DataPacket.generateBatteryCheckPacket(); - SendCommandUtil.sendPackage(this.data.deviceId,batteryPacket); + // const batteryPacket = DataPacket.generateBatteryCheckPacket(); + // SendCommandUtil.sendPackage(this.data.deviceId,batteryPacket); + + this.sendHealthCommand(0x53) }, getStep(){ @@ -332,60 +373,70 @@ Page({ SendCommandUtil.sendPackage(this.data.deviceId,stepPacket); }, - sendHealthCommand(){ - // 指令依次是:心率,血氧、血压、体温、睡眠、步数 - // 0x55,0x66,0x56,0x65,0x53,0x52 - const commands = [0x55]; - // 递归发送命令并加上 5 秒延迟 - function sendNextCommand(index = 0) { - if (index >= commands.length) return; // 所有命令发送完毕,结束 - const cmd = commands[index]; - const packet = DataPacket.generateReadDataPacket(cmd); - console.log("hexStr", this.uint8ArrayToHex(packet)); - - // 发送命令包 - SendCommandUtil.sendPackage(this.data.deviceId, packet); - - // 每发送完一个命令后,等待 3 秒继续发送下一个 - setTimeout(() => { - sendNextCommand.call(this, index + 1); - }, 3500); // 延迟 3.5 秒 + sendHealthCommand(cmd){ + // 如果不传则默认发送心率 + if(cmd == null){ + cmd = 0x55; } - - // 开始发送第一个命令,并保持 `this` 上下文 - sendNextCommand.call(this,0); - + let packet = DataPacket.generateReadDataPacket(cmd); + console.log("发送指令到设备端>>>:", this.uint8ArrayToHex(packet)); + SendCommandUtil.sendPackage(this.data.deviceId, packet); }, + // sendHealthCommand2(){ + // // 指令依次是:心率,血氧、血压、体温、睡眠、步数 + // // 0x55,0x66,0x56,0x65,0x53,0x52 + // const commands = [0x55]; + // // 递归发送命令并加上 5 秒延迟 + // function sendNextCommand(index = 0) { + // if (index >= commands.length) return; // 所有命令发送完毕,结束 + // const cmd = commands[index]; + // const packet = DataPacket.generateReadDataPacket(cmd); + // console.log("hexStr", this.uint8ArrayToHex(packet)); + + // // 发送命令包 + // SendCommandUtil.sendPackage(this.data.deviceId, packet); + + // // 每发送完一个命令后,等待 3 秒继续发送下一个 + // setTimeout(() => { + // sendNextCommand.call(this, index + 1); + // }, 3500); // 延迟 3.5 秒 + // } + // // 开始发送第一个命令,并保持 `this` 上下文 + // sendNextCommand.call(this,0); + // }, + // 获取健康数据 getHealthData(){ // 睡眠数据 - // const sleepPacket = DataPacket.generateReadSleepDataPacket(); - // SendCommandUtil.sendPackage(this.data.deviceId,sleepPacket); + const sleepPacket = DataPacket.generateReadSleepDataPacket(0x53); + 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/utils/ParseDataPacket.js b/utils/ParseDataPacket.js index b2fc171..cb39597 100644 --- a/utils/ParseDataPacket.js +++ b/utils/ParseDataPacket.js @@ -37,10 +37,10 @@ const parseDataPacket = { switch (status) { case 1: case 0: - return 2; // 深睡 + return 1; // 浅睡 case 2: case 3: - return 1; // 浅睡 + return 2; // 深睡 // case 3: // return 4; // REM case 4: @@ -287,7 +287,7 @@ const parseDataPacket = { const second = dataView.getUint8(offset + 8).toString(16).padStart(2, '0'); // 秒(BCD格式) let time = this.dateFormat(year,month,day,hour,minute,second); - // 解析血压->高压 + // 解析血压->高压 const high = dataView.getUint8(offset + 13); // 解析血压->高压 const low = dataView.getUint8(offset + 14);