src/main/java/com/whyc/controller/DynamicLoadStateController.java
New file @@ -0,0 +1,24 @@ package com.whyc.controller; import com.whyc.dto.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 交流电阻负载-状态 */ @RestController @RequestMapping("dynamicLoadState") @Api(tags = "交流电阻负载-状态") public class DynamicLoadStateController { @GetMapping("ws") @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId") public Response doc(){ return new Response().setMsg(1,"查看接口描述"); } } src/main/java/com/whyc/controller/Electric2MWStateController.java
New file @@ -0,0 +1,24 @@ package com.whyc.controller; import com.whyc.dto.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 交流电阻负载-状态 */ @RestController @RequestMapping("electric2MWState") @Api(tags = "3号大功率整流电源-状态") public class Electric2MWStateController { @GetMapping("ws") @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId") public Response doc(){ return new Response().setMsg(1,"查看接口描述"); } } src/main/java/com/whyc/controller/ElectricStateController.java
New file @@ -0,0 +1,24 @@ package com.whyc.controller; import com.whyc.dto.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 交流电阻负载-状态 */ @RestController @RequestMapping("electricState") @Api(tags = "1号,2号大功率整流电源-状态") public class ElectricStateController { @GetMapping("ws") @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId") public Response doc(){ return new Response().setMsg(1,"查看接口描述"); } } src/main/java/com/whyc/controller/MotorStateController.java
@@ -12,8 +12,8 @@ import javax.annotation.Resource; @RestController @RequestMapping("motor") @Api(tags = "电机") @RequestMapping("motorState") @Api(tags = "电机-状态") @Slf4j public class MotorStateController { @Resource @@ -45,4 +45,10 @@ return motorStateService.getAll(pageNum,pageSize); } @GetMapping("ws") @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId") public Response doc(){ return new Response().setMsg(1,"查看接口描述"); } } src/main/java/com/whyc/mapper/DynamicLoadStateMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.DynamicLoadStateRt; public interface DynamicLoadStateMapper extends CustomMapper<DynamicLoadStateRt> { } src/main/java/com/whyc/mapper/Electric2MWStateMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.Electric2MWState; public interface Electric2MWStateMapper extends CustomMapper<Electric2MWState> { } src/main/java/com/whyc/mapper/ElectricStateMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.ElectricState; public interface ElectricStateMapper extends CustomMapper<ElectricState> { } src/main/java/com/whyc/pojo/DynamicLoadStateRt.java
@@ -1,5 +1,6 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.ibatis.type.Alias; @@ -7,7 +8,7 @@ import java.util.Date; /** * 动态负载状态实时 * 水冷交流电阻负载-状态 */ @Alias("DynamicLoadStateRt") @TableName(schema = "db_experiment",value = "tb_dynamicload_state_rt") @@ -28,12 +29,19 @@ Float actualCurr ; //实际电流 Float actualMov ; //实际电压 Integer switchOn ; //是否合闸 @TableField("FZ_autostate1") Integer FZAutoState1 ; //FZ自动状态1 @TableField("FZ_autostate2") Integer FZAutoState2 ; //FZ自动状态2 @TableField("FZ_autostate3") Integer FZAutoState3 ; //FZ自动状态3 @TableField("FZ_autostate4") Integer FZAutoState4 ; //FZ自动状态4 @TableField("FZ_autostate5") Integer FZAutoState5 ; //FZ自动状态5 @TableField("react_overtem") Integer reactOverTem ; //电抗超温 @TableField("water_overtem") Integer waterOverTem ; //冷却水超温 Integer waterLevelLow ; //冷却水液位低 Integer waterPressureHigh; //冷却水压高 src/main/java/com/whyc/pojo/Electric2MWState.java
@@ -1,5 +1,6 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.ibatis.type.Alias; @@ -7,35 +8,56 @@ import java.util.Date; /** * TODO:电子2mw状态 * 3号大功率整流电源-状态 */ @Alias("Electric2MWState") @TableName(schema = "db_experiment",value = "tb_electric2mw_state") public class Electric2MWState { Long num; @TableField("electric2KW_id") Integer electric2KWId; @JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai") Date recordTime; @TableField("brachdcvol") Float branchDCVol ; // 分直流电压 @TableField("brachdccurr") Float branchDCCurr ; // 分直流电流 @TableField("alldcvol") Float allDCVol ; // 总直流电压 @TableField("alldccurr") Float allDCCurr ; // 总直流电流 @TableField("stopchargevol_one") Float stopChargeVolOne ; // 第1阶段充电终止电压 @TableField("stopchargevol_two") Float stopChargeVolTwo ; // 第2阶段充电终止电压 @TableField("stopchargevol_three") Float stopChargeVolThree ; // 第3阶段充电终止电压 @TableField("stopchargevol_four") Float stopChargeVolFour ; // 第4阶段充电终止电压 @TableField("stopchargevol_five") Float stopChargeVolFive ; // 第5阶段充电终止电压 @TableField("controlangle") Float controlAngle ; // 控制角 @TableField("localgivevol") Float localGiveVol ; // 当前给定电压 @TableField("volset") Float VolSet ; // 电压设定值 @TableField("localgivecurr") Float localGiveCurr ; // 当前给定电流 @TableField("currset") Float CurrSet ; // 电流设定值 @TableField("chargecurr_one") Float ChargeCurrOne ; // 第1阶段充电电流值 @TableField("chargecurr_two") Float ChargeCurrTwo ; // 第2阶段充电电流值 @TableField("chargecurr_three") Float ChargeCurrThree ; // 第3阶段充电电流值 @TableField("chargecurr_four") Float ChargeCurrFour ; // 第4阶段充电电流值 @TableField("chargecurr_five") Float ChargeCurrFive ; // 第5阶段充电电流值 @TableField("consvolmode_chargecurr") Float consVolModeChargeCurr ; // 转为恒压模式充电电压值 String note ; // 备用 src/main/java/com/whyc/pojo/ElectricState.java
@@ -1,5 +1,6 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.ibatis.type.Alias; @@ -7,7 +8,7 @@ import java.util.Date; /** * TODO:电子设备状态 * 1号,2号大功率整流电源-状态 */ @Alias("ElectricState") @TableName(schema = "db_experiment",value = "tb_electric_state") @@ -23,12 +24,16 @@ Integer stopButton ; //急停按钮 Integer mainCabinetFanStatus ; //主柜风机状态 Integer transCabinetDoorLock ; //变压器柜门连锁 @TableField("trans_cabinet_overtem_alarm") Integer transCabinetOverTemAlarm ; //变压器超温报警 @TableField("trans_cabinet_overtem_trip") Integer transCabinetOverTemTrip ; //变压器超温跳闸 Integer qs1State ; //QS1状态 Integer qs2State ; //QS2状态 Integer switchCabinetDoorStatus ; //转换开关柜门状态 @TableField("alldcvol") Float allDCVol ; //总直流电压 @TableField("alldccurr") Float allDCCurr ; //总直流电流 Integer connFlag ; //串/并联状态 String note; src/main/java/com/whyc/service/DynamicLoadStateService.java
New file @@ -0,0 +1,24 @@ package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.whyc.dto.Response; import com.whyc.mapper.DynamicLoadStateMapper; import com.whyc.pojo.DynamicLoadStateRt; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class DynamicLoadStateService { @Resource private DynamicLoadStateMapper mapper; public Response<DynamicLoadStateRt> get(Integer deviceId){ QueryWrapper<DynamicLoadStateRt> wrapper = Wrappers.query(); wrapper.eq("dev_id",deviceId).last("limit 1"); DynamicLoadStateRt dynamicLoadStateRt = mapper.selectOne(wrapper); return new Response<DynamicLoadStateRt>().set(1,dynamicLoadStateRt); } } src/main/java/com/whyc/service/Electric2MWStateService.java
New file @@ -0,0 +1,26 @@ package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.whyc.dto.Response; import com.whyc.mapper.Electric2MWStateMapper; import com.whyc.mapper.ElectricStateMapper; import com.whyc.pojo.Electric2MWState; import com.whyc.pojo.ElectricState; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class Electric2MWStateService { @Resource private Electric2MWStateMapper mapper; public Response<Electric2MWState> get(Integer deviceId){ QueryWrapper<Electric2MWState> wrapper = Wrappers.query(); wrapper.eq("electric2KW_id",deviceId).last("limit 1"); Electric2MWState electricState = mapper.selectOne(wrapper); return new Response<Electric2MWState>().set(1,electricState); } } src/main/java/com/whyc/service/ElectricStateService.java
New file @@ -0,0 +1,26 @@ package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.whyc.dto.Response; import com.whyc.mapper.DynamicLoadStateMapper; import com.whyc.mapper.ElectricStateMapper; import com.whyc.pojo.DynamicLoadStateRt; import com.whyc.pojo.ElectricState; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class ElectricStateService { @Resource private ElectricStateMapper mapper; public Response<ElectricState> get(Integer deviceId){ QueryWrapper<ElectricState> wrapper = Wrappers.query(); wrapper.eq("electric_id",deviceId).last("limit 1"); ElectricState electricState = mapper.selectOne(wrapper); return new Response<ElectricState>().set(1,electricState); } } src/main/java/com/whyc/swagger/SwaggerConfig4Knife.java
@@ -22,7 +22,7 @@ public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .groupName("半仿真试验系统") .groupName("实验室仿真系统") .select() .apis(RequestHandlerSelectors.any()) .apis(RequestHandlerSelectors.basePackage("com.whyc.controller")) @@ -31,9 +31,9 @@ private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("半仿真试验系统") //大标题 title .title("实验室仿真系统") //大标题 title .contact(new Contact("PerryHsu","todo","todo")) .description("半仿真试验系统") //小标题 .description("实验室仿真系统") //小标题 .version("1.0") //版本 // .termsOfServiceUrl("http://xxx.xxx.com") //终端服务程序 // .license("LICENSE") //链接显示文字 src/main/java/com/whyc/timer/Timer.java
@@ -15,7 +15,7 @@ @EnableScheduling public class Timer { @Scheduled(cron = "0/60 * * * * *") //@Scheduled(cron = "0/60 * * * * *") public void timer1() { //获取当前时间 LocalDateTime localDateTime = LocalDateTime.now(); src/main/java/com/whyc/ws/DeviceWebSocket.java
New file @@ -0,0 +1,184 @@ package com.whyc.ws; import com.whyc.dto.Response; import com.whyc.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; /** * webSocket实现与客户端消息交互 * * 页面端,三个电源数据的实时监控,可以在打开第一个电源实时页面的时候,触发ws连接开启,点中某个电源时,页面ws发送message:传入参数:实时类型和电源id. * 一个WsSession一次开启ws,ws连接其实与http极为相似 */ @ServerEndpoint(value = "/websocket",encoders = WebSocketEncoder.class) @Component public class DeviceWebSocket { private static DynamicLoadStateService dynamicLoadStateService; private static MotorStateService motorStateService; private static ElectricStateService electricStateService; private static Electric2MWStateService electric2MWStateService; @Autowired public void setDynamicLoadStateService(DynamicLoadStateService dynamicLoadStateService) { DeviceWebSocket.dynamicLoadStateService = dynamicLoadStateService; } @Autowired public void setMotorStateService(MotorStateService motorStateService) { DeviceWebSocket.motorStateService = motorStateService; } @Autowired public void setElectricStateService(ElectricStateService electricStateService) { DeviceWebSocket.electricStateService = electricStateService; } @Autowired public void setElectric2MWStateService(Electric2MWStateService electric2MWStateService) { DeviceWebSocket.electric2MWStateService = electric2MWStateService; } private Integer userId; //concurrent包的线程安全,用来存放每个客户端对应的MyWebSocket对象。 //若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识 // private static Map<String, WebSocket> webSockets = new ConcurrentHashMap<>(); private static CopyOnWriteArraySet<DeviceWebSocket> webSockets = new CopyOnWriteArraySet<>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 连接建立成功调用的方法 * * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(Session session) { System.out.println("websocket1..."); this.session = session; webSockets.add(this); } /** * 收到客户端消息后调用的方法 * 连续监控到3次消息,会启动3个线程,这样导致 ws到页面 是3个响应数据;所以需要关闭ws后再打开ws 或者... * @param message 客户端发送过来的消息 * @param session 可选的参数 */ @OnMessage public void onMessage(String message,Session session) { try { this.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } /*try { this.sendMessage(message); } catch (IOException e) { e.printStackTrace(); }*/ /*System.out.println(session.getId()); final String powerDeviceId = message; final Session sessionThread = session; Thread thread = new Thread("Thread_PowerACDCData"){ @Override public void run() { while (true) { try { sleep(4000); //获取powerACData记录 ServiceModel model =service.get(powerDeviceId); if(sessionThread.isOpen()) { sessionThread.getBasicRemote().sendObject(model); }else{ break; } } catch (IOException | InterruptedException | EncodeException e) { e.printStackTrace(); } } } }; thread.start();*/ /*//群发消息 for(PowerACDCDataWebSocket item: webSockets){ try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); continue; } }*/ } /** * 该方法没有用注解,是根据自己需要添加的方法。在自己的业务中调用,发送消息给前端。 */ public void sendMessage(String deviceId) throws IOException{ Thread thread = new Thread("Thread_DeviceManage"){ @Override public void run() { while (true) { try { Response model = null; //获取记录 if(deviceId.startsWith("1")) { model = dynamicLoadStateService.get(Integer.parseInt(deviceId)); } else if(deviceId.startsWith("2")) { model = motorStateService.getById(Integer.parseInt(deviceId)); } else if(deviceId.startsWith("3")) { model = electricStateService.get(Integer.parseInt(deviceId)); } else if(deviceId.startsWith("4")) { model = electric2MWStateService.get(Integer.parseInt(deviceId)); } if(session.isOpen()) { session.getBasicRemote().sendObject(model); }else{ break; } sleep(4000); } catch (IOException | InterruptedException | EncodeException e) { e.printStackTrace(); } } } }; thread.start(); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { System.out.println("closing"); webSockets.remove(this); } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println("发生错误"); error.printStackTrace(); } }