Browse Source

1、设备更换,动态添加采集指令以及增加校验位;2、增加时控校验;3、增加瑞星热泵时钟校验;

prod_202403
mh 8 months ago
parent
commit
19248479eb
  1. 16
      user-service/pom.xml
  2. 1
      user-service/src/main/java/com/mh/user/UserServiceApplication.java
  3. 182
      user-service/src/main/java/com/mh/user/aspect/DaoAspect.java
  4. 1
      user-service/src/main/java/com/mh/user/config/QuartzConfig.java
  5. 5
      user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java
  6. 2
      user-service/src/main/java/com/mh/user/controller/SerialPortController.java
  7. 5
      user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java
  8. 1
      user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java
  9. 3
      user-service/src/main/java/com/mh/user/job/DealDataJob.java
  10. 15
      user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java
  11. 12
      user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java
  12. 7
      user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java
  13. 558
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java
  14. 4
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java
  15. 436
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java
  16. 15
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  17. 2
      user-service/src/main/java/com/mh/user/service/DeviceInstallService.java
  18. 2
      user-service/src/main/java/com/mh/user/service/NowDataService.java
  19. 56
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  20. 19
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  21. 4
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  22. 21
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  23. 7
      user-service/src/main/java/com/mh/user/utils/CacheUtil.java
  24. 34
      user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java
  25. 204
      user-service/src/main/java/com/mh/user/utils/TimedTask2.java
  26. 6
      user-service/src/main/resources/application-dev.yml
  27. 18
      user-service/src/main/resources/application-prod.yml
  28. 15
      user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java
  29. 7
      热水新增脚本.sql

16
user-service/pom.xml

@ -36,11 +36,11 @@
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-config</artifactId>-->
<!-- <version>2.2.2.RELEASE</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
@ -142,6 +142,12 @@
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>

1
user-service/src/main/java/com/mh/user/UserServiceApplication.java

@ -3,7 +3,6 @@ package com.mh.user;
import com.mh.user.job.CollectionLoopRunner;
import com.mh.user.serialport.SerialPortListener;
import com.mh.user.serialport.SerialPortUtil;
import com.mh.user.utils.TimedTask2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

182
user-service/src/main/java/com/mh/user/aspect/DaoAspect.java

@ -1,91 +1,91 @@
package com.mh.user.aspect;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import com.mh.common.utils.StringUtils;
import com.mh.user.utils.SecurityUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* DAO切面插入创建人创建时间修改人修改时间
* @author Louis
* @date Oct 29, 2018
*/
@Aspect
@Component
@Configuration
public class DaoAspect {
private static final String createBy = "createBy";
private static final String createTime = "createTime";
private static final String lastUpdateBy = "lastUpdateBy";
private static final String lastUpdateTime = "lastUpdateTime";
@Pointcut("execution(* com.mh.*.mapper.*.update*(..))")
public void daoUpdate() {
}
@Pointcut("execution(* com.mh.*.mapper.*.insert*(..))")
public void daoCreate() {
}
@Around("daoUpdate()")
public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) {
return pjp.proceed();
}
HttpServletRequest request = attributes.getRequest();
String token = request.getHeader("token");
String username = getUserName();
if (token != null && username != null) {
Object[] objects = pjp.getArgs();
if (objects != null && objects.length > 0) {
for (Object arg : objects) {
BeanUtils.setProperty(arg, lastUpdateBy, username);
BeanUtils.setProperty(arg, lastUpdateTime, new Date());
}
}
}
Object object = pjp.proceed();
return object;
}
@Around("daoCreate()")
public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) {
return pjp.proceed();
}
Object[] objects = pjp.getArgs();
if (objects != null && objects.length > 0) {
for (Object arg : objects) {
String username = getUserName();
if (username != null) {
if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) {
BeanUtils.setProperty(arg, createBy, username);
}
if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) {
BeanUtils.setProperty(arg, createTime, new Date());
}
}
}
}
Object object = pjp.proceed();
return object;
}
private String getUserName() {
return SecurityUtils.getUsername();
}
}
//package com.mh.user.aspect;
//
//import java.util.Date;
//
//import javax.servlet.http.HttpServletRequest;
//
//import com.mh.common.utils.StringUtils;
//import com.mh.user.utils.SecurityUtils;
//import org.apache.commons.beanutils.BeanUtils;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
///**
// * DAO切面,插入创建人,创建时间,修改人,修改时间
// * @author Louis
// * @date Oct 29, 2018
// */
//@Aspect
//@Component
//@Configuration
//public class DaoAspect {
// private static final String createBy = "createBy";
// private static final String createTime = "createTime";
// private static final String lastUpdateBy = "lastUpdateBy";
// private static final String lastUpdateTime = "lastUpdateTime";
//
// @Pointcut("execution(* com.mh.*.mapper.*.update*(..))")
// public void daoUpdate() {
// }
//
// @Pointcut("execution(* com.mh.*.mapper.*.insert*(..))")
// public void daoCreate() {
// }
//
// @Around("daoUpdate()")
// public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable {
// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// if (attributes == null) {
// return pjp.proceed();
// }
// HttpServletRequest request = attributes.getRequest();
// String token = request.getHeader("token");
// String username = getUserName();
// if (token != null && username != null) {
// Object[] objects = pjp.getArgs();
// if (objects != null && objects.length > 0) {
// for (Object arg : objects) {
// BeanUtils.setProperty(arg, lastUpdateBy, username);
// BeanUtils.setProperty(arg, lastUpdateTime, new Date());
// }
// }
// }
// Object object = pjp.proceed();
// return object;
//
// }
//
// @Around("daoCreate()")
// public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable {
// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// if (attributes == null) {
// return pjp.proceed();
// }
// Object[] objects = pjp.getArgs();
// if (objects != null && objects.length > 0) {
// for (Object arg : objects) {
// String username = getUserName();
// if (username != null) {
// if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) {
// BeanUtils.setProperty(arg, createBy, username);
// }
// if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) {
// BeanUtils.setProperty(arg, createTime, new Date());
// }
// }
// }
// }
// Object object = pjp.proceed();
// return object;
// }
//
// private String getUserName() {
// return SecurityUtils.getUsername();
// }
//}

1
user-service/src/main/java/com/mh/user/config/QuartzConfig.java

@ -1,7 +1,6 @@
package com.mh.user.config;
import com.mh.user.job.JobFactory;
import com.mh.user.utils.TimedTask2;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Scheduler;
import org.springframework.context.annotation.Bean;

5
user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java

@ -1,6 +1,7 @@
package com.mh.user.controller;
import com.mh.common.http.HttpResult;
import com.mh.common.utils.StringUtils;
import com.mh.user.annotation.BusinessType;
import com.mh.user.annotation.SysLogger;
import com.mh.user.entity.BuildingEntity;
@ -55,6 +56,10 @@ public class DeviceInstallController {
DeviceInstallEntity oldEntity = deviceInstallService.selectDeviceById(deviceInstallEntity.getId());
// 删除全部的device_code_param值
deviceInstallService.deleteParamCode(oldEntity);
// 设置校验位
if (StringUtils.isBlank(deviceInstallEntity.getParity())) {
deviceInstallEntity.setParity(oldEntity.getParity());
}
// 在创建新的device_code_param值
deviceInstallService.createParamCode(deviceInstallEntity);
// 更新device_install

2
user-service/src/main/java/com/mh/user/controller/SerialPortController.java

@ -11,8 +11,6 @@ import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.PumpSetEntity;
import com.mh.user.model.DeviceModel;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSendReceive;
import com.mh.user.serialport.SerialPortSingle;
import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.ControlSetService;
import com.mh.user.service.DeviceInstallService;

5
user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java

@ -32,5 +32,10 @@ public class DeviceInstallEntity {
private String remarks;
private double dayValue;
private double deviationValue;
private int isUse;
private int isFault;
private String seat;
}

1
user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java

@ -10,6 +10,7 @@ public class WaterLevelEntity {
private Date curDate;
private String buildingID;
private String buildingName;
private String deviceName;
private String level00;
private String level02;
private String level08;

3
user-service/src/main/java/com/mh/user/job/DealDataJob.java

@ -1,13 +1,10 @@
package com.mh.user.job;
import com.mh.user.constants.Constant;
import com.mh.user.serialport.SerialPortSendReceive;
import com.mh.user.serialport.SerialPortThread;
import com.mh.user.service.DeviceCodeParamService;
import com.mh.user.service.DealDataService;
import com.mh.user.utils.AnalysisReceiveOrder485;
import com.mh.user.utils.ComThreadPoolService;
import com.mh.user.utils.GetReadOrder485;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;

15
user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java

@ -101,11 +101,12 @@ public interface DeviceCodeParamMapper {
"register_addr," +
"create_time," +
"building_id," +
"parity" +
"parity," +
"thread" +
")" +
"values " +
"<foreach collection='deviceCodeParamEntityList' item='item' separator=','>" +
"(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity})" +
"(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity},#{item.thread})" +
"</foreach>" +
"</script>")
void insertDeviceCodeParamList(@Param("deviceCodeParamEntityList") List<DeviceCodeParamEntity> deviceCodeParamEntityList);
@ -123,11 +124,12 @@ public interface DeviceCodeParamMapper {
"register_addr," +
"create_time," +
"building_id," +
"parity" +
"parity," +
"thread" +
")" +
"values " +
"<foreach collection='deviceCodeParamEntityList' item='item' separator=','>" +
"(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity})" +
"(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity},#{item.thread})" +
"</foreach>" +
"</script>")
void insertDeviceCodeParamList2(@Param("deviceCodeParamEntityList") List<DeviceCodeParamEntity> deviceCodeParamEntityList);
@ -145,11 +147,12 @@ public interface DeviceCodeParamMapper {
"register_addr," +
"create_time," +
"building_id," +
"parity" +
"parity," +
"thread" +
")" +
"values " +
"<foreach collection='deviceCodeParamEntityList' item='item' separator=','>" +
"(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity})" +
"(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity},#{item.thread})" +
"</foreach>" +
"</script>")
void insertDeviceCodeParamList3(@Param("deviceCodeParamEntityList") List<DeviceCodeParamEntity> deviceCodeParamEntityList);

12
user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java

@ -6,11 +6,13 @@ import com.mh.user.mapper.provider.DeviceInstallProvider;
import com.mh.user.model.DeviceModel;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.StatementType;
import tk.mybatis.mapper.common.BaseMapper;
import java.util.Date;
import java.util.List;
@Mapper
public interface DeviceInstallMapper {
public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
/**
* 设备安装模块
@ -41,6 +43,7 @@ public interface DeviceInstallMapper {
" <if test='installer!=null'> , installer = #{installer} </if>" +
" <if test='buildingId!=null'> , building_id = #{buildingId} </if>" +
" <if test='remarks!=null'> , remarks = #{remarks} </if>" +
" <if test='parity!=null'> , parity = #{parity} </if>" +
" where id = #{id} " +
"</script>")
int updateDevice(DeviceInstallEntity deviceInstallEntity);
@ -320,6 +323,13 @@ public interface DeviceInstallMapper {
@Param("deviceType") String deviceType,
@Param("buildingId") String buildingId);
@ResultMap("rs")
@Select("select * from device_install where id = #{id} ")
DeviceInstallEntity selectDeviceById(@Param("id") Long id);
@Update("update device_install set last_value = #{lastValue}, last_date = getdate() where device_addr = #{deviceAddr} and building_id = #{buildingId} and device_type = #{deviceType} ")
void updateLastValueByOther(@Param("deviceAddr") String addr,
@Param("lastValue") String strWtLevel,
@Param("deviceType") String deviceType,
@Param("buildingId") String buildingId);
}

7
user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java

@ -176,7 +176,8 @@ public interface NowDataMapper {
@Results({
@Result(property="curDate",column="cur_date"),
@Result(property="buildingID",column="building_id"),
@Result(property="buildingName",column="building_name")
@Result(property="buildingName",column="building_name"),
@Result(property="deviceName",column="device_name")
})
@SelectProvider(type = NowDataProvider.class,method = "queryBuildWaterLevel")
List<WaterLevelEntity> queryBuildWaterLevel(@Param("curDate") String curDate,
@ -305,9 +306,9 @@ public interface NowDataMapper {
void proWaterTemp(@Param("curDate") String curDate,@Param("buildingID") String buildingID,@Param("pumpID") String pumpID);
//生成楼栋水位
@Select("exec pro_waterLevel #{curDate,jdbcType=VARCHAR,mode=IN},#{buildingID,jdbcType=VARCHAR,mode=IN} ")
@Select("exec pro_waterLevel #{curDate,jdbcType=VARCHAR,mode=IN},#{buildingID,jdbcType=VARCHAR,mode=IN}, #{deviceAddr,jdbcType=VARCHAR,mode=IN} ")
@Options(statementType = StatementType.CALLABLE)
void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID);
void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID, @Param("deviceAddr") String deviceAddr);
//在没有接收到返回值前设置监控界面热泵是否离线
@Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}")

558
user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java

@ -1,281 +1,281 @@
package com.mh.user.serialport;
import com.mh.user.constants.Constant;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceCodeParamService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
import com.mh.user.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import gnu.io.SerialPort;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author nxr
* @title
* @description 串口发送和接收处理,采集类
* @updateTime 2022-08-10
* @throws
*/
@Slf4j
public class SerialPortSendReceive {
private String receiveStr = null;
public SerialPort serialPort = null;
private int size = 0;
private int baudrate=9600;
private String parity=null;
List<DeviceCodeParamEntity> deviceManageEntityList;
// 调用service
ApplicationContext context = SpringBeanUtil.getApplicationContext();
DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class);
DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class);
NowDataService nowDataService = context.getBean(NowDataService.class);
BuildingService buildingService = context.getBean(BuildingService.class);
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
public void serialPortSend(String sort,String thread) {
//查看所有串口
SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();
ArrayList<String> port = serialPortUtil.findPort();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String dateStr = df.format(date);
// SerialTool serialPortUtil = SerialTool.getSerialPortUtil();
//package com.mh.user.serialport;
//
//import com.mh.user.constants.Constant;
//import com.mh.user.entity.DeviceCodeParamEntity;
//import com.mh.user.service.BuildingService;
//import com.mh.user.service.DeviceCodeParamService;
//import com.mh.user.service.DeviceInstallService;
//import com.mh.user.service.NowDataService;
//import com.mh.user.utils.*;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.context.ApplicationContext;
//import gnu.io.SerialPort;
//import java.nio.ByteBuffer;
//import java.nio.charset.StandardCharsets;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//
///**
// * @author nxr
// * @title :
// * @description : 串口发送和接收处理,采集类
// * @updateTime 2022-08-10
// * @throws :
// */
//@Slf4j
//public class SerialPortSendReceive {
//
// private String receiveStr = null;
// public SerialPort serialPort = null;
// private int size = 0;
// private int baudrate=9600;
// private String parity=null;
// List<DeviceCodeParamEntity> deviceManageEntityList;
// // 调用service
// ApplicationContext context = SpringBeanUtil.getApplicationContext();
// DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class);
// DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class);
// NowDataService nowDataService = context.getBean(NowDataService.class);
// BuildingService buildingService = context.getBean(BuildingService.class);
// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
//
// public void serialPortSend(String sort,String thread) {
// //查看所有串口
// SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();
// ArrayList<String> port = serialPortUtil.findPort();
// comName=comName.toUpperCase(); //转为大写
// if (port.contains(comName)){
try{
//生成对应的采集指令
if (sort.equals("1")){ //水温、水位
deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread);
}else if (sort.equals("2")){ //采集水、电、运行状态!
deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread);
}else if (sort.equals("3")){ //采集设定温度、设定水位、故障状态!
deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread);
}else{
deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread);
}
size = deviceManageEntityList.size();
for (int i=0;i<size;i++){
//判断网页端是否有操作设备的
if (Constant.WEB_FLAG) {
Constant.FLAG=false;
serialPortUtil.closePort(serialPort);
// Thread.sleep(2000);
log.info("有指令下发退出定时采集");
break;
}
//获取设备实际波特率
baudrate=deviceManageEntityList.get(i).getBaudrate();
//获取设备实际校验位
parity=deviceManageEntityList.get(i).getParity();
String comName=deviceManageEntityList.get(i).getDataCom();
comName=comName.toUpperCase(); //转为大写
if (port.contains(comName)){
String deviceAddr=deviceManageEntityList.get(i).getDeviceAddr();
String deviceType=deviceManageEntityList.get(i).getDeviceType();
String registerAddr=deviceManageEntityList.get(i).getRegisterAddr();
String brand=deviceManageEntityList.get(i).getBrand();//品牌
String buildingId=deviceManageEntityList.get(i).getBuildingId();
String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
try{
//传入对应的串口参数并打开串口
if (parity==null || parity.equals("") || parity.equalsIgnoreCase("none")){
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD);
}else{
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD);
}
//向串口发送指令
if (serialPort != null) {
// log.info("---------波特率:"+baudrate+",校验位:"+parity+" -----------");
SendOrderUtils.sendSerialPort(deviceManageEntityList.get(i), serialPort);
if (deviceType.equals("热泵")){
Thread.sleep(4000);
}else{
Thread.sleep(2000);
}
}else{
continue; //continue时,跳出本次循环,继续执行下次循环。Break时,跳出循环(结束循环),执行下面的语句。
}
}catch (Exception e){
Constant.WEB_FLAG=false;//可以采集的状态
if(i==size-1){
Constant.FLAG=false;
}
log.error("发送指令异常==>", e);
}
receiveStr="";
//从串口读取数据
byte[] bytes= serialPortUtil.readFromPort(serialPort);
try {
String byteStr = new String(bytes, 0, bytes.length).trim();
} catch (NullPointerException e) {
serialPortUtil.closePort(serialPort);
Thread.sleep(2000);
log.info("串口"+serialPort+"没有数据返回!"+i);
log.info("----------------"+deviceType+"离线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------");
Constant.WEB_FLAG=false;//可以采集的状态
if(i==size-1){
Constant.FLAG=false;
}
String time1=deviceInstallService.selectLastDate(deviceType,deviceAddr,buildingId);
Date date1=new Date();
String time2=df.format(date1);
if (time1==null){
time1=df.format(date1);
}
int d= ExchangeStringUtil.compareCopyTime(time1,time2);
if (d==1){
deviceInstallService.updateNotOnline(deviceAddr,deviceType,buildingId,"离线"); //所有设备离线
if (deviceType.equals("热泵")){
nowDataService.updateRunState(buildingId,deviceAddr,"离线", buildingName); //监控界面状态表热泵在线状态
}
}
continue;
}
receiveStr = receiveStr + printHexString(bytes);
//去掉空格和null
receiveStr = receiveStr.replace("null", "");
receiveStr = receiveStr.replace(" ", "");
log.info("串口"+serialPort+"接受第"+i+"数据:" + receiveStr + ",大小: " + receiveStr.length());
try{
serialPortUtil.closePort(serialPort);
log.info("关闭"+serialPort);
}catch (Exception e){
// e.printStackTrace();
Constant.WEB_FLAG=false;//可以采集的状态
if(i==size-1){
Constant.FLAG=false;
}
log.error("关闭"+serialPort+"失败!");
}
//返回值全部变成大写
String receiveData = receiveStr.toUpperCase();
//截取去掉FE
String dataStr;
if (receiveData.length()>8){
String str1=receiveData.substring(0,8);
String str2=receiveData.substring(8);
dataStr=str1.replace("FE", "")+str2;
}else{
dataStr = receiveData.replace("FE", "");
}
deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线
log.info("----------------"+deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------");
if (deviceType.equals("热泵")){
String strState=nowDataService.selectState(buildingId,deviceAddr);
if (strState!=null && strState.equals("离线")){ //采集到数据
nowDataService.updateRunState(buildingId,deviceAddr,"不运行", buildingName); //监控界面状态表热泵在线状态
}
}
try{
SerialPortSendReceive2.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName);
}catch (Exception e){
// e.printStackTrace();
Constant.WEB_FLAG=false;//可以采集的状态
if(i==size-1){
Constant.FLAG=false;
}
log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i);
}
Thread.sleep(1000);
}else{
Constant.WEB_FLAG=false;//可以采集的状态
if(i==size-1){
Constant.FLAG=false;
}
log.info("-------------串口:"+comName+"不存在!-------------");
}
if(i==size-1){
Constant.FLAG=false;
log.info("-------------一轮采集完,采集标志Constant.Flag="+Constant.FLAG+"-------------");
}
}
}catch (Exception e){
e.printStackTrace();
Constant.WEB_FLAG=false;//可以采集的状态
Constant.FLAG=false;
log.error("-------------串口采集异常!-------------");
}
// }else {
// log.info("串口:"+comName+"不存在!");
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// Date date = new Date();
// String dateStr = df.format(date);
//
//// SerialTool serialPortUtil = SerialTool.getSerialPortUtil();
//// ArrayList<String> port = serialPortUtil.findPort();
//// comName=comName.toUpperCase(); //转为大写
//// if (port.contains(comName)){
// try{
// //生成对应的采集指令
// if (sort.equals("1")){ //水温、水位
// deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread);
// }else if (sort.equals("2")){ //采集水、电、运行状态!
// deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread);
// }else if (sort.equals("3")){ //采集设定温度、设定水位、故障状态!
// deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread);
// }else{
// deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread);
// }
// size = deviceManageEntityList.size();
// for (int i=0;i<size;i++){
// //判断网页端是否有操作设备的
// if (Constant.WEB_FLAG) {
// Constant.FLAG=false;
// serialPortUtil.closePort(serialPort);
//// Thread.sleep(2000);
// log.info("有指令下发退出定时采集");
// break;
// }
// //获取设备实际波特率
// baudrate=deviceManageEntityList.get(i).getBaudrate();
// //获取设备实际校验位
// parity=deviceManageEntityList.get(i).getParity();
// String comName=deviceManageEntityList.get(i).getDataCom();
// comName=comName.toUpperCase(); //转为大写
// if (port.contains(comName)){
// String deviceAddr=deviceManageEntityList.get(i).getDeviceAddr();
// String deviceType=deviceManageEntityList.get(i).getDeviceType();
// String registerAddr=deviceManageEntityList.get(i).getRegisterAddr();
// String brand=deviceManageEntityList.get(i).getBrand();//品牌
// String buildingId=deviceManageEntityList.get(i).getBuildingId();
// String buildingName=buildingService.queryBuildingName(buildingId); //查询楼栋名称
// try{
// //传入对应的串口参数并打开串口
// if (parity==null || parity.equals("") || parity.equalsIgnoreCase("none")){
// serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD);
// }else{
// serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD);
// }
// //向串口发送指令
// if (serialPort != null) {
//// log.info("---------波特率:"+baudrate+",校验位:"+parity+" -----------");
// SendOrderUtils.sendSerialPort(deviceManageEntityList.get(i), serialPort);
// if (deviceType.equals("热泵")){
// Thread.sleep(4000);
// }else{
// Thread.sleep(2000);
// }
// }else{
// continue; //continue时,跳出本次循环,继续执行下次循环。Break时,跳出循环(结束循环),执行下面的语句。
// }
// }catch (Exception e){
// Constant.WEB_FLAG=false;//可以采集的状态
// if(i==size-1){
// Constant.FLAG=false;
// }
// log.error("发送指令异常==>", e);
// }
// receiveStr="";
// //从串口读取数据
// byte[] bytes= serialPortUtil.readFromPort(serialPort);
// try {
// String byteStr = new String(bytes, 0, bytes.length).trim();
// } catch (NullPointerException e) {
// serialPortUtil.closePort(serialPort);
// Thread.sleep(2000);
// log.info("串口"+serialPort+"没有数据返回!"+i);
// log.info("----------------"+deviceType+"离线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------");
// Constant.WEB_FLAG=false;//可以采集的状态
// if(i==size-1){
// Constant.FLAG=false;
// }
// String time1=deviceInstallService.selectLastDate(deviceType,deviceAddr,buildingId);
// Date date1=new Date();
// String time2=df.format(date1);
// if (time1==null){
// time1=df.format(date1);
// }
// int d= ExchangeStringUtil.compareCopyTime(time1,time2);
// if (d==1){
// deviceInstallService.updateNotOnline(deviceAddr,deviceType,buildingId,"离线"); //所有设备离线
// if (deviceType.equals("热泵")){
// nowDataService.updateRunState(buildingId,deviceAddr,"离线", buildingName); //监控界面状态表热泵在线状态
// }
// }
// continue;
// }
// receiveStr = receiveStr + printHexString(bytes);
// //去掉空格和null
// receiveStr = receiveStr.replace("null", "");
// receiveStr = receiveStr.replace(" ", "");
// log.info("串口"+serialPort+"接受第"+i+"数据:" + receiveStr + ",大小: " + receiveStr.length());
// try{
// serialPortUtil.closePort(serialPort);
// log.info("关闭"+serialPort);
// }catch (Exception e){
//// e.printStackTrace();
// Constant.WEB_FLAG=false;//可以采集的状态
// if(i==size-1){
// Constant.FLAG=false;
// }
// log.error("关闭"+serialPort+"失败!");
// }
// //返回值全部变成大写
// String receiveData = receiveStr.toUpperCase();
// //截取去掉FE
// String dataStr;
// if (receiveData.length()>8){
// String str1=receiveData.substring(0,8);
// String str2=receiveData.substring(8);
// dataStr=str1.replace("FE", "")+str2;
// }else{
// dataStr = receiveData.replace("FE", "");
// }
// deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线
// log.info("----------------"+deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------");
// if (deviceType.equals("热泵")){
// String strState=nowDataService.selectState(buildingId,deviceAddr);
// if (strState!=null && strState.equals("离线")){ //采集到数据
// nowDataService.updateRunState(buildingId,deviceAddr,"不运行", buildingName); //监控界面状态表热泵在线状态
// }
// }
// try{
// SerialPortSendReceive2.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName);
// }catch (Exception e){
//// e.printStackTrace();
// Constant.WEB_FLAG=false;//可以采集的状态
// if(i==size-1){
// Constant.FLAG=false;
// }
// log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i);
// }
// Thread.sleep(1000);
// }else{
// Constant.WEB_FLAG=false;//可以采集的状态
// if(i==size-1){
// Constant.FLAG=false;
// }
// log.info("-------------串口:"+comName+"不存在!-------------");
// }
// if(i==size-1){
// Constant.FLAG=false;
// log.info("-------------一轮采集完,采集标志Constant.Flag="+Constant.FLAG+"-------------");
// }
// }
// }catch (Exception e){
// e.printStackTrace();
// Constant.WEB_FLAG=false;//可以采集的状态
// Constant.FLAG=false;
// log.error("-------------串口采集异常!-------------");
// }
//// }else {
//// log.info("串口:"+comName+"不存在!");
//// }
// }
// /**
// * 字节数组转16进制字符串
// * @param b 字节数组
// * @return 16进制字符串
// */
// public static String printHexString(byte[] b) {
// StringBuilder sbf = new StringBuilder();
// for (byte value : b) {
// String hex = Integer.toHexString(value & 0xFF);
// if (hex.length() == 1) {
// hex = '0' + hex;
// }
// sbf.append(hex.toUpperCase()).append(" ");
// }
}
/**
* 字节数组转16进制字符串
* @param b 字节数组
* @return 16进制字符串
*/
public static String printHexString(byte[] b) {
StringBuilder sbf = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sbf.append(hex.toUpperCase()).append(" ");
}
return sbf.toString().trim();
}
/**
* 十六进制字符串转byte[]
* @param hex 十六进制字符串
* @return byte[]
*/
public static byte[] hexStr2Byte(String hex) {
if (hex == null) {
return new byte[] {};
}
// 奇数位补0
if (hex.length() % 2 != 0) {
hex = "0" + hex;
}
int length = hex.length();
ByteBuffer buffer = ByteBuffer.allocate(length / 2);
for (int i = 0; i < length; i++) {
String hexStr = hex.charAt(i) + "";
i++;
hexStr += hex.charAt(i);
byte b = (byte) Integer.parseInt(hexStr, 16);
buffer.put(b);
}
return buffer.array();
}
/**
* 16进制转换成为string类型字符串
* @param s 待转换字符串
*/
public static String hexStringToString(String s) {
if (s == null || "".equals(s)) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, StandardCharsets.UTF_8);
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
}
// return sbf.toString().trim();
// }
//
// /**
// * 十六进制字符串转byte[]
// * @param hex 十六进制字符串
// * @return byte[]
// */
// public static byte[] hexStr2Byte(String hex) {
// if (hex == null) {
// return new byte[] {};
// }
//
// // 奇数位补0
// if (hex.length() % 2 != 0) {
// hex = "0" + hex;
// }
//
// int length = hex.length();
// ByteBuffer buffer = ByteBuffer.allocate(length / 2);
// for (int i = 0; i < length; i++) {
// String hexStr = hex.charAt(i) + "";
// i++;
// hexStr += hex.charAt(i);
// byte b = (byte) Integer.parseInt(hexStr, 16);
// buffer.put(b);
// }
// return buffer.array();
// }
//
// /**
// * 16进制转换成为string类型字符串
// * @param s 待转换字符串
// */
// public static String hexStringToString(String s) {
// if (s == null || "".equals(s)) {
// return null;
// }
// s = s.replace(" ", "");
// byte[] baKeyword = new byte[s.length() / 2];
// for (int i = 0; i < baKeyword.length; i++) {
// try {
// baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// try {
// s = new String(baKeyword, StandardCharsets.UTF_8);
// } catch (Exception e1) {
// e1.printStackTrace();
// }
// return s;
// }
//}

4
user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java

@ -212,7 +212,7 @@ public class SerialPortSendReceive2 {
String buildingName) {
if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
analysisReceiveOrder485.analysisMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
nowDataService.proWaterLevel(dateStr, buildingId); //保存时间点楼栋水位
nowDataService.proWaterLevel(dateStr, buildingId, ""); //保存时间点楼栋水位
} else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
analysisReceiveOrder485.analysisWtMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("压变")) {
@ -230,7 +230,7 @@ public class SerialPortSendReceive2 {
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) {
analysisReceiveOrder485.analysisPumpStateOrder(dataStr, registerAddr, brand, buildingId, buildingName); //创新,热泵状态与水位共用一个8路设备
// analysisReceiveOrder485.analysisRelayOrder485(dataStr,registerAddr,brand,buildingId); //华厦
nowDataService.proWaterLevel(dateStr, buildingId); //保存时间点楼栋水位
nowDataService.proWaterLevel(dateStr, buildingId, ""); //保存时间点楼栋水位
} else if (deviceType.equals("温度变送器")) {
analysisReceiveOrder485.analysisMulTempOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵状态")) {

436
user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java

@ -1,219 +1,219 @@
package com.mh.user.serialport;
import com.mh.user.constants.Constant;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceCodeParamService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
import com.mh.user.utils.AnalysisReceiveOrder485;
import com.mh.user.utils.SendOrderUtils;
import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
//import purejavacomm.SerialPort;
import gnu.io.SerialPort;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* @author nxr
* @title
* @description 串口发送和接收处理,操作类
* @updateTime 2022-08-10
* @throws
*/
@Slf4j
public class SerialPortSingle {
public SerialPort serialPort = null;
private String receiveStr = null;
private int baudrate = 9600;
private String parity = null;
// 调用service
ApplicationContext context = SpringBeanUtil.getApplicationContext();
//DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class);
AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class);
NowDataService nowDataService = context.getBean(NowDataService.class);
BuildingService buildingService = context.getBean(BuildingService.class);
public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) {
//查看所有串口
SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();
ArrayList<String> port = serialPortUtil.findPort();
// SerialTool serialPortUtil = SerialTool.getSerialPortUtil();
//package com.mh.user.serialport;
//
//import com.mh.user.constants.Constant;
//import com.mh.user.entity.DeviceCodeParamEntity;
//import com.mh.user.service.BuildingService;
//import com.mh.user.service.DeviceCodeParamService;
//import com.mh.user.service.DeviceInstallService;
//import com.mh.user.service.NowDataService;
//import com.mh.user.utils.AnalysisReceiveOrder485;
//import com.mh.user.utils.SendOrderUtils;
//import com.mh.user.utils.SpringBeanUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.context.ApplicationContext;
//import org.springframework.stereotype.Component;
////import purejavacomm.SerialPort;
//import gnu.io.SerialPort;
//
//import java.nio.ByteBuffer;
//import java.nio.charset.StandardCharsets;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @author nxr
// * @title :
// * @description : 串口发送和接收处理,操作类
// * @updateTime 2022-08-10
// * @throws :
// */
//@Slf4j
//public class SerialPortSingle {
//
// public SerialPort serialPort = null;
// private String receiveStr = null;
// private int baudrate = 9600;
// private String parity = null;
//
// // 调用service
// ApplicationContext context = SpringBeanUtil.getApplicationContext();
// //DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class);
// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485();
// DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class);
// NowDataService nowDataService = context.getBean(NowDataService.class);
// BuildingService buildingService = context.getBean(BuildingService.class);
//
// public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) {
//
// //查看所有串口
// SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();
// ArrayList<String> port = serialPortUtil.findPort();
String rtData = "";
// System.out.println("发现全部串口:" + port);
String comName = deviceCodeParamEntity.getDataCom().toUpperCase();
if (!port.contains(comName)) {
log.info("串口:" + comName + "不存在!");
return "fail";
}
try {
try {
baudrate = deviceCodeParamEntity.getBaudrate();
parity = deviceCodeParamEntity.getParity();
if (parity == null || parity.equals("") || parity.equalsIgnoreCase("none")) {
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD);
} else {
serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD);
}
//向串口发送指令
log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------");
SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort);
Thread.sleep(1500);
} catch (Exception e) {
log.error("前端设置出现异常==>", e);
return "fail";
}
//对返回数据进行相关解析处理
receiveStr = null;
byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据
if (null == bytes) {
serialPortUtil.closePort(serialPort);
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口");
return "fail";
}
receiveStr = receiveStr + printHexString(bytes);
//去掉空格和null
receiveStr = receiveStr.replace("null", "");
receiveStr = receiveStr.replace(" ", "");
log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length());
//返回值全部变成大写
String receiveData = receiveStr.toUpperCase();
//截取去掉FE
String dataStr = receiveData.replace("FE", "");
String deviceType = deviceCodeParamEntity.getDeviceType();
String deviceAddr = deviceCodeParamEntity.getDeviceAddr();
String registerAddr = deviceCodeParamEntity.getRegisterAddr();
String brand = deviceCodeParamEntity.getBrand();
String buildingId = deviceCodeParamEntity.getBuildingId();
String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName);
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
try {
if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("压变")) {
rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) {
rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵")) {
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) {
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("温度变送器")) {
rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵状态")) {
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
}
} catch (Exception e) {
log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!");
return "fail";
}
Thread.sleep(500);
log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------");
return rtData;
} catch (Exception e) {
log.error("前端设置出现异常==>", e);
return "fail";
} finally {
if (null != serialPort) {
serialPortUtil.closePort(serialPort);
}
}
}
/**
* 字节数组转16进制字符串
*
* @param b 字节数组
* @return 16进制字符串
*/
public static String printHexString(byte[] b) {
StringBuilder sbf = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sbf.append(hex.toUpperCase()).append(" ");
}
return sbf.toString().trim();
}
/**
* 十六进制字符串转byte[]
*
* @param hex 十六进制字符串
* @return byte[]
*/
public static byte[] hexStr2Byte(String hex) {
if (hex == null) {
return new byte[]{};
}
// 奇数位补0
if (hex.length() % 2 != 0) {
hex = "0" + hex;
}
int length = hex.length();
ByteBuffer buffer = ByteBuffer.allocate(length / 2);
for (int i = 0; i < length; i++) {
String hexStr = hex.charAt(i) + "";
i++;
hexStr += hex.charAt(i);
byte b = (byte) Integer.parseInt(hexStr, 16);
buffer.put(b);
}
return buffer.array();
}
/**
* 16进制转换成为string类型字符串
*
* @param s 待转换字符串
*/
public static String hexStringToString(String s) {
if (s == null || "".equals(s)) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, StandardCharsets.UTF_8);
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
}
//// SerialTool serialPortUtil = SerialTool.getSerialPortUtil();
//// ArrayList<String> port = serialPortUtil.findPort();
// String rtData = "";
//// System.out.println("发现全部串口:" + port);
// String comName = deviceCodeParamEntity.getDataCom().toUpperCase();
// if (!port.contains(comName)) {
// log.info("串口:" + comName + "不存在!");
// return "fail";
// }
// try {
// try {
// baudrate = deviceCodeParamEntity.getBaudrate();
// parity = deviceCodeParamEntity.getParity();
// if (parity == null || parity.equals("") || parity.equalsIgnoreCase("none")) {
// serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD);
// } else {
// serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD);
// }
// //向串口发送指令
// log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------");
// SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort);
// Thread.sleep(1500);
// } catch (Exception e) {
// log.error("前端设置出现异常==>", e);
// return "fail";
// }
// //对返回数据进行相关解析处理
// receiveStr = null;
// byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据
// if (null == bytes) {
// serialPortUtil.closePort(serialPort);
// log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口");
// return "fail";
// }
// receiveStr = receiveStr + printHexString(bytes);
// //去掉空格和null
// receiveStr = receiveStr.replace("null", "");
// receiveStr = receiveStr.replace(" ", "");
// log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length());
// //返回值全部变成大写
// String receiveData = receiveStr.toUpperCase();
// //截取去掉FE
// String dataStr = receiveData.replace("FE", "");
// String deviceType = deviceCodeParamEntity.getDeviceType();
// String deviceAddr = deviceCodeParamEntity.getDeviceAddr();
// String registerAddr = deviceCodeParamEntity.getRegisterAddr();
// String brand = deviceCodeParamEntity.getBrand();
// String buildingId = deviceCodeParamEntity.getBuildingId();
// String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
//
// deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
// log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName);
// if (deviceType.equals("热泵")) {
// String strState = nowDataService.selectState(buildingId, deviceAddr);
// if (strState != null && strState.equals("离线")) { //采集到数据
// nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
// }
// }
// try {
// if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
// rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
// rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("压变")) {
// rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统
// analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) {
// rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("热泵")) {
// rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("时控")) {
// rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态
// rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("温度变送器")) {
// rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
// } else if (deviceType.equals("热泵状态")) {
// rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
// }
// } catch (Exception e) {
// log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!");
// return "fail";
// }
// Thread.sleep(500);
// log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------");
// return rtData;
// } catch (Exception e) {
// log.error("前端设置出现异常==>", e);
// return "fail";
// } finally {
// if (null != serialPort) {
// serialPortUtil.closePort(serialPort);
// }
// }
// }
//
// /**
// * 字节数组转16进制字符串
// *
// * @param b 字节数组
// * @return 16进制字符串
// */
// public static String printHexString(byte[] b) {
// StringBuilder sbf = new StringBuilder();
// for (byte value : b) {
// String hex = Integer.toHexString(value & 0xFF);
// if (hex.length() == 1) {
// hex = '0' + hex;
// }
// sbf.append(hex.toUpperCase()).append(" ");
// }
// return sbf.toString().trim();
// }
//
// /**
// * 十六进制字符串转byte[]
// *
// * @param hex 十六进制字符串
// * @return byte[]
// */
// public static byte[] hexStr2Byte(String hex) {
// if (hex == null) {
// return new byte[]{};
// }
//
// // 奇数位补0
// if (hex.length() % 2 != 0) {
// hex = "0" + hex;
// }
//
// int length = hex.length();
// ByteBuffer buffer = ByteBuffer.allocate(length / 2);
// for (int i = 0; i < length; i++) {
// String hexStr = hex.charAt(i) + "";
// i++;
// hexStr += hex.charAt(i);
// byte b = (byte) Integer.parseInt(hexStr, 16);
// buffer.put(b);
// }
// return buffer.array();
// }
//
// /**
// * 16进制转换成为string类型字符串
// *
// * @param s 待转换字符串
// */
// public static String hexStringToString(String s) {
// if (s == null || "".equals(s)) {
// return null;
// }
// s = s.replace(" ", "");
// byte[] baKeyword = new byte[s.length() / 2];
// for (int i = 0; i < baKeyword.length; i++) {
// try {
// baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// try {
// s = new String(baKeyword, StandardCharsets.UTF_8);
// } catch (Exception e1) {
// e1.printStackTrace();
// }
// return s;
// }
//}

15
user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java

@ -46,9 +46,9 @@ public class SerialPortSingle2 {
} else {
serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN);
}
//向串口发送指令
log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------");
if (serialPort != null) {
//向串口发送指令
log.info("-----------------------------单抄向串口" + serialPort.getName() + "发送指令!-----------------------------");
String sendStr = SendOrderUtils.getSendStr(deviceCodeParamEntity);
SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort, sendStr, deviceCodeParamEntity.getDeviceType());
CacheTools.initReceiveMsg(serialPort.getName());
@ -92,7 +92,7 @@ public class SerialPortSingle2 {
return "fail";
}
receiveStr = receiveStr.replace("null", "").replace(" ", "");
log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length());
log.info("串口" + serialPort.getName() + "接收数据:" + receiveStr + ",大小: " + receiveStr.length());
//返回值全部变成大写
String receiveData = receiveStr.toUpperCase();
//截取去掉FE
@ -127,6 +127,7 @@ public class SerialPortSingle2 {
rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) {
rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName);
log.info("时控读取或者设置返回值==>{}", rtData);
} else if (deviceType.equals("水位开关") && !StringUtils.isBlank(registerAddr) && registerAddr.equals("0010")) { //热泵状态
rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("温度变送器")) {
@ -140,22 +141,22 @@ public class SerialPortSingle2 {
return "fail";
}
} else {
log.info("串口为空,无法进行采集控制");
return "fail";
}
SerialTool.closePort(serialPort);
System.out.println("关闭" + serialPort);
Thread.sleep(200);
log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------");
log.info("-----------------------------" + serialPort.getName() + "单抄结束!-----------------------------");
return rtData;
} catch (Exception e) {
log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e);
log.info("单抄串口" + serialPort.getName() + "异常,没有数据返回!关闭串口", e);
} finally {
try {
if (null != serialPort) {
SerialTool.closePort(serialPort);
}
} catch (IOException e) {
throw new RuntimeException(e);
log.error("关闭串口异常!", e);
}
}
return "fail";

2
user-service/src/main/java/com/mh/user/service/DeviceInstallService.java

@ -181,4 +181,6 @@ public interface DeviceInstallService {
DeviceInstallEntity selectDeviceById(Long id);
void deleteParamCode(DeviceInstallEntity oldEntity);
void updateLastValueByOther(String addr, String strWtLevel, String deviceType, String buildingId);
}

2
user-service/src/main/java/com/mh/user/service/NowDataService.java

@ -100,7 +100,7 @@ public interface NowDataService {
void proWaterTemp(String curDate,String buildingID,String pumpID);
//生成楼栋水位
void proWaterLevel(String curDate,String buildingID);
void proWaterLevel(String curDate,String buildingID, String deviceAddr);
//在没有接收到返回值前设置监控界面热泵是否离线
void updateRunState(String buildingId,String pumpId,String strState, String buildingName);

56
user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java

@ -87,6 +87,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
switch (deviceType) {
case "时控":
rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
log.info("设备类型为时控==>{}", rtData);
break;
case "水位开关":
rtData = handleWaterLevelSwitch(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
@ -110,6 +111,20 @@ public class DeviceControlServiceImpl implements DeviceControlService {
}
if (Constant.WRITE.equals(type)) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
log.info("写入设备返回值==>{}", rtData);
// 如果是瑞星泵,需要在发送启动指令
if (!StringUtils.isBlank(brand) && brand.equals("瑞星")
&& (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2"))
&& !rtData.equals(Constant.FAIL)) {
deviceCodeParam.setFunCode("06");
// 开启热泵定时
if ("0028".equals(deviceCodeParam.getRegisterAddr())) {
deviceCodeParam.setRegisterAddr("00230001");
} if ("002A".equals(deviceCodeParam.getRegisterAddr())) {
deviceCodeParam.setRegisterAddr("00240001");
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);
}
}
}
return rtData;
@ -202,16 +217,27 @@ public class DeviceControlServiceImpl implements DeviceControlService {
String time = serialPortModel.getDataValue();
if (Constant.READ.equals(type)) {
deviceCodeParam.setFunCode("03"); //功能码读数据
if (deviceCodeParam.getParam().equals("L1")) {
deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D)
} else if (deviceCodeParam.getParam().equals("L2")) {
deviceCodeParam.setRegisterAddr("000D");
} else {
deviceCodeParam.setRegisterAddr("0011");
switch (deviceCodeParam.getParam()) {
case "L1":
deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D)
break;
case "L2":
deviceCodeParam.setRegisterAddr("000D");
break;
case "L3":
deviceCodeParam.setRegisterAddr("0011");
break;
case "checkTime":
// 时控校准时间读取
deviceCodeParam.setRegisterAddr("0000");
break;
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
time = rtData;
} else {
if ("checkTime".equals(deviceCodeParam.getParam())) {
deviceCodeParam.setRegisterAddr("0000");
}
deviceCodeParam.setFunCode("10"); //功能码写数据
}
if (time.length() == 16) {
@ -285,17 +311,21 @@ public class DeviceControlServiceImpl implements DeviceControlService {
nowDataService.upTempSet2(deviceCodeParam.getBuildingId(), serialPortModel.getDataValue(), deviceCodeParam.getDeviceAddr());//更新实时状态表
log.info("楼栋编号:" + deviceCodeParam.getBuildingId() + ",设定温度:" + serialPortModel.getDataValue() + ",热泵编号:" + deviceCodeParam.getDeviceAddr());
} else if (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) {
if (deviceCodeParam.getBrand().equals("美的")) {
if (deviceCodeParam.getBrand().equals("美的") || deviceCodeParam.getBrand().equals("瑞星")) {
//发送指令
if (Constant.READ.equals(type)) {
deviceCodeParam.setFunCode("03"); //功能码读数据
} else {
deviceCodeParam.setFunCode("10"); //功能码写数据
}
if ("时段1".equals(deviceCodeParam.getParam())) {
if ("时段1".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0656"); //寄存器地址
} else {
} else if ("时段2".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("065A"); //寄存器地址
} else if ("时段1".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0028"); //寄存器地址
} else if ("时段2".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("002C"); //寄存器地址
}
if (Constant.READ.equals(type)) {
@ -345,6 +375,14 @@ public class DeviceControlServiceImpl implements DeviceControlService {
}
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
return rtData;
} else if ("closeTime".equals(deviceCodeParam.getParam())) {
// 关闭热泵
deviceCodeParam.setFunCode("06"); //功能码读数据
if ("瑞星".equals(deviceCodeParam.getBrand()) && "1".equals(deviceCodeParam.getDataValue())) {
deviceCodeParam.setRegisterAddr("00230000");
} else {
deviceCodeParam.setRegisterAddr("00240000"); //寄存器地址
}
}
return rtData;
}

19
user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java

@ -4,19 +4,13 @@ import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.DeviceInstallTempEntity;
import com.mh.user.entity.UploadDeviceInstallEntity;
import com.mh.user.exception.CommonNum;
import com.mh.user.exception.ServiceRuntimeException;
import com.mh.user.mapper.DeviceCodeParamMapper;
import com.mh.user.mapper.DeviceInstallMapper;
import com.mh.user.mapper.provider.DeviceInstallProvider;
import com.mh.user.model.DeviceModel;
import com.mh.user.serialport.SerialPortSendReceive;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.utils.CacheUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -165,6 +159,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
default:
break;
}
// 删除之前的缓存
CacheUtil.getInstance().deleteCache();
}
@Override
@ -256,6 +252,10 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
@Override
public int deleteDevice(String id) {
// 根据id查询对应的deviceInstall
DeviceInstallEntity oldEntity = deviceInstallMapper.selectDeviceById(Long.valueOf(id));
// 删除全部的device_code_param值
this.deleteParamCode(oldEntity);
return deviceInstallMapper.deleteDevice(id);
}
@ -412,5 +412,10 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
deviceCodeParamMapper.deleteParamCode2(oldEntity);
deviceCodeParamMapper.deleteParamCode3(oldEntity);
}
@Override
public void updateLastValueByOther(String addr, String strWtLevel, String deviceType, String buildingId) {
deviceInstallMapper.updateLastValueByOther(addr, strWtLevel, deviceType, buildingId);
}
}

4
user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java

@ -453,8 +453,8 @@ public class NowDataServiceImpl implements NowDataService {
}
@Override
public void proWaterLevel(String curDate, String buildingID) {
nowDataMapper.proWaterLevel(curDate, buildingID);
public void proWaterLevel(String curDate, String buildingID, String deviceAddr) {
nowDataMapper.proWaterLevel(curDate, buildingID, deviceAddr);
}
@Override

21
user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java

@ -581,8 +581,8 @@ public class AnalysisReceiveOrder485 {
} else if (registerAddr.equalsIgnoreCase("0656")
|| registerAddr.equalsIgnoreCase("065A")
|| registerAddr.equalsIgnoreCase("065E")) { //定时设置值
String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14);
String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22);
String startTime = ExchangeStringUtil.hexToDec(checkStr.substring(8, 10)) + ExchangeStringUtil.hexToDec(checkStr.substring(12, 14));
String closetTime = ExchangeStringUtil.hexToDec(checkStr.substring(16, 18)) + ExchangeStringUtil.hexToDec(checkStr.substring(20, 22));
sValue = startTime + closetTime;
}
rtData = sValue;
@ -642,8 +642,11 @@ public class AnalysisReceiveOrder485 {
} else if (registerAddr.equalsIgnoreCase("0028")
|| registerAddr.equalsIgnoreCase("002C")
|| registerAddr.equalsIgnoreCase("0030")) { //读定时设置值
String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14);
String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22);
// 01 03 08 0003 0000 0016 0000 4713
String startTime = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(10, 14)), 2);
String closetTime = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(14, 18)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(18, 22)), 2);
sValue = startTime + closetTime;
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
@ -851,9 +854,12 @@ public class AnalysisReceiveOrder485 {
}
DecimalFormat df = new DecimalFormat("0.0");
String strWtLevel = df.format(wtLevel);
// 更新device_install数据
deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId);
nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId);
log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName);
nowDataService.proWaterLevel(dateStr, buildingId); //楼栋水位
nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位
log.info("------保存每栋楼小时水位情况" + dateStr + "------");
}
// });
@ -896,9 +902,12 @@ public class AnalysisReceiveOrder485 {
DecimalFormat df = new DecimalFormat("0.0");
String strWtLevel = df.format(wtLevel);
result = strWtLevel;
// 更新device_install数据
deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId);
nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId);
log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName);
nowDataService.proWaterLevel(dateStr, buildingId); //楼栋水位
nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位
log.info("------保存每栋楼小时水位情况------" + dateStr);
}
} else {

7
user-service/src/main/java/com/mh/user/utils/CacheUtil.java

@ -75,5 +75,12 @@ public class CacheUtil {
return JSONArray.parseArray(JSONObject.toJSONString(cacheObject), DeviceCodeParamEntity.class);
}
/**
* 删除缓存
*/
public void deleteCache() {
caffeineCache.invalidateAll();
}
}

34
user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java

@ -180,18 +180,23 @@ public class GetReadOrder485 {
str = str + "03002C0004";
param = "时段2";
}
} else if ("06".equals(funCode)) {
str = str + funCode + registerAddr;// 定时开机开关机
if ("0023".equals(registerAddr)) {
param = "时段1";
} else {
param = "时段2";
}
} else {//10
if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("000A")) {//温度设定,写
str = str + "10000A000102" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试
} else if (registerAddr.equalsIgnoreCase("0028")) {//时段1
} else if (registerAddr.equalsIgnoreCase("0028") || registerAddr.equalsIgnoreCase("002C")) {//时段1
if (dataValue.length() == 8) {
String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8);
str = str + "100028000408" + strData; //写
}
} else if (registerAddr.equalsIgnoreCase("002C")) {//时段2
if (dataValue.length() == 8) {
String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8);
str = str + "10002C000408" + strData; //写
String strData = "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(0, 2))),2)
+ "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(2, 4))),2)
+ "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(4, 6))),2)
+ "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(6, 8))),2);
str = str + "10"+registerAddr+"000408" + strData; //写
}
}
}
@ -517,10 +522,19 @@ public class GetReadOrder485 {
funCode = ExchangeStringUtil.addZeroForNum(funCode, 2); // 功能码
if (funCode.equals("03")) { //功能码,读
str = str + "03" + registerAddr + "0004";
if (orderParamModel.getParam().equals("checkTime")) {
// 读取时间:0A 03 00 00 00 03 04 B0
str = str + "03" + registerAddr + "0003";
} else {
str = str + "03" + registerAddr + "0004";
}
} else if (funCode.equals("10")) {//写
if (!dataValue.equals("")) {
if (!dataValue.equals("") && !orderParamModel.getParam().equals("checkTime")) {
str = str + "10" + registerAddr + "000408" + dataValue;
} else {
// 校验时间:0A 10 00 00 00 03 06 00 24 01 10 08 59 48 CF
// 0A 10 00 00 00 03 06 00 24 01 10 09 40 8B 95
str = str + "10" + registerAddr + "00030600" + dataValue.substring(2);
}
}
}

204
user-service/src/main/java/com/mh/user/utils/TimedTask2.java

@ -1,75 +1,39 @@
package com.mh.user.utils;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.PumpSetEntity;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSingle;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.PumpSetService;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.text.SimpleDateFormat;
import java.util.*;
public class TimedTask2 {
ApplicationContext context = SpringBeanUtil.getApplicationContext();
PumpSetService pumpSetService=context.getBean(PumpSetService.class);
DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class);
public void cronJobClose(int shi, int fen, int miao) { //定时关机
Calendar cal = Calendar.getInstance();
// 每天定点执行
cal.set(Calendar.HOUR_OF_DAY, shi);
cal.set(Calendar.MINUTE, fen);
cal.set(Calendar.SECOND, miao);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
// 把run方法里的内容换成你要执行的内容
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前的系统时间为:" + sdf.format(new Date()));
SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类
DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类
List<DeviceInstallEntity> deviceList=deviceInstallService.selectDevicePump();
if (deviceList.size()>0){
for (DeviceInstallEntity deviceInstall :deviceList){
deviceCodeParam.setDeviceAddr(deviceInstall.getDeviceAddr()); //传入通讯编号
deviceCodeParam.setDeviceType(deviceInstall.getDeviceType());
deviceCodeParam.setDataCom(deviceInstall.getDataCom());
deviceCodeParam.setBaudrate(deviceInstall.getBaudRate());
deviceCodeParam.setParity(deviceInstall.getParity());
deviceCodeParam.setDataValue("0000");//传入相关参数值,关机
deviceCodeParam.setBuildingId(deviceInstall.getBuildingId());
deviceCodeParam.setBrand(deviceInstall.getBrand());
deviceCodeParam.setRegisterAddr("0000"); //寄存器地址
deviceCodeParam.setFunCode("06");
serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
}
}
}
}, cal.getTime(), 24 * 60 * 60 * 1000);
}
public void cronJobStart(int shi, int fen, int miao) { //定时开机
Calendar cal = Calendar.getInstance();
// 每天定点执行
cal.set(Calendar.HOUR_OF_DAY, shi);
cal.set(Calendar.MINUTE, fen);
cal.set(Calendar.SECOND, miao);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
// 把run方法里的内容换成你要执行的内容
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前的系统时间为:" + sdf.format(new Date()));
//package com.mh.user.utils;
//
//import com.mh.user.entity.DeviceCodeParamEntity;
//import com.mh.user.entity.DeviceInstallEntity;
//import com.mh.user.entity.PumpSetEntity;
//import com.mh.user.model.SerialPortModel;
//import com.mh.user.serialport.SerialPortSingle;
//import com.mh.user.service.DeviceInstallService;
//import com.mh.user.service.PumpSetService;
//import io.swagger.models.auth.In;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationContext;
//
//import java.text.SimpleDateFormat;
//import java.util.*;
//
//public class TimedTask2 {
//
// ApplicationContext context = SpringBeanUtil.getApplicationContext();
// PumpSetService pumpSetService=context.getBean(PumpSetService.class);
// DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class);
//
// public void cronJobClose(int shi, int fen, int miao) { //定时关机
// Calendar cal = Calendar.getInstance();
// // 每天定点执行
// cal.set(Calendar.HOUR_OF_DAY, shi);
// cal.set(Calendar.MINUTE, fen);
// cal.set(Calendar.SECOND, miao);
//
// Timer timer = new Timer();
// timer.schedule(new TimerTask() {
//
// public void run() {
// // 把run方法里的内容换成你要执行的内容
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// System.out.println("当前的系统时间为:" + sdf.format(new Date()));
// SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类
// DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类
// List<DeviceInstallEntity> deviceList=deviceInstallService.selectDevicePump();
@ -80,7 +44,7 @@ public class TimedTask2 {
// deviceCodeParam.setDataCom(deviceInstall.getDataCom());
// deviceCodeParam.setBaudrate(deviceInstall.getBaudRate());
// deviceCodeParam.setParity(deviceInstall.getParity());
// deviceCodeParam.setDataValue("0003");//传入相关参数值,制热
// deviceCodeParam.setDataValue("0000");//传入相关参数值,关机
// deviceCodeParam.setBuildingId(deviceInstall.getBuildingId());
// deviceCodeParam.setBrand(deviceInstall.getBrand());
// deviceCodeParam.setRegisterAddr("0000"); //寄存器地址
@ -88,33 +52,69 @@ public class TimedTask2 {
// serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
// }
// }
}
}, cal.getTime(), 24 * 60 * 60 * 1000);
}
public void cronJob(){
PumpSetEntity pumpSet=pumpSetService.queryHandTime();
if (pumpSet!=null){
String HH="";
String mm="";
String startTime=pumpSet.getStartTime1();
HH=startTime.substring(0,2);
mm=startTime.substring(3,5);
// cronJobStart(Integer.valueOf(HH), Integer.valueOf(mm), 00);
cronJobStart(16, 13, 00);
System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------");
// String closeTime=pumpSet.getCloseTime1();
// HH=closeTime.substring(0,2);
// mm=closeTime.substring(3,5);
// cronJobClose(Integer.valueOf(HH), Integer.valueOf(mm), 00);
System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------");
}
}
// }
// }, cal.getTime(), 24 * 60 * 60 * 1000);
// }
//
// public void cronJobStart(int shi, int fen, int miao) { //定时开机
// Calendar cal = Calendar.getInstance();
// // 每天定点执行
// cal.set(Calendar.HOUR_OF_DAY, shi);
// cal.set(Calendar.MINUTE, fen);
// cal.set(Calendar.SECOND, miao);
//
// Timer timer = new Timer();
// timer.schedule(new TimerTask() {
//
// public void run() {
// // 把run方法里的内容换成你要执行的内容
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// System.out.println("当前的系统时间为:" + sdf.format(new Date()));
//// SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类
//// DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类
//// List<DeviceInstallEntity> deviceList=deviceInstallService.selectDevicePump();
//// if (deviceList.size()>0){
//// for (DeviceInstallEntity deviceInstall :deviceList){
//// deviceCodeParam.setDeviceAddr(deviceInstall.getDeviceAddr()); //传入通讯编号
//// deviceCodeParam.setDeviceType(deviceInstall.getDeviceType());
//// deviceCodeParam.setDataCom(deviceInstall.getDataCom());
//// deviceCodeParam.setBaudrate(deviceInstall.getBaudRate());
//// deviceCodeParam.setParity(deviceInstall.getParity());
//// deviceCodeParam.setDataValue("0003");//传入相关参数值,制热
//// deviceCodeParam.setBuildingId(deviceInstall.getBuildingId());
//// deviceCodeParam.setBrand(deviceInstall.getBrand());
//// deviceCodeParam.setRegisterAddr("0000"); //寄存器地址
//// deviceCodeParam.setFunCode("06");
//// serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
//// }
//// }
//
// }
// }, cal.getTime(), 24 * 60 * 60 * 1000);
// }
//
// public void cronJob(){
// PumpSetEntity pumpSet=pumpSetService.queryHandTime();
// if (pumpSet!=null){
// String HH="";
// String mm="";
// String startTime=pumpSet.getStartTime1();
// HH=startTime.substring(0,2);
// mm=startTime.substring(3,5);
//// cronJobStart(Integer.valueOf(HH), Integer.valueOf(mm), 00);
// cronJobStart(16, 13, 00);
// System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------");
//// String closeTime=pumpSet.getCloseTime1();
//// HH=closeTime.substring(0,2);
//// mm=closeTime.substring(3,5);
//// cronJobClose(Integer.valueOf(HH), Integer.valueOf(mm), 00);
// System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------");
// }
// }
////
//// public static void main(String[] args) {
//// cronJob(11, 46, 0); //24小时制 时分秒
//// }
//
//
// public static void main(String[] args) {
// cronJob(11, 46, 0); //24小时制 时分秒
// }
}
//}

6
user-service/src/main/resources/application-dev.yml

@ -1,5 +1,5 @@
server:
port: 8761 #8761创新、8762广商、8763华厦、广州理工
port: 8762 #8761创新、8762广商、8763华厦、广州理工
spring:
application:
name: user-service
@ -12,6 +12,10 @@ spring:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: sa
password: mh@803
# url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: chws
# password: mh@803
filters: stat,wall,config
max-active: 100

18
user-service/src/main/resources/application-prod.yml

@ -1,5 +1,5 @@
server:
port: 8763 #8761创新、8762广商、8763华厦、广州理工
port: 8762 #8761创新、8762广商、8763华厦、广州理工
spring:
application:
name: user-service
@ -14,10 +14,10 @@ spring:
# password: mh@803
## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true
#阿里云服务器-广州理工
url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: test
password: minghan123456@
# url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: test
# password: minghan123456@
#华厦云服务器
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
@ -29,10 +29,10 @@ spring:
# username: chws
# password: mh@803
#广商服务器
# url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# username: chws
# password: mh@803
url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: chws
password: mh@803
#本机
# url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

15
user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java

@ -57,7 +57,7 @@ class UserServiceApplicationTests {
//0203020008FD82
// analysis.analysisPumpOrder485("0203020008FD82","0641");
// getReadOrder485.createOrderParam();
// analysis.analysisRelayOrder485("220611000000013A220611000000023B220611000000033C220611000000043D220611000000053E220611000000063F22061100000007402206110000000841","0017","中凯");
analysis.analysisTimeSetOrder4852("0B10000900041162",null, null, null, null);
}
@Test
public void testHotWater() throws InterruptedException {
@ -92,4 +92,17 @@ class UserServiceApplicationTests {
}
}
@Test
public void testGetPump() {
String dataValue = "03002200";
System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(0, 2))));
System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(2, 4))));
System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(4, 6))));
System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(6, 8))));
String strData = "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(0, 2))),2)
+ "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(2, 4))),2)
+ "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(4, 6))),2)
+ "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(6, 8))),2);
System.out.println(strData);
}
}

7
热水新增脚本.sql

@ -3,3 +3,10 @@ create index pump_set_pump_id_building_id on pump_set(pump_id, building_id);
create index now_data_building_id on pump_set(building_id);
create index now_data_pump_id on pump_set(pump_id);
-- 2024-01-08 新增字段,waterLevel表
alter table waterLevel add device_addr varchar(32) not null default '';
exec sp_addextendedproperty N'MS_Description', N'设备地址', N'schema', N'dbo',N'table', N'waterLevel', N'column', N'device_addr';
alter table waterLevel add device_name varchar(50) not null default '';
exec sp_addextendedproperty N'MS_Description', N'设备名称', N'schema', N'dbo',N'table', N'waterLevel', N'column', N'device_name';

Loading…
Cancel
Save