pom.xml
@@ -48,12 +48,16 @@ <classifier>jdk15</classifier> </dependency> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> </dependency> <!--mybatis 及mybatis-plus--> <!--<dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.2</version> </dependency>--> </dependency> <!--websocket--> <dependency> <groupId>org.springframework.boot</groupId> @@ -74,11 +78,11 @@ </dependency> <!--连接池--> <!--<dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.1.2</version> </dependency>--> </dependency> <!--pageHelper分页--> <dependency> src/main/java/com/lxw/test3d/FFM/Contants.java
New file @@ -0,0 +1,21 @@ package com.lxw.test3d.FFM; public class Contants { /** * @Description:(3.工具类主类)设置转码工具的各个路径 * @param:@param args * @return:void * @author:Zoutao * @date:2018-6-22 * @version:V1.0 */ //public static final String ffmpegpath = "D:/ffmpeg-20171225-be2da4c-win64-static/bin/ffmpeg.exe"; // ffmpeg工具安装位置 public static final String ffmpegpath = "E:/2软件下载包/ffmpeg/ffmpeg-4.3.1-2021-01-01-essentials_build/bin/ffmpeg.exe"; // ffmpeg工具安装位置 public static final String videofolder = "E:/ffmpeg/file/"; // 需要被转换格式的视频目录 public static final String targetfolder = "E:/ffmpeg/temp/"; // 转码后视频保存的目录 } src/main/java/com/lxw/test3d/FFM/ConverVideoTest.java
New file @@ -0,0 +1,51 @@ package com.lxw.test3d.FFM; /** * @ClassName ConverVideoTest * @Desecription TODO * @Author tkk * @Date 2019/11/13 9:43 **/ public class ConverVideoTest { /** * @Description:(1.转码功能调用) * @param:@param yuanPATH * @return:void * @author:Zoutao * @date:2018-6-23 * @version:V1.0 */ /*本地测试专用--zoutao*/ public static void main(String[] args) { //System.out.println(DateUtils.getCurrentDateTime()); ConverVideoTest c = new ConverVideoTest(); //String yuanPATH = "D:/file/IMG_4141.MP4"; //本地源视频 String yuanPATH = "E:\\ffmpeg\\2.avi"; //本地源视频 c.run(yuanPATH); //System.out.println(DateUtils.getCurrentDateTime()); } //web调用 public void run(String yuanPATH) { try { // 转码开始 //String filePath = "D:/testfile/video/rmTest.rm"; //本地源视频测试 String filePath = yuanPATH; //web传入的源视频 System.out.println("ConverVideoTest说:传入工具类的源视频为:"+filePath); ConverVideoUtils zout = new ConverVideoUtils(filePath); //传入path String targetExtension = ".mp4"; //设置转换的格式 boolean isDelSourseFile = true; //删除源文件 boolean beginConver = zout.beginConver(targetExtension,isDelSourseFile); System.out.println(beginConver); } catch (Exception e) { e.printStackTrace(); } } } src/main/java/com/lxw/test3d/FFM/ConverVideoUtils.java
New file @@ -0,0 +1,338 @@ package com.lxw.test3d.FFM; import java.io.*; import java.util.ArrayList; import java.util.List; /** * * @Title: ConverVideoUtils.java * @Package:com.resource.mytools * @Description:(2.转码和截图功能) * @see:接收Contants实体的路径 * @author:Zoutao * @date:2018-7-15 * @version:V1.0 */ public class ConverVideoUtils { private String sourceVideoPath; //源视频路径 private String filerealname; //文件名不包括后缀名 private String filename; //包括后缀名 private String videofolder = Contants.videofolder; // 别的格式视频的目录 private String targetfolder = Contants.targetfolder; // flv视频的目录 private String ffmpegpath = Contants.ffmpegpath; // ffmpeg.exe的目录 public ConverVideoUtils() { } //重构构造方法,传入源视频 public ConverVideoUtils(String path) { sourceVideoPath = path; } //set和get方法传递path public String getPATH() { return sourceVideoPath; } public void setPATH(String path) { sourceVideoPath = path; } /** * 转换视频格式 * @param targetExtension 目标视频后缀名 .xxx * @param isDelSourseFile 转换完成后是否删除源文件 * @return */ public boolean beginConver(String targetExtension, boolean isDelSourseFile) { File fi = new File(sourceVideoPath); filename = fi.getName();//获取文件名+后缀名 filerealname = filename.substring(0, filename.lastIndexOf(".")); //获取不带后缀的文件名-后面加.toLowerCase()小写 System.out.println("----接收到文件("+sourceVideoPath+")需要转换-------"); //检测本地是否存在 /*if (checkfile(sourceVideoPath)) { System.out.println(sourceVideoPath + "========该文件存在哟 "); return false; }*/ System.out.println("----开始转文件(" + sourceVideoPath + ")-------------------------- "); //执行转码机制 if (process(targetExtension,isDelSourseFile)) { System.out.println("视频转码结束================= "); //删除原视频+临时视频 /*if (isDelSourseFile) { deleteFile(sourceVideoPath); }*/ /*File file1 = new File(sourceVideoPath); if (file1.exists()){ System.out.println("删除原文件-可用:"+sourceVideoPath); file1.delete(); }*/ String temppath=videofolder + filerealname + ".avi"; File file2 = new File(temppath); if (file2.exists()){ System.out.println("删除临时文件:"+temppath); file2.delete(); } sourceVideoPath = null; return true; } else { sourceVideoPath = null; return false; } } /** * 检查文件是否存在-多处都有判断 * @param path * @return */ /*private boolean checkfile(String path) { path = sourceVideoPath; File file = new File(path); try { if (file.exists()) { System.out.println("视频文件不存在============="+path); return true; } else { System.out.println("视频文件存在"+path); return false; } } catch (Exception e) { // TODO: handle exception System.out.println("拒绝对文件进行读访问"); } return false; }*/ /** * 实际转换视频格式的方法 * @param targetExtension 目标视频后缀名 * @param isDelSourseFile 转换完成后是否删除源文件 * @return */ private boolean process(String targetExtension, boolean isDelSourseFile) { //先判断视频的类型-返回状态码 int type = checkContentType(); boolean status = false; //根据状态码处理 if (type == 0) { System.out.println("ffmpeg可以转换,统一转为mp4文件"); status = processVideoFormat(sourceVideoPath,targetExtension,isDelSourseFile);//可以指定转换为什么格式的视频 } /*else if (type == 1) { //如果type为1,将其他文件先转换为avi,然后在用ffmpeg转换为指定格式 System.out.println("ffmpeg不可以转换,先调用mencoder转码avi"); String avifilepath = processAVI(type); if (avifilepath == null){ // 转码失败--avi文件没有得到 System.out.println("mencoder转码失败,未生成AVI文件"); return false; }else { System.out.println("生成AVI文件成功,ffmpeg开始转码:"); status = processVideoFormat(avifilepath,targetExtension,isDelSourseFile); } }*/ return status; //执行完成返回布尔类型true } /** * 检查文件类型 * @return */ private int checkContentType() { //取得视频后缀- String type = sourceVideoPath.substring(sourceVideoPath.lastIndexOf(".") + 1, sourceVideoPath.length()).toLowerCase(); System.out.println("源视频类型为:"+type); // 如果是ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) if (type.equals("avi")) { return 0; } else if (type.equals("mpg")) { return 0; } else if (type.equals("wmv")) { return 0; } else if (type.equals("3gp")) { return 0; } else if (type.equals("mov")) { return 0; } else if (type.equals("mp4")) { return 0; } else if (type.equals("asf")) { return 0; } else if (type.equals("asx")) { return 0; } else if (type.equals("flv")) { return 0; }else if (type.equals("mkv")) { return 0; } System.out.println("上传视频格式异常"); return 9; } /** * 转换为指定格式--zoutao * ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) * @param oldfilepath * @param targetExtension 目标格式后缀名 .xxx * @param isDelSourceFile 转换完成后是否删除源文件 * @return */ private boolean processVideoFormat(String oldfilepath, String targetExtension, boolean isDelSourceFile) { System.out.println("调用了ffmpeg.exe工具"); //先确保保存转码后的视频的文件夹存在 File TempFile = new File(targetfolder); if (TempFile.exists()) { if (TempFile.isDirectory()) { System.out.println("该文件夹存在。"); }else { System.out.println("同名的文件存在,不能创建文件夹。"); } }else { System.out.println("文件夹不存在,创建该文件夹。"); TempFile.mkdir(); } List<String> commend = new ArrayList<String>(); commend.add(ffmpegpath); commend.add("-i"); commend.add(oldfilepath); commend.add("-c:v"); commend.add("libx264"); commend.add("-y"); commend.add("-s"); commend.add("1280x720"); commend.add("-pix_fmt"); commend.add("yuv420p"); commend.add("-b:a"); commend.add("63k"); commend.add("-b:v"); commend.add("753k"); commend.add("-r"); commend.add("18"); /*commend.add(ffmpegpath); //ffmpeg.exe工具地址 commend.add("-i"); commend.add(oldfilepath); //源视频路径 commend.add("-vf"); //视频分辨率处理 commend.add("scale=320:240,setdar=4:3"); //9:16 commend.add("-vcodec"); commend.add("h263"); // commend.add("-ab"); //新增4条 commend.add("128"); //高品质:128 低品质:64 commend.add("-acodec"); commend.add("mp3"); //音频编码器:原libmp3lame commend.add("-ac"); commend.add("2"); //原1 commend.add("-ar"); commend.add("22050"); //音频采样率22.05kHz commend.add("-r"); commend.add("29.97"); //高品质:29.97 低品质:15 commend.add("-c:v"); commend.add("libx264"); //视频编码器:视频是h.264编码格式 commend.add("-strict"); commend.add("-2");*/ String newMp4Filepath=targetfolder + filerealname + targetExtension; commend.add(newMp4Filepath); // //转码后的路径+名称,是指定后缀的视频 //先确保保存转码后的视频的文件夹存在 File oldFile = new File(newMp4Filepath); if (oldFile.exists()) { oldFile.delete(); } //打印命令--zoutao StringBuffer test = new StringBuffer(); for (int i = 0; i < commend.size(); i++) { test.append(commend.get(i) + " "); } System.out.println("ffmpeg输入的命令:"+test); try { //多线程处理加快速度-解决rmvb数据丢失builder名称要相同 ProcessBuilder builder = new ProcessBuilder(); builder.command(commend); Process p = builder.start(); //多线程处理加快速度-解决数据丢失 final InputStream is1 = p.getInputStream(); final InputStream is2 = p.getErrorStream(); new Thread() { public void run() { BufferedReader br = new BufferedReader( new InputStreamReader(is1)); try { String lineB = null; while ((lineB = br.readLine()) != null) { if (lineB != null) System.out.println(lineB); //打印mencoder转换过程代码 } } catch (IOException e) { e.printStackTrace(); } } }.start(); new Thread() { public void run() { BufferedReader br2 = new BufferedReader( new InputStreamReader(is2)); try { String lineC = null; while ((lineC = br2.readLine()) != null) { if (lineC != null) System.out.println(lineC); //打印mencoder转换过程代码 } } catch (IOException e) { e.printStackTrace(); } } }.start(); p.waitFor(); //进程等待机制,必须要有,否则不生成mp4!!! System.out.println("生成mp4视频为:"+videofolder + filerealname + ".mp4"); return true; } catch (Exception e) { e.printStackTrace(); return false; } } } src/main/java/com/lxw/test3d/FFM/FfmpegMAviToMp4.java
New file @@ -0,0 +1,6 @@ package com.lxw.test3d.FFM; public class FfmpegMAviToMp4 { } src/main/java/com/lxw/test3d/Service/BattGroupDataService.java
New file @@ -0,0 +1,33 @@ package com.lxw.test3d.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.lxw.test3d.dto.Response; import com.lxw.test3d.mapper.BattGroupDataMapper; import com.lxw.test3d.pojo.BattgroupData; import com.lxw.test3d.pojo.SocketCmd; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.NumberFormat; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class BattGroupDataService { @Resource private BattGroupDataMapper mapper; //获取 public Response getBattGroupData() { QueryWrapper wrapper=new QueryWrapper(); wrapper.last("limit 1"); BattgroupData data=mapper.selectOne(wrapper); return new Response().setII(1,true,data,""); } } src/main/java/com/lxw/test3d/Service/SocketCmdService.java
New file @@ -0,0 +1,50 @@ package com.lxw.test3d.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.lxw.test3d.dto.Response; import com.lxw.test3d.mapper.SocketCmdMapper; import com.lxw.test3d.pojo.SocketCmd; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class SocketCmdService { @Autowired(required = false) private SocketCmdMapper mapper; //启动socket通讯 public Response startSocket(String ip, int port) { new Thread(){ @Override public void run() { while (true){ int cmd=getCmd(); if(cmd==72){ break; }else{ System.out.println(1111); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); return new Response().set(1); } public int getCmd(){ int cmd=0; QueryWrapper wrapper=new QueryWrapper(); wrapper.last("limit 1"); SocketCmd socketCmd=mapper.selectOne(wrapper); if(socketCmd!=null){ cmd=socketCmd.getSocketCmd(); } return cmd; } } src/main/java/com/lxw/test3d/Test3dApplication.java
@@ -2,14 +2,15 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @EnableWebMvc @SpringBootApplication(exclude=DataSourceAutoConfiguration.class ) @SpringBootApplication @ServletComponentScan(basePackages = {"com.lxw.test3d.filter"}) public class Test3dApplication { public class Test3dApplication extends WebMvcConfigurerAdapter implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(Test3dApplication.class, args); src/main/java/com/lxw/test3d/config/MybatisPlusConfig.java
New file @@ -0,0 +1,22 @@ package com.lxw.test3d.config; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.lxw.test3d.injector.CustomSqlInjector; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan("com.lxw.test3d.mapper") public class MybatisPlusConfig { @Bean public CustomSqlInjector customSqlInjector(){ return new CustomSqlInjector(); } @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } } src/main/java/com/lxw/test3d/controller/BattGroupDataController.java
New file @@ -0,0 +1,26 @@ package com.lxw.test3d.controller; import com.lxw.test3d.Service.BattGroupDataService; import com.lxw.test3d.dto.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Api(tags = "电池组数据") @RestController @RequestMapping("battGroupData") public class BattGroupDataController { @Autowired private BattGroupDataService service; @ApiOperation("获取") @GetMapping("getBattGroupData") public Response getBattGroupData(){ return service.getBattGroupData(); } } src/main/java/com/lxw/test3d/controller/SocketController.java
New file @@ -0,0 +1,32 @@ package com.lxw.test3d.controller; import com.lxw.test3d.Service.SocketCmdService; import com.lxw.test3d.dto.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @Api(tags = "socket数据通讯") @RestController @RequestMapping("socket") public class SocketController { @Autowired private SocketCmdService service; @ApiOperation("启动socket通讯") @GetMapping("startSocket") public Response startSocket(@RequestParam String ip,@RequestParam int port){ return service.startSocket(ip,port); } @ApiOperation("获取socket命令") @GetMapping("getSocket") public Response getSocket(){ int cmd= service.getCmd(); return new Response().set(1,cmd); } } src/main/java/com/lxw/test3d/injector/CustomSqlInjector.java
New file @@ -0,0 +1,24 @@ package com.lxw.test3d.injector; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.extension.injector.methods.additional.AlwaysUpdateSomeColumnById; import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn; import java.util.List; /** * 自定义sql注入器,使得mybatis-plus能自动识别执行 */ public class CustomSqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass) { //这是默认的父类方法列表 List<AbstractMethod> methodList = super.getMethodList(mapperClass); //新增批量插入方法 methodList.add(new InsertBatchSomeColumn()); methodList.add(new AlwaysUpdateSomeColumnById()); return methodList; } } src/main/java/com/lxw/test3d/mapper/BattGroupDataMapper.java
New file @@ -0,0 +1,10 @@ package com.lxw.test3d.mapper; import com.lxw.test3d.pojo.BattgroupData; import org.apache.ibatis.annotations.Mapper; import java.util.List; public interface BattGroupDataMapper extends CustomMapper<BattgroupData>{ } src/main/java/com/lxw/test3d/mapper/CustomMapper.java
New file @@ -0,0 +1,17 @@ package com.lxw.test3d.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.Collection; @SuppressWarnings("all") public interface CustomMapper<T> extends BaseMapper<T> { /** * 批量插入 * @param entityList * @return */ Integer insertBatchSomeColumn(Collection<T> entityList); } src/main/java/com/lxw/test3d/mapper/SocketCmdMapper.java
New file @@ -0,0 +1,6 @@ package com.lxw.test3d.mapper; import com.lxw.test3d.pojo.SocketCmd; public interface SocketCmdMapper extends CustomMapper<SocketCmd>{ } src/main/java/com/lxw/test3d/pojo/BattgroupData.java
New file @@ -0,0 +1,60 @@ package com.lxw.test3d.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import java.io.Serializable; import java.util.Date; /** * <p> * * </p> * * @author lxw * @since 2022-09-06 */ @Data @AllArgsConstructor @NoArgsConstructor @TableName("tb_battgroup_data") @ApiModel(value="BattgroupData对象", description="") @ToString public class BattgroupData implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "num", type = IdType.AUTO) private Long num; @ApiModelProperty(value = "电池组id") @TableField("battGroup_id") private String battgroupId; @ApiModelProperty(value = "节数") private Integer monNum; @ApiModelProperty(value = "电压(V)") private String bv; @ApiModelProperty(value = "内阻(mΩ)") private String br; @ApiModelProperty(value = "电导") private String bs; @ApiModelProperty(value = "连接条阻抗(mΩ)") private String cr; @ApiModelProperty(value = "异常标记 0:无异常 1:鼓包 2:漏液 4:开裂 8:内阻超标") private int er; } src/main/java/com/lxw/test3d/pojo/SocketCmd.java
New file @@ -0,0 +1,20 @@ package com.lxw.test3d.pojo; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @AllArgsConstructor @NoArgsConstructor @TableName("tb_socket_cmd") @ApiModel(value="SocketCmd", description="") @ToString public class SocketCmd { private int num; private int socketCmd; } src/main/resources/config/application-dev.yml
@@ -14,6 +14,38 @@ max-http-header-size: 10000000 #数据库 spring: datasource: driver-class-name: org.sqlite.JDBC # url: jdbc:sqlite:C:\Users\29550\Downloads\sqlite-tools-win32-x86-3390400\res.db url: jdbc:sqlite:test3d.db?date_string_format=yyyy-MM-dd HH:mm:ss servlet: multipart: max-file-size: 200MB max-request-size: 200MB mybatis-plus: typeAliasesPackage: com.lxw.test3d.pojo,com.lxw.test3d.dto mapper-locations: classpath:mapper/**/*Mapper.xml global-config: db-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: AUTO #驼峰下划线转换 table-underline: true #数据库大写下划线转换 capital-mode: true #mp2.3+ 全局表前缀 tb_ table-prefix: tb_ #刷新mapper 调试神器 # refresh-mapper: true configuration: #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId) map-underscore-to-camel-case: true cache-enabled: false #mybatis日志输出 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #数据库 pagehelper: helper-dialect: mysql reasonable: true src/main/resources/mapper/0Mapper.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.lxw.test3d.mapper" > </mapper> src/test/java/com/lxw/test3d/Test3dApplicationTests.java
File was deleted test3d.dbBinary files differ