chenyc
2024-07-11 b7b73d339a42d09ecc3f0115c49e23dc46893d5e
更新优化
8个文件已添加
10个文件已修改
394 ■■■■ 已修改文件
imgs/1715839450323.png 补丁 | 查看 | 原始文档 | blame | 历史
imgs/1717648518082.png 补丁 | 查看 | 原始文档 | blame | 历史
imgs/1718525175763.png 补丁 | 查看 | 原始文档 | blame | 历史
imgs/1720662037336.png 补丁 | 查看 | 原始文档 | blame | 历史
imgs/1720664402647.png 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/M503.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/RBP-9000c.ts 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/XK3190A12.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/deviceTool.ts 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/liangjiang.ts 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/mbp-9020.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/mbp7000.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/deviceApi/mbp7000qy.ts 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/samples/faceApi.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/StoresConfing.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/axios.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/home/index.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
imgs/1715839450323.png
imgs/1717648518082.png
imgs/1718525175763.png
imgs/1720662037336.png
imgs/1720664402647.png
src/samples/deviceApi/M503.ts
@@ -1,4 +1,3 @@
// 欧姆龙 HBP-9030 115200
import { ElMessage } from 'element-plus'
const { SerialPort } = require('serialport')
const { DelimiterParser } = require('@serialport/parser-delimiter')
@@ -30,9 +29,10 @@
    //ST,GS 70.4kg
    //
    //
    //53 54 2C 47 53 20 20 20 20 20 30 2E 30 6B 67 0D 0A
    //
    //
    //
    // 55 53 2C 47 53 20 20 20 20 31 33 30 2E 35 6B 67 0D 0A   135
    // 53 54 2C 47 53 20 20 20 31 33 39 2E 39 6B 67 0D 0A
    // 55 53 2C 47 53 20 20 20 20 36 30 2E 35 6B 67 0D 0A  HEX
    const parser = serialport.pipe(new DelimiterParser({ delimiter:Buffer.from([13,10]),includeDelimiter:true }))
    parser.on('data', (value: string | any[])=>{
@@ -40,19 +40,24 @@
        const str=value.toString()
        const list=str.split(' ')
        console.log(list)
        if(list.length===5&&list[0].search('ST,GS')!==-1){
            const re=list[4].trim()
        if(list.length>=4&&list[0].search('ST,GS')!==-1){
            const re=list[list.length-1].trim()
            const res=re.substring(0,re.length-2)
            console.log(res,'获取到的体重')
            sockteStore().setweightSockte(
                {
                    deviceName:'台衡M503',
                    type:"体重秤",
                    result:res,
                    resultTime:new Date().toString(),
                    state:2
                }
            )
            if(Number(res)>=20){
                sockteStore().setweightSockte(
                    {
                        deviceName:'台衡M503',
                        type:"体重秤",
                        result:res,
                        resultTime:new Date().toString(),
                        state:2
                    }
                )
            }else{
                console.log('体重小于30KG')
            }
        }else{
            console.log('数据格式不对')
        }
src/samples/deviceApi/RBP-9000c.ts
@@ -26,27 +26,43 @@
        console.log('端口异常端口链接断开')
        console.log(err)
    })
    //                 AA E0 03 28 64 02 71 06 44 51 A2 01 84 40 40 C0 5D D0
    // 解析分割数据流   AA 80 09 0F 01 06 00 17 05 0E 10 11 0F 00 8D 00 44 00 56 8C
    //AA 80 09 0F 01 06 00 17 05 0E 0F 37 37 00 74 00 46 00 50 70
    const parser = serialport.pipe(new ByteLengthParser({ length: 20 }))
    parser.on('data', (value: string | any[])=>{
        console.log(value.toString())
        const str=value.toString()
        const list=str.split(',')
        console.log(list)
        if(list.length===11){
            sockteStore().setxyjSockte(
              {
                  deviceName:'HBP-9030',
                  type:"血压计",
                  result:list[14]+','+list[16]+','+list[18],
                  resultTime:new Date().toString(),
                  state:2
              }
          )
        }
    // parser.on('data', (value: string | any[])=>{
    //     console.log(value.toString())
    //     const str=value.toString()
    //     const list=str.split(',')
    //     console.log(list)
    //     if(list.length===11){
    //         sockteStore().setxyjSockte(
    //           {
    //               deviceName:'HBP-9030',
    //               type:"血压计",
    //               result:list[14]+','+list[16]+','+list[18],
    //               resultTime:new Date().toString(),
    //               state:2
    //           }
    //       )
    //     }
        
    })
    // })
    parser.on('data',(value: string | any[]) =>{
        console.log('-----------------')
        if(value.length>=20){
            sockteStore().setxyjSockte(
                {
                    deviceName:'HBP-9030',
                    type:"血压计",
                    result:value[14]+','+value[16]+','+value[18],
                    resultTime:new Date().toString(),
                    state:2
                }
            )
        }
        console.log(value,'血压计数据')
    })
}
export {
src/samples/deviceApi/XK3190A12.ts
@@ -48,7 +48,8 @@
        console.log(value.toString())
        const str=value.toString()
        // 截取结果
        const list=str.substring(2,10)
        // const list=str.substring(2,10)
        const list = parseFloat(str.replace(/[^\d.]/g, '')).toString();
        console.log(list)
        if(Number(list)>20){
            // 判断是否相等 相等加一
src/samples/deviceApi/deviceTool.ts
New file
@@ -0,0 +1,61 @@
const SerialPort = require('serialport');
// 设置重连间隔和最大重试次数
const RECONNECT_INTERVAL = 10000; // 重连间隔10秒
const MAX_RECONNECT_ATTEMPTS = 10; // 最大重试次数10次
let reconnectAttempts = 0; // 当前重试次数
let serialPort:any; // 串口实例
const initPort=(portName:string,baudRate:Number)=>{
  if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
    console.error('重试次数达到上限,不再尝试重连。');
    return;
  }
  if (serialPort && serialPort.isOpen) {
    console.log('串口已打开,不再重复打开。');
    return;
  }
  try {
    serialPort = new SerialPort(portName,baudRate, { autoOpen: false }); // 创建串口实例
    serialPort.open((err:any) => {
      if (err) {
        console.error('串口打开失败:', err.message);
        setTimeout(initPort, RECONNECT_INTERVAL, portName);
        reconnectAttempts++;
        return;
      }
      console.log('串口已成功打开。');
      reconnectAttempts = 0; // 重置重试次数
      // 这里可以添加数据接收处理逻辑
      serialPort.on('data', (data:any) => {
        console.log('接收到数据:', data);
      });
      // 处理错误
      serialPort.on('error', (error:any) => {
        console.error('发生错误:', error.message);
        serialPort.close(); // 关闭串口
        setTimeout(connectSerialPort, RECONNECT_INTERVAL, portName); // 重连
      });
      // 处理关闭事件
      serialPort.on('close', () => {
        console.log('串口已关闭,将在5秒后尝试重新连接。');
        setTimeout(initPort, RECONNECT_INTERVAL, portName); // 重连
      });
    });
  } catch (error) {
    console.error('无法创建串口实例:', error.message);
    setTimeout(initPort, RECONNECT_INTERVAL, portName);
  }
}
// 调用connectSerialPort函数尝试连接串口,例如:
connectSerialPort('/dev/ttyUSB0');
src/samples/deviceApi/liangjiang.ts
New file
@@ -0,0 +1,149 @@
// 欧姆龙 HBP-9030 115200
import { ElMessage, ElMessageBox } from 'element-plus'
const { SerialPort } = require('serialport')
const { DelimiterParser } = require('@serialport/parser-delimiter')
const { ReadyParser } = require('@serialport/parser-ready')
import {sockteStore} from '@/stores/sockteInfo'
import { ipcRenderer  } from 'electron'
// 设置重连间隔和最大重试次数
const RECONNECT_INTERVAL = 10000; // 重连间隔10秒
const MAX_RECONNECT_ATTEMPTS = 10; // 最大重试次数10次
let reconnectAttempts = 0; // 当前重试次数
let serialPort:any; // 串口实例
const initPort=(path:String,baudRate:Number)=>{
    console.log('初始化打开lianjiang体重秤端口',reconnectAttempts)
    if(reconnectAttempts!==0){
        console.log('ssss',reconnectAttempts)
        ipcRenderer.invoke('logger', '串口重连第${reconnectAttempts}次')
        ElMessage({
            message: `串口重连第${reconnectAttempts}次启动`,
            type: 'success',
        })
    }
    let lisijieguo=''
    let duibinum=0
    if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
        console.error('重试次数达到上限,不再尝试重连。');
        ipcRenderer.invoke('logger', '串口已经重连了${reconnectAttempts}次了,点击确认关闭程序,重启电脑后再试')
        ElMessageBox.confirm(
            `串口已经重连了${reconnectAttempts}次了,点击确认关闭程序,重启电脑后再试`,
            'Warning',
            {
              confirmButtonText: '确认',
              cancelButtonText: '取消',
              type: 'warning',
            }
          )
            .then(() => {
                ipcRenderer.send('winClose')
                ipcRenderer.invoke('logger', '确认了关闭程序')
            })
            .catch(() => {
              ElMessage({
                type: 'info',
                message: '取消操作',
              })
            })
        return;
    }
    if (serialPort && serialPort.isOpen) {
        reconnectAttempts=0
        console.log('串口已打开,不再重复打开。');
        return;
    }
    try {
        serialPort  = new SerialPort({ path, baudRate }, (err: any) => {
            reconnectAttempts++
            if (err) {
                console.log(err)
                ipcRenderer.invoke('logger', 'lianjiang体重秤端口打开失败!')
                ElMessage({
                    message: 'lianjiang体重秤端口打开失败!',
                    type: 'error',
                })
                setTimeout(()=>{
                    initPort(path,baudRate)
                }, RECONNECT_INTERVAL);
                console.log(err)
            }else{
                reconnectAttempts=0
                ipcRenderer.invoke('logger', 'lianjiang体重秤端口打开成功')
                ElMessage({
                    message: 'lianjiang体重秤端口打开成功',
                    type: 'success',
                })
            }
        })
        serialPort.on("close",(err: any)=>{
            ipcRenderer.invoke('logger', 'lianjiang体重秤端口异常端口链接关闭')
            console.log('lianjiang体重秤端口异常端口链接断开')
            reconnectAttempts=0
            setTimeout(()=>{
                initPort(path,baudRate)
            }, RECONNECT_INTERVAL);
            console.log(err)
        })
        // 解析分割数据流
        //
        //  1200
        //
        //
        //+000680114
        //
        // 02 2B 30 30 30 36 38 3031 31 34 03    02 2B 30 30 30 36 38 3031 31 34 03
        const parser = serialPort.pipe(new DelimiterParser({ delimiter:Buffer.from([2,43]),includeDelimiter:true }))
        parser.on('data', (value: string | any[])=>{
            console.log(value.toString())
            const str=value.toString()
            const list=str.substring(0,6)
            const res=list.substring(0,5)+'.'+list.substring(5,6)
            console.log(Number(res))
            if(list!=='000000'){
                if(list===lisijieguo){
                    duibinum++
                }else{
                    lisijieguo=list
                    duibinum=0
                }
                // 对比4次结果都一致
                if(duibinum>=3){
                    console.log(list,'获取到的体重')
                    sockteStore().setweightSockte(
                        {
                            deviceName:'lianjiang',
                            type:"体重秤",
                            result:Number(res).toString(),
                            resultTime:new Date().toString(),
                            state:2
                        }
                    )
                    duibinum=0
                    lisijieguo=''
                }else{
                }
            }else{
                console.log('数据格式不对')
            }
        }) // all data after READY is received
    }
    catch (error:any) {
        console.error('无法创建串口实例:', error.message);
        reconnectAttempts=0
        setTimeout(()=>{
            initPort(path,baudRate)
        }, RECONNECT_INTERVAL);
    }
}
export {
    initPort,
}
src/samples/deviceApi/mbp-9020.ts
@@ -29,9 +29,9 @@
    // 解析分割数据流
    //bp,99999999999999999999,2024/04/26,20:41,116,083,067,099,1
    //
    //  2400波特率
    //
    //
    //
    //62 70 2C39 39 39 39 39 39 39 39 39 39 39 39 39 3939 39 39 39 39 39 2C 32 30 32 34 2F 3037 2F 30 35 2C 32 30 3A 30 39 2C 31 31 392C 30 39 32 2C 30 37 39 2C 30 38 39 2C31 0D
    //
    // 62 702C 39 39 39 39 39 39 39 39 39 39 39 3939 39 39 39 39 39 39 39 2C 32 30 32 34 2F 30 34 2F32 36 2C 32 30 3A 34 36 2C 31 31 38 2C 30 38 31 2C30 36 33 2C 30 39 35 2C 30 0D
    const parser = serialport.pipe(new DelimiterParser({ delimiter:Buffer.from([13]),includeDelimiter:true }))
src/samples/deviceApi/mbp7000.ts
@@ -28,7 +28,7 @@
        console.log('端口异常端口链接断开')
        console.log(err)
    })
    const parser = serialport.pipe(new InterByteTimeoutParser({ interval: 30 ,maxBufferSize:20}))
    const parser = serialport.pipe(new InterByteTimeoutParser({ interval: 500 ,maxBufferSize:20}))
    // parser.on('ready', () => console.log('the ready byte sequence has been received'))
    
    parser.on('data',(value: string | any[]) =>{
src/samples/deviceApi/mbp7000qy.ts
New file
@@ -0,0 +1,53 @@
import { ElMessage } from 'element-plus'
const { SerialPort } = require('serialport')
const { DelimiterParser } = require('@serialport/parser-delimiter')
const { InterByteTimeoutParser } = require('@serialport/parser-inter-byte-timeout')
import {sockteStore} from '@/stores/sockteInfo'
const initPort=(path:String,baudRate:Number)=>{
    console.log('初始化打开mbp7000口')
    const serialport  = new SerialPort({ path, baudRate }, (err: any) => {
        if (err) {
            console.log(err)
            ElMessage({
                message: '端口打开失败!',
                type: 'error',
            })
            console.log(err)
        }else{
            ElMessage({
                message: '端口打开成功清远转用',
                type: 'success',
            })
        }
    })
    serialport.on("close",(err: any)=>{
        console.log('端口异常端口链接断开')
        console.log(err)
    })
    const parser = serialport.pipe(new InterByteTimeoutParser({maxBufferSize:20}))
    // parser.on('ready', () => console.log('the ready byte sequence has been received'))
    parser.on('data',(value: string | any[]) =>{
        console.log('-----------------')
        if(value.length>=20){
            sockteStore().setxyjSockte(
                {
                    deviceName:'mbp7000',
                    type:"血压计",
                    result:value[14]+','+value[16]+','+value[18],
                    resultTime:new Date().toString(),
                    state:2
                }
            )
        }
        console.log(value,'血压计数据')
    })
    }
export {
    initPort,
}
src/samples/faceApi.ts
@@ -172,7 +172,7 @@
       // 验证图片
       // 是否本地识别
       const isLanFace= confingInfoStore().confingInfo.isLanFace
       if(isLanFace){
       if(isLanFace===true){
        //本地识别
        faceApiCheck(path)
       }else{
src/stores/StoresConfing.ts
@@ -4,15 +4,19 @@
    const confingInfo=ref({
        isLanFace:false,
        screenTimeout: 150,
        // 启用人脸识别
        isUseFaceRecogService: true,
        deviceType:"血压计",
        face_database:"Face_jq",
        // 数据准度
        face_score:0.55,
        //结果展示等待页面读秒
        timeJg:10000,
        base_api:"",
        // 人脸识别请求间隔
        face_push:3,
        imgHeight:200,
        // 播报定时
        // 播报定时间隔
        BobaoJg:4,
        beginWorkTime:5,
        endWorkTime:22,
@@ -50,7 +54,7 @@
        }
        // 
        if(info.isLanFace===undefined){
            confingInfo.value.isLanFace=true
            confingInfo.value.isLanFace=false
        }
    }
    return {confingInfo,setconfingInfo}
src/utils/axios.ts
@@ -32,7 +32,7 @@
            ElMessage.error(`Error Code: ${status}, Message: ${error.msg || '平台环境异常'}`)
        default:
            ElMessage.error(`Error Code: ${status}, Message: ${error.msg || '未知错误,请刷新重试'}`)
    }
}
src/views/home/index.vue
@@ -218,9 +218,10 @@
    <div  style="height: 18%;">
        <el-row>
            <el-col :span="6" style="padding-left: 40px; font-size: 34px; color: #FFFFFF;">
                {{formatDate(new Date(),'HH:MM')}}
              {{date.substring(11,16)}}
                <br>
                {{formatDate(new Date(),'YYYY-mm-dd')}}
                <!-- {{formatDate(new Date(),'YYYY-mm-dd')}} -->
                {{date.substring(0,11)}}
            </el-col>
            <el-col :span="12" style="font-size: 40px;color: #FFFFFF;text-align: center; padding-top: 20px;">
                请将脸部对准摄像头
@@ -282,11 +283,14 @@
import{initPort as taiHengM523 } from '@/samples/deviceApi/taiHengM523'
import{initPort as XK3190A12 } from '@/samples/deviceApi/XK3190A12'
import {initPort as mbp7000} from '@/samples/deviceApi/mbp7000'
import {initPort as mbp7000qy} from '@/samples/deviceApi/mbp7000qy'
import {initPort as mbp9020} from '@/samples/deviceApi/mbp-9020'
import {initPort as rbp9000c} from '@/samples/deviceApi/RBP-9000c'
import {initPort as M503} from '@/samples/deviceApi/M503'
import {initPort as seca102} from '@/samples/deviceApi/seca102'
import {initPort as liangjiang} from '@/samples/deviceApi/liangjiang'
// 引入模块
import config from '../../../package.json'
import { Delete, Download, Plus, ZoomIn } from '@element-plus/icons-vue'
@@ -361,7 +365,6 @@
  }
 
})
const configData=computed(()=>{
  return confingInfoStore().confingInfo
})
@@ -944,7 +947,7 @@
}
const updateChengxu=()=>{
  console.log('检查更新')
  if(configData.value.isLanFace){
  if(configData.value.isLanFace===true){
    console.log('是内网不能检查更新')
  }else{
    ipcRenderer.invoke("check-update");
@@ -971,9 +974,11 @@
        TM2655VP(configData.value.xueyanjiPortPath,configData.value.xueyanjiBaudRate)
      }else if(configData.value.xyj_type==='mbp7000'){
        mbp7000(configData.value.xueyanjiPortPath,configData.value.xueyanjiBaudRate)
      }else if(configData.value.xyj_type==='mbp7000qy'){
        mbp7000qy(configData.value.xueyanjiPortPath,configData.value.xueyanjiBaudRate)
      }else if(configData.value.xyj_type==='mbp9020'){
        mbp9020(configData.value.xueyanjiPortPath,configData.value.xueyanjiBaudRate)
      }
      }
      else if(configData.value.xyj_type==='RBP-9000c'){
        rbp9000c(configData.value.xueyanjiPortPath,configData.value.xueyanjiBaudRate)
      }
@@ -1001,6 +1006,8 @@
        XK3190A12(configData.value.tzcPortPath,configData.value.tzcBaudRate)
      }else if(configData.value.tzc_type==='zhiRongHehui'){
        zhiRongHehui(configData.value.tzcPortPath,configData.value.tzcBaudRate)
      }else if(configData.value.tzc_type==='lianjiang'){
        liangjiang(configData.value.tzcPortPath,1200)
      }
      else{
        zhiRongT605(configData.value.tzcPortPath,configData.value.tzcBaudRate)
@@ -1089,9 +1096,9 @@
  const resizedResult = resizeResults(result, dims)
  const box = resizedResult.box
  // 不要小头像
  console.log('000')
  // console.log('000')
  const h=configData.value.imgHeight===undefined?140:configData.value.imgHeight
  console.log('000',h)
  // console.log('000',h)
  if(box._height<h) return detectFace()
  //检测框是否在取景框内
  // if (!checkInViewFinder(box)) return detectFace()
@@ -1114,11 +1121,11 @@
    return detectFace()
  }
  const X= jgTime(lsDateTime,new Date())
  console.log('----',X,dialogVisible.value)
  // console.log('----',X,dialogVisible.value)
  // console.log(image)
  if(dialogVisible.value&&X>configData.value.face_push&&isworkTime(new Date())){
    lsDateTime=new Date()
    console.log(X,'上传图片间隔')
    // console.log(X,'上传图片间隔')
    base64toFile(image)
  }
  return detectFace()
src/views/login/index.vue
@@ -816,7 +816,7 @@
    return detectFace()
  }
  const X= jgTime(lsDateTime,new Date())
  console.log('----',X,dialogVisible.value)
  // console.log('----',X,dialogVisible.value)
  if(dialogVisible.value&&X>configData.value.face_push&&isworkTime(new Date())){
    lsDateTime=new Date()
    console.log(X,'上传阿里识别间隔')