Compare commits

..

No commits in common. '2cedf6c143d5f1b5c2b5bf0c5c2867dc225345bc' and 'ab9cd2915f21a222906c6dc37dc9927f034ca5b2' have entirely different histories.

  1. 10
      user-service/src/main/java/com/mh/user/controller/TestController.java
  2. 193
      user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java
  3. 1
      user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java
  4. 40
      user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java
  5. 32
      user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java
  6. 6
      user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java
  7. 8
      user-service/src/main/java/com/mh/user/model/MultiControlModel.java
  8. 2
      user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java
  9. 6
      user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java
  10. 4
      user-service/src/main/java/com/mh/user/serialport/SendAndReceiveByCom.java
  11. 18
      user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java
  12. 2
      user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java
  13. 11
      user-service/src/main/java/com/mh/user/service/DeviceInstallService.java
  14. 10
      user-service/src/main/java/com/mh/user/service/NowDataService.java
  15. 1
      user-service/src/main/java/com/mh/user/service/PumpSetService.java
  16. 4
      user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java
  17. 8
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  18. 16
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  19. 56
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  20. 5
      user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java
  21. 2
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java
  22. 57
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java
  23. 2
      user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java
  24. 2
      user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java
  25. 17
      user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java
  26. 9
      user-service/src/main/java/com/mh/user/tcp/TcpSingle.java
  27. 48
      user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java
  28. 312
      user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java
  29. 29
      user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java
  30. 2
      user-service/src/main/resources/application.yml
  31. 9
      user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java
  32. 1
      user-service/src/test/java/com/mh/user/chart/ChartTest.java

10
user-service/src/main/java/com/mh/user/controller/TestController.java

@ -2,16 +2,24 @@ package com.mh.user.controller;
import com.mh.common.utils.DateTimeUtils;
import com.mh.user.constants.Constant;
import com.mh.user.dynamic.datasource.DataSourceContextHolder;
import com.mh.user.dynamic.datasource.DataSourceObject;
import com.mh.user.entity.DBEntity;
import com.mh.user.manage.QuartzManager;
import com.mh.user.mapper.NowDataMapper;
import com.mh.user.serialport.SerialTool;
import com.mh.user.service.NowDataService;
import com.mh.user.service.SysUserService;
import com.mh.user.utils.*;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import purejavacomm.CommPort;
import purejavacomm.CommPortIdentifier;
import purejavacomm.PortInUseException;
import javax.annotation.Resource;
@ -76,7 +84,7 @@ public class TestController {
// analysis.analysisPressureOrder485("150304400F1ABE00E1","","","22");
// analysis.analysisStateOrder485("6874100000000068810358F3395C16","","","41");
// analysis.analysisTempOrder485("020304013000010900","","","23");
// nowDataService.saveNowHistoryData("3","热泵","运行","runState","62", deviceInstallEntity.getDataCom());
nowDataService.saveNowHistoryData("3","热泵","运行","runState","62");
// nowDataService.updateRunState("70","2","离线");

193
user-service/src/main/java/com/mh/user/job/StartOrStopHotpumpJob.java

@ -1,193 +0,0 @@
package com.mh.user.job;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.http.HttpResult;
import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.model.SerialPortModel;
import com.mh.user.service.CollectionParamsManageService;
import com.mh.user.service.DeviceControlService;
import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 定时开关机热泵
* @date 2026-06-04 13:45:02
*/
@Slf4j
@Component
public class StartOrStopHotpumpJob {
private final CollectionParamsManageService collectionParamsManageService;
private final DeviceControlService deviceControlService;
public StartOrStopHotpumpJob(CollectionParamsManageService collectionParamsManageService, DeviceControlService deviceControlService) {
this.collectionParamsManageService = collectionParamsManageService;
this.deviceControlService = deviceControlService;
}
@Scheduled(cron = "0 0/1 * * * ?")
public void startOrStopHotpump() {
log.info("定时开关机热泵开始");
// 查询定时时间
List<CollectionParamsManageEntity> paramsManageEntities = collectionParamsManageService.selectAllCPMList();
// 过滤获取paramTypeGroupId为3的数据
List<CollectionParamsManageEntity> filterList = paramsManageEntities.stream().filter(entity -> entity.getParamTypeGroupId() == 3).collect(Collectors.toList());
// 再根据device_install_id进行分组
Map<Long, List<CollectionParamsManageEntity>> listMap = filterList.stream().collect(Collectors.groupingBy(CollectionParamsManageEntity::getDeviceInstallId));
for (Map.Entry<Long, List<CollectionParamsManageEntity>> entry : listMap.entrySet()) {
List<CollectionParamsManageEntity> value = entry.getValue();
// 查看是否启动定时,register_addr = START_TIME1的cur_value值是否等于1,
CollectionParamsManageEntity startTime1 = value.stream().filter(entity -> entity.getRegisterAddr().equals("START_TIME1")).findFirst().orElse(null);
if (startTime1 != null && startTime1.getCurValue().intValue() == 1) {
// 同时查看对应的设备是否是开机状态,同时判断curTime是否是今天,如果是开机状态则不执行定时开关机
CollectionParamsManageEntity entity1 = paramsManageEntities.stream().filter(entity -> entity.getDeviceInstallId().equals(entry.getKey()))
.filter(entity -> entity.getRegisterAddr().equals("B000"))
.filter(entity -> entity.getCurTime() != null)
.filter(entity -> entity.getCurValue().intValue() == 1).findFirst().orElse(null);
// 判断设备状态更新时间是否是今天
boolean isTodayUpdate = false;
if (entity1 != null && entity1.getCurTime() != null) {
Date curTime = entity1.getCurTime();
LocalDate updateDate = curTime.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate();
java.time.LocalDate today = java.time.LocalDate.now();
isTodayUpdate = updateDate.equals(today);
log.info("设备{}的状态更新时间: {}, 是否是今天: {}", entry.getKey(), curTime, isTodayUpdate);
}
// 如果设备已开机且状态是今天更新的,则不执行定时开关机
if (entity1 != null && entity1.getCurValue().intValue() == 1 && isTodayUpdate) {
log.info("设备{}已开机且状态为今天更新,不执行定时开关机", entry.getKey());
} else {
// value过滤,开始查看当前时间是否是定时时间,register_name分别是
//OPEN_HOUR_TIME1:开始小时
//OPEN_MIN_TIME1:开始分钟
//CLOSE_HOUR_TIME1:结束小时
//CLOSE_MIN_TIME1:结束分钟
// 这几个查询出来在拼接成时间范围,然后判断当前时间是否在范围内,如果在范围内则执行定时开关机
// 获取定时开关机参数
CollectionParamsManageEntity openHour = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("OPEN_HOUR_TIME1"))
.findFirst().orElse(null);
CollectionParamsManageEntity openMin = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("OPEN_MIN_TIME1"))
.findFirst().orElse(null);
CollectionParamsManageEntity closeHour = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("CLOSE_HOUR_TIME1"))
.findFirst().orElse(null);
CollectionParamsManageEntity closeMin = value.stream()
.filter(entity -> entity.getRegisterAddr().equals("CLOSE_MIN_TIME1"))
.findFirst().orElse(null);
// 检查所有定时参数是否都存在
if (openHour != null && openMin != null && closeHour != null && closeMin != null) {
// 获取当前时间
java.time.LocalDateTime now = java.time.LocalDateTime.now();
int currentHour = now.getHour();
int currentMinute = now.getMinute();
int currentTime = currentHour * 100 + currentMinute; // 格式化为 HHmm
// 计算开始时间和结束时间
int startTime = openHour.getCurValue().intValue() * 100 + openMin.getCurValue().intValue();
int endTime = closeHour.getCurValue().intValue() * 100 + closeMin.getCurValue().intValue();
log.info("设备{}的定时时间 - 当前: {}, 开始: {}, 结束: {}", entry.getKey(), currentTime, startTime, endTime);
// 判断当前时间是否在定时范围内
boolean isInTimeRange = false;
if (startTime <= endTime) {
// 正常情况:开始时间 <= 结束时间
isInTimeRange = currentTime >= startTime && currentTime <= endTime;
} else {
// 跨天情况:开始时间 > 结束时间(如 22:00 ~ 06:00)
isInTimeRange = currentTime >= startTime || currentTime <= endTime;
}
if (isInTimeRange) {
// 在时间范围内,执行开机操作
log.info("设备{}在定时范围内,执行开机操作", entry.getKey());
executeHotPumpControl(entry.getKey(), paramsManageEntities, "1");
} else {
// 不在时间范围内,执行关机操作
log.info("设备{}不在定时范围内,执行关机操作", entry.getKey());
executeHotPumpControl(entry.getKey(), paramsManageEntities, "0");
}
} else {
log.warn("设备{}的定时参数不完整", entry.getKey());
}
}
}
}
log.info("定时开关机热泵结束");
}
/**
* 执行热泵开关机控制
* @param deviceInstallId 设备安装ID
* @param params 参数列表
* @param command 命令1-开机0-关机
*/
private void executeHotPumpControl(Long deviceInstallId, List<CollectionParamsManageEntity> params, String command) {
try {
// 获取设备信息
CollectionParamsManageEntity deviceInfo = params.stream()
.filter(entity -> entity.getDeviceInstallId().equals(deviceInstallId))
.filter(entity -> entity.getRegisterAddr().equals("B000"))
.findFirst().orElse(null);
if (deviceInfo == null) {
log.error("未找到设备{}的开关机寄存器信息", deviceInstallId);
return;
}
// 检查当前状态,如果已经是目标状态则不执行
if (deviceInfo.getCurValue() != null && deviceInfo.getCurValue().intValue() == Integer.parseInt(command)) {
log.info("设备{}已是目标状态{},无需操作", deviceInstallId, command);
return;
}
// 构建串口通信参数
SerialPortModel serialPortModel = new SerialPortModel();
serialPortModel.setCpmId(String.valueOf(deviceInfo.getId()));
serialPortModel.setDataValue(command);
serialPortModel.setParam("");
// 调用设备控制服务执行开关机
List<SerialPortModel> paramList = new ArrayList<>();
paramList.add(serialPortModel);
try {
Constant.WEB_FLAG = true; //单抄,暂时停止采集
Thread.sleep(1000);
String rtData = deviceControlService.readOrWriteDevice(paramList, Constant.WRITE);
if (ExchangeStringUtil.getJSONType(rtData)) {
// Map map = JSONObject.parseObject(rtData);
log.info("设备{}{}成功", deviceInstallId, "1".equals(command) ? "开机" : "关机");
} else {
log.error("设备{}{}失败,结果: {}", deviceInstallId, "1".equals(command) ? "开机" : "关机", rtData);
}
} catch (Exception e) {
Constant.WEB_FLAG = false; //单抄,恢复采集
} finally {
Constant.WEB_FLAG = false; //单抄,恢复采集
}
} catch (Exception e) {
log.error("执行设备{}开关机控制异常", deviceInstallId, e);
}
}
}

1
user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java

@ -323,7 +323,6 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
@Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "param_type_group_id", property = "paramTypeGroupId"),
@Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality"),
@Result(column = "building_id", property = "buildingId")

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

@ -156,30 +156,16 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("isOnline") String isOnline);
// 修改设备在线情况,离线。
@Update("<script>" +
"update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} "+
"<if test='dataCom != null and dataCom != \"\"'>" +
" and data_com=#{dataCom}" +
"</if>" +
"</script>")
@Update("update device_install set is_online=#{isOnline} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}")
void updateNotOnline(@Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType,
@Param("buildingId") String buildingId,
@Param("isOnline") String isOnline,
@Param("dataCom") String dataCom);
@Param("isOnline") String isOnline);
//根据通讯地址和设备类型查询对应的设备信息
@ResultMap("rs")
@Select("<script>" +
"select top 1 * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} "+
"<if test='dataCom != null and dataCom != \"\"'>" +
" and data_com=#{dataCom}" +
"</if>" +
"</script>")
DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType,
@Param("buildingId") String buildingId,
@Param("dataCom") String dataCom);
@Select("select top 1 * from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId}")
DeviceInstallEntity selectDevice(@Param("deviceAddr") String deviceAddr,@Param("deviceType") String deviceType,@Param("buildingId") String buildingId);
//查询通讯编号是否存在
@Select("select count(*) from device_install where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_name = #{buildingName} ")
@ -329,16 +315,8 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("id") Long id);
//查询最后一次采集时间
@Select("<script>"+
"select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId} "+
"<if test='dataCom != null and dataCom != \"\"'>" +
" and data_com=#{dataCom}" +
"</if>" +
"</script>")
String selectLastDate(@Param("deviceType") String deviceType,
@Param("deviceAddr") String deviceAddr,
@Param("buildingId") String buildingId,
@Param("dataCom") String dataCom);
@Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}")
String selectLastDate(@Param("deviceType") String deviceType,@Param("deviceAddr") String deviceAddr,@Param("buildingId") String buildingId);
//判断某栋楼是否有热泵设备
@Select("select count(*) from device_install where device_type='热泵' and building_id=#{buildingId} ")
@ -389,10 +367,4 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
" and brand = #{brand} " +
" and device_addr = #{deviceAddr} ")
Integer selectDeviceByParam(String buildingId, String dataCom, String deviceType, String brand, String deviceAddr);
@Update("update device_install set is_fault=#{isFault} where device_addr=#{deviceAddr} and device_type=#{deviceType} and device_name=#{deviceName}")
void updateDeviceFaultAndDeviceName(@Param("isFault") String number,
@Param("deviceAddr") String addr,
@Param("deviceType") String deviceType,
@Param("deviceName") String deviceName);
}

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

@ -32,7 +32,6 @@ public interface NowDataMapper {
" <if test='tankId!=null and tankId != \"\"'> , tank_id = #{tankId} </if>" +
" <if test='tankName!=null and tankName != \"\"'> , tank_name = #{tankName} </if>" +
" where building_id = #{buildingId} and pump_id = #{pumpId} " +
" <if test='pumpName!=null and pumpName != \"\"'> and pump_name = #{pumpName} </if>" +
"</script>")
void updateNowData(NowDataEntity nowDataEntity);
@ -191,19 +190,13 @@ public interface NowDataMapper {
int buildWaterLevelCount(@Param("curDate") String curDate);
//判断实时表有没有记录(热泵)
@Select("<script>"+
"select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId} "+
"<if test='pumpName != null and pumpName != \"\"'>" +
" and pump_name=#{pumpName}" +
"</if>" +
"</script>")
int selectNowDataCount(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId,
@Param("pumpName") String pumpName);
@Select("select count(*) from now_data where building_id=#{buildingId} and pump_id=#{pumpId}")
int selectNowDataCount(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
//查询实时表记录(热泵)
@ResultMap(value = "rs")
@Select("select top 1 * from now_data where building_id=#{buildingId} and pump_id=#{pumpId} and pump_name = #{pumpName}")
NowDataEntity selectNowData(@Param("buildingId") String buildingId, @Param("pumpId") String pumpId, @Param("pumpName") String deviceName);
@Select("select * from now_data where building_id=#{buildingId} and pump_id=#{pumpId}")
NowDataEntity selectNowData(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
//判断实时表有没有记录(非热泵)
@Select("select count(*) from now_data where building_id=#{buildingId} ")
@ -264,12 +257,9 @@ public interface NowDataMapper {
int selectStateCount(@Param("buildingId") String buildingId);
//求热泵状态运行
@Select("select run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId} ")
@Select("select run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId}")
String selectState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
@Select("select top 1 run_state from now_data where building_id=#{buildingId} and pump_id=#{pumpId} and pump_name = #{pumpName} ")
String selectStateByPumpName(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId, @Param("pumpName") String pumpName);
//更新设置水位值
@Update("update now_data set level_set=#{levelSet},cur_date=getDate() where building_id=#{buildingId}")
void upLevelSet(@Param("buildingId") String buildingId,@Param("levelSet") String levelSet);
@ -365,16 +355,8 @@ public interface NowDataMapper {
@Param("dataStr") String dataStr);
//在没有接收到返回值前设置监控界面热泵是否离线
@Update("<script>" +
"update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId} " +
"<if test='pumpName!=null and pumpName!=\"\"'>" +
" and pump_name=#{pumpName} " +
"</if>" +
"</script>")
void updateRunState(@Param("buildingId") String buildingId,
@Param("pumpId") String pumpId,
@Param("strState") String strState,
@Param("pumpName") String pumpName);
@Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}")
void updateRunState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId,@Param("strState") String strState);
//计算热泵运行时间,按分钟
@Select("exec pro_pumpMinutes #{buildingId,jdbcType=VARCHAR,mode=IN}, #{pumpId,jdbcType=VARCHAR,mode=IN},#{runState,jdbcType=VARCHAR,mode=IN}")

6
user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java

@ -56,10 +56,4 @@ public interface PumpSetMapper {
@ResultMap("rs")
@Select("select * from Pump_Set where building_id='001'")
PumpSetEntity queryHandTime();
@Update("update pump_set set temp_set= #{tempSet} where building_id = #{buildingId} and pump_id= #{pumpId} and pump_name=#{pumpName}")
void updatePumpSetTempAndPumpName(@Param("tempSet") String string,
@Param("buildingId") String buildingId,
@Param("pumpId") String addr,
@Param("pumpName") String deviceName);
}

8
user-service/src/main/java/com/mh/user/model/MultiControlModel.java

@ -34,14 +34,6 @@ public class MultiControlModel {
private int gwRunState; // 网关运行状态 标志位(连接状态) 0:正常;1:不在线;2:异常
private String pumpName; //水泵名称
private String pumpId; //水泵编号
private String tempSet; //温度设置
private String waterTemp; //当前温度
private String waterLevel; //水位
private String isFault; //是否故障
private String pumpRunState; //运行状态
@Override
public String toString() {
return new StringJoiner(", ", MultiControlModel.class.getSimpleName() + "[", "]")

2
user-service/src/main/java/com/mh/user/netty/handle/HeartBeatServerHandler.java

@ -61,7 +61,7 @@ public class HeartBeatServerHandler extends IdleStateHandler {
String receiveStr = ExchangeStringUtil.bytesToHexString(msg);
// 判断当前报文是否是登录报文
if (receiveStr != null && receiveStr.startsWith("2400")) {
if (receiveStr.length() != 8 && receiveStr.length() != 10) {
if (receiveStr.length() != 8) {
super.channelRead(ctx, msg);
return;
}

6
user-service/src/main/java/com/mh/user/netty/handle/LoginRequestHandler.java

@ -35,12 +35,6 @@ public class LoginRequestHandler extends ChannelInboundHandlerAdapter {
super.channelRead(ctx, msg);
return;
}
// 两个特殊的心跳包
if (receiveStr.startsWith("2400600100") || receiveStr.startsWith("2400600101")) {
receiveStr = receiveStr.substring(0, 10);
} else {
receiveStr = receiveStr.substring(0, 8);
}
// 判断当前报文是否是心跳包上线: 869530073040186
log.info("接收到的心跳报文 <== {}", receiveStr);
// 通过对应的心跳包码进行判断,然后更新网关在线情况

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

@ -120,7 +120,7 @@ public class SendAndReceiveByCom {
if (bytes == null) {
SerialTool.closePort(serialPort);
log.info("串口{}没有数据返回!{}", serialPort.getName(), i);
SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, comName);
SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService);
}
// 处理返回来的数据报文
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, device, null);
@ -189,7 +189,7 @@ public class SendAndReceiveByCom {
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
// 解析返回来的数据

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

@ -11,6 +11,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import purejavacomm.SerialPort;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
@ -113,10 +115,10 @@ public class SerialPortSendReceive2 {
if (bytes == null) {
SerialTool.closePort(serialPort);
log.info("串口" + serialPort.getName() + "没有数据返回!" + i);
SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, comName);
SendAndReceiveByTcp.printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService);
}
// 处理返回来的数据报文
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes, comName);
dealReceiveData(dateStr, serialPort, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, bytes);
try {
SerialTool.closePort(serialPort);
log.info("关闭串口==" + serialPort.getName());
@ -131,7 +133,6 @@ public class SerialPortSendReceive2 {
/**
* 处理返回来的数据
*
* @param dateStr
* @param serialPort
* @param i
@ -142,7 +143,6 @@ public class SerialPortSendReceive2 {
* @param buildingId
* @param buildingName
* @param bytes
* @param comName
* @throws InterruptedException
*/
private void dealReceiveData(String dateStr,
@ -153,7 +153,7 @@ public class SerialPortSendReceive2 {
String registerAddr,
String brand,
String buildingId,
String buildingName, byte[] bytes, String comName) {
String buildingName, byte[] bytes) {
try {
String receiveStr = "";
receiveStr = ExchangeStringUtil.parseByte2HexStr(bytes);
@ -177,11 +177,11 @@ public class SerialPortSendReceive2 {
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
// 解析返回来的数据
analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName, comName);
analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName);
} catch (Exception e) {
log.error("楼栋:" + buildingName + "设备类型:" + deviceType + "保存数据库失败!" + i,e);
}
@ -195,7 +195,7 @@ public class SerialPortSendReceive2 {
String dataStr,
AnalysisReceiveOrder485 analysisReceiveOrder485,
NowDataService nowDataService,
String buildingName, String comName) {
String buildingName) {
if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) {
analysisReceiveOrder485.analysisMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) {
@ -203,7 +203,7 @@ public class SerialPortSendReceive2 {
} else if (deviceType.equals("压变")) {
analysisReceiveOrder485.analysisPressureOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("热泵")) {
analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName, comName);
analysisReceiveOrder485.analysisPumpOrder485(dateStr ,dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("温控")) {
analysisReceiveOrder485.analysisTempOrder485(dataStr, registerAddr, brand, buildingId, buildingName);
} else if (deviceType.equals("时控")) {

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

@ -140,7 +140,7 @@ public class SerialPortSingle2 {
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
// try {

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

@ -1,7 +1,12 @@
package com.mh.user.service;
import com.mh.user.entity.*;
import com.mh.user.mapper.provider.DeviceInstallProvider;
import com.mh.user.model.DeviceModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
import java.util.Date;
import java.util.List;
@ -79,7 +84,7 @@ public interface DeviceInstallService {
void updateOnline(String deviceAddr,String deviceType,String buildingId,String isOnline);
// 修改设备离线状态
void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom);
void updateNotOnline(String deviceAddr,String deviceType,String buildingId,String isOnline);
//根据通讯地址和设备类型查询对应的设备信息
DeviceInstallEntity selectDevice(String deviceAddr,String deviceType,String buildingId);
@ -151,7 +156,7 @@ public interface DeviceInstallService {
void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id);
//查询最后一次采集时间
String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom);
String selectLastDate(String deviceType,String deviceAddr,String buildingId);
//判断某栋楼是否有热泵设备
int judgePump(String buildingId);
@ -188,6 +193,4 @@ public interface DeviceInstallService {
int queryPumpCount(String buildingId);
Integer selectDeviceByOtherParams(DeviceCodeParamEntity deviceCodeParamEntity);
void updateDeviceFaultAndDeviceName(String number, String addr, String deviceType, String deviceName);
}

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

@ -4,6 +4,8 @@ import com.mh.user.annotation.SysLogger;
import com.mh.user.entity.*;
import com.mh.user.model.MultiControlModel;
import com.mh.user.model.WaterLevelModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
@ -14,13 +16,13 @@ public interface NowDataService {
void saveNowData(NowDataEntity nowDataEntity);
//保存热泵相关数据
void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom);
void saveNowHistoryData(String pumpId,String deviceType,String strData,String dataType,String buildingId);
//非热泵保存数据
void saveNowHistoryData2(String deviceAddr,String deviceType,String strData,String dataType,String buildingId);
//非热泵温度变送器相关数据
void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName);
void saveNowHistoryData3(String pumpId,String deviceType,String strData,String dataType,String buildingId);
//修改监控界面实时信息
void updateNowData(NowDataEntity nowDataEntity);
@ -113,7 +115,7 @@ public interface NowDataService {
void proWaterLevel(String curDate,String buildingID, String deviceAddr);
//在没有接收到返回值前设置监控界面热泵是否离线
void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom);
void updateRunState(String buildingId,String pumpId,String strState, String buildingName);
//计算热泵运行时间,按分钟
void proPumpMinutes(String buildingId,String pumpId,String runState);
@ -160,7 +162,5 @@ public interface NowDataService {
void updateMultiNowData(NowDataEntity nowDataEntity);
void proWaterPressure(String dateStr, String buildingId, String buildingName, String registerAddr, String otherName, String dataStr);
String selectStateByPumpName(String buildingId, String deviceAddr, String deviceName);
}

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

@ -12,5 +12,4 @@ public interface PumpSetService {
PumpSetEntity queryHandTime();
void updatePumpSetTempAndPumpName(String string, String buildingId, String addr, String deviceName);
}

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

@ -71,7 +71,7 @@ public class DataResultServiceImpl implements DataResultService {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId(), null);
dataResultEntity.getBuildingId());
if (deviceInstallEntity == null) {
logger.warn("saveDataResult: deviceInstallEntity is null for addr={}, type={}, building={}",
@ -150,7 +150,7 @@ public class DataResultServiceImpl implements DataResultService {
DeviceInstallEntity latestDeviceInstall = deviceInstallMapper.selectDevice(
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId(), null);
dataResultEntity.getBuildingId());
if (latestDeviceInstall != null) {
DataResultEntity existingData = dataResultMapper.selectDataResult(

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

@ -232,11 +232,6 @@ public class DeviceControlServiceImpl implements DeviceControlService {
if (Constant.WRITE.equals(type)) {
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
log.info("写入设备返回值==>{}", rtData);
// 如果是热泵在发送读取指令
if (!StringUtils.isBlank(brand) && Constant.BRAND_ZHENG_DI.equals(brand)) {
deviceCodeParam.setFunCode("03");
rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
}
// 如果是瑞星泵,需要在发送启动指令
if (!StringUtils.isBlank(brand) && brand.equals("瑞星")
&& (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2"))
@ -794,8 +789,6 @@ public class DeviceControlServiceImpl implements DeviceControlService {
} else if ("海尔2".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("04"); //功能码读数据
deviceCodeParam.setRegisterAddr(ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex("1302"), 4));
} else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr(deviceCodeParam.getRegisterAddr()); //功能码写数据
} else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
}
@ -821,7 +814,6 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); //功能码写数据
} else if (Constant.BRAND_ZHENG_DI.equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setFunCode("06"); //功能码写数据
return rtData;
} else {
deviceCodeParam.setRegisterAddr("0003"); //寄存器地址
deviceCodeParam.setFunCode("06"); //功能码写数据

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

@ -20,6 +20,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
@Slf4j
@ -369,14 +370,14 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
}
@Override
public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline, String dataCom) {
deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline, dataCom);
public void updateNotOnline(String deviceAddr, String deviceType, String buildingId, String isOnline) {
deviceInstallMapper.updateNotOnline(deviceAddr, deviceType, buildingId, isOnline);
}
//根据通讯地址和设备类型查询对应的设备信息
@Override
public DeviceInstallEntity selectDevice(String deviceAddr, String deviceType, String buildingId) {
return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, null);
return deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId);
}
@Override
@ -486,11 +487,6 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
deviceInstallMapper.updateDeviceFault(isFault, deviceAddr, deviceType);
}
@Override
public void updateDeviceFaultAndDeviceName(String number, String addr, String deviceType, String deviceName) {
deviceInstallMapper.updateDeviceFaultAndDeviceName(number, addr, deviceType, deviceName);
}
//查询设备品牌
@Override
public String selectBrand(String buildingId, String deviceAddr) {
@ -523,8 +519,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
}
@Override
public String selectLastDate(String deviceType, String deviceAddr, String buildingId, String dataCom) {
return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId, dataCom);
public String selectLastDate(String deviceType, String deviceAddr, String buildingId) {
return deviceInstallMapper.selectLastDate(deviceType, deviceAddr, buildingId);
}
@Override

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

@ -14,7 +14,6 @@ import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
import com.mh.user.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@ -107,7 +106,6 @@ public class NowDataServiceImpl implements NowDataService {
break;
}
}
// 在判断网关在线情况
List<DeviceInstallEntity> devices = deviceInstallMapper.selectOfflineDevice(buildingId, "多路控制");
if (!devices.isEmpty()) {
@ -115,30 +113,7 @@ public class NowDataServiceImpl implements NowDataService {
int online = gatewayManageMapper.queryGatewayByDataCom(deviceInstallEntity.getDataCom());
multiControlModel.setGwRunState(online);
}
// 在进行遍历,获取包含热泵的对应数据
list.stream().filter(nowDataEntity -> nowDataEntity.getPumpName().contains("热泵")).forEach(
nowDataEntity -> {
MultiControlModel multiControlModel1 = new MultiControlModel();
BeanUtils.copyProperties(nowDataEntity, multiControlModel1);
multiControlModel1.setBuildingId(buildingId);
multiControlModel1.setBuildingName(list.get(0).getBuildingName());
multiControlModel1.setPumpName(nowDataEntity.getPumpName());
multiControlModel1.setPumpId(nowDataEntity.getPumpId());
multiControlModel1.setTempSet(nowDataEntity.getTempSet());
multiControlModel1.setWaterTemp(nowDataEntity.getWaterTemp());
multiControlModel1.setIsFault(nowDataEntity.getIsFault()); // Fixed method name
multiControlModel1.setPumpRunState(nowDataEntity.getRunState()); // Fixed method name
if (!StringUtils.isBlank(nowDataEntity.getWaterLevel())) {
multiControlModel1.setWaterLevel(nowDataEntity.getWaterLevel());
}
result.add(multiControlModel1); // Add to result list
}
);
// result再根据热泵名称的数字进行排序
result.sort(Comparator.comparingInt(multiControlModel1 ->
Integer.parseInt(multiControlModel1.getPumpName().replaceAll("[^0-9]", ""))
));
result.add(multiControlModel);
return result;
}
@ -164,7 +139,7 @@ public class NowDataServiceImpl implements NowDataService {
//保存热泵采集数据
@Override
public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId, String dataCom) {
public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String strDate = sdf1.format(date);
@ -182,7 +157,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setIsFault(strData);
}
//从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId, dataCom);
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId);
//获取对应水箱信息
DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId);
if (tank != null) {
@ -191,7 +166,7 @@ public class NowDataServiceImpl implements NowDataService {
}
String buildingName = buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录
int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId);//判断now_data表是否存在记录
if (r1 == 0) {
data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
@ -199,7 +174,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setBuildingName(buildingName);
nowDataMapper.saveNowData(data);
} else {
NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId, deviceInstallEntity.getDeviceName());
NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId);
if (data1 != null) {
if (dataType.equals("tempSet")) { //温度设定
data1.setTempSet(strData);
@ -273,7 +248,7 @@ public class NowDataServiceImpl implements NowDataService {
break;
}
//从安装表获取设备信息
// DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId, dataCom);
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId);
String buildingName = buildingService.queryBuildingName(buildingId);
data.setBuildingName(buildingName);
// 获取项目名称
@ -361,7 +336,7 @@ public class NowDataServiceImpl implements NowDataService {
//非热泵温度变送器、状态检测相关数据
@Override
public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId, String deviceName) {
public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String strDate = sdf1.format(date);
@ -384,7 +359,7 @@ public class NowDataServiceImpl implements NowDataService {
}
String buildingName = buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceName);//判断now_data表是否存在记录
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录
if (r1 == 0) {
data.setPumpId(pumpId); //热泵编号
String pumpName = "热泵" + pumpId;
@ -393,7 +368,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setBuildingName(buildingName);
nowDataMapper.saveNowData(data);
} else {
NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId, deviceName);
NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId);
if (data1 != null) {
if (dataType.equals("tempSet")) { //温度设定
data1.setTempSet(strData);
@ -680,11 +655,6 @@ public class NowDataServiceImpl implements NowDataService {
return nowDataMapper.selectState(buildingId, pumpId);
}
@Override
public String selectStateByPumpName(String buildingId, String pumpId, String pumpName) {
return nowDataMapper.selectStateByPumpName(buildingId, pumpId, pumpName);
}
@Override
public void upLevelSet(String buildingId, String levelSet) {
nowDataMapper.upLevelSet(buildingId, levelSet);
@ -792,10 +762,10 @@ public class NowDataServiceImpl implements NowDataService {
}
@Override
public void updateRunState(String buildingId, String pumpId, String strState, String buildingName, String dataCom) {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId, dataCom);
public void updateRunState(String buildingId, String pumpId, String strState, String buildingName) {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId);
NowDataEntity data = new NowDataEntity();
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId, deviceInstallEntity.getDeviceName());//判断now_data表是否存在记录
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录
if (r1 == 0) {
data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
@ -804,7 +774,7 @@ public class NowDataServiceImpl implements NowDataService {
data.setRunState(strState);
nowDataMapper.saveNowData(data);
}
nowDataMapper.updateRunState(buildingId, pumpId, strState, deviceInstallEntity.getDeviceName());
nowDataMapper.updateRunState(buildingId, pumpId, strState);
}
@Override

5
user-service/src/main/java/com/mh/user/service/impl/PumpSetServiceImpl.java

@ -29,11 +29,6 @@ public class PumpSetServiceImpl implements PumpSetService {
pumpSetMapper.updatePumpSetTemp(tempSet,buildingId,pumpId);
}
@Override
public void updatePumpSetTempAndPumpName(String string, String buildingId, String addr, String deviceName) {
pumpSetMapper.updatePumpSetTempAndPumpName(string,buildingId,addr,deviceName);
}
@Override
public PumpSetEntity queryPumpSet(String pumpId, String buildingId) {
return pumpSetMapper.queryPumpSet(pumpId,buildingId);

2
user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java

@ -229,7 +229,7 @@ public class HeatPumpStatusStrategy implements DeviceStrategy {
addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, deviceCodeParamEntity.getDeviceName());
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);

57
user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java

@ -7,7 +7,10 @@ import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.NowPublicDataEntity;
import com.mh.user.service.*;
import com.mh.user.utils.*;
import com.mh.user.utils.ExchangeStringUtil;
import com.mh.user.utils.SpringBeanUtil;
import com.mh.user.utils.XK814ModbusParamReadUtil;
import com.mh.user.utils.XK814ModbusParamWriteUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
@ -217,7 +220,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
}
} else if (Constant.BRAND_ZHENG_DI.equals(brand)) {
if (StringUtils.isBlank(funCode) || funCode.equals("03")) {
str = str + funCode + registerAddr + "0001";
str = str + funCode + registerAddr + "0002";
} else if ("06".equals(funCode)) {
str = XK814ModbusParamWriteUtil.buildWriteSingleRegisterMessage(Integer.parseInt(deviceAddr), registerAddr, dataValue);
return str.toUpperCase();
@ -291,7 +294,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
rtData = getZhengDi(dateStr, registerAddr, buildingId, buildingName, checkStr, sValue, addr, dataType, deviceCodeParamEntity);
}
if (!StringUtils.isBlank(rtData)) {
nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId, deviceCodeParamEntity.getDataCom());
nowDataService.saveNowHistoryData(addr, "热泵", rtData, dataType.toString(), buildingId);
log.info("时间: " + dateStr + "热泵ID:" + addr + ",数据: " + rtData + ",保存数据库成功!楼栋名称:" + buildingName);
}
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化
@ -311,10 +314,6 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 根据字节数计算寄存器数量(每个寄存器2字节)
int registerCount = byteCount / 2;
if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;
}
// 遍历所有寄存器数据
for (int i = 0; i < registerCount; i++) {
// 提取寄存器值(每4个字符代表一个寄存器)
@ -324,14 +323,14 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 计算寄存器地址
String regAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4).toUpperCase();
// 使用 XK814ModbusParamReadIntoDBUtil 解析
Object parsedValue = XK814ModbusParamReadIntoDBUtil.parse(regAddr, value);
// 使用 XK814ModbusParserUtil 解析
Object parsedValue = XK814ModbusParamReadUtil.parse(regAddr, value);
if (parsedValue != null) {
log.info("正帝热泵解析 - 地址: {}, 原始值: {}, 解析结果: {}", regAddr, value, parsedValue);
// 根据不同的寄存器地址处理不同的业务逻辑
processZhengDiData(regAddr, parsedValue, value, buildingId, buildingName, addr, dataType, deviceCodeParamEntity.getDeviceName());
processZhengDiData(regAddr, parsedValue, value, buildingId, buildingName, addr, dataType);
sValue = String.valueOf(parsedValue);
// 这里根据com口、deviceType、brand、deviceAddr、buildingId查询对应deviceInstall的ID值
Integer deviceInstallId = deviceInstallService.selectDeviceByOtherParams(deviceCodeParamEntity);
@ -354,7 +353,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
*/
private void processZhengDiData(String regAddr, Object parsedValue, int rawValue,
String buildingId, String buildingName, String addr,
StringBuffer dataType, String deviceName) {
StringBuffer dataType) {
try {
// 温度相关数据
if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_DISPLAY_WATER_TEMP) ||
@ -363,32 +362,14 @@ public class HeatPumpStrategy implements DeviceStrategy {
dataType.setLength(0);
dataType.append("waterTemp");
String tempStr = parsedValue.toString();
String avgTemp = nowDataService.selectAve(buildingId);
// 保存公共数据
NowPublicDataEntity publicData = new NowPublicDataEntity();
publicData.setBuildingId(buildingId);
publicData.setUseWaterTemp(avgTemp);
publicData.setBackWaterTemp(avgTemp);
String pumpId = nowDataService.selectMinPumpId(buildingId);
// 如果是华夏,则取新增得字段标识为热泵ID
String name = dealDataService.customName();
if (name.contains(Constant.CUSTOM_NAME_HUAXIA)) {
pumpId = deviceInstallService.selectSinglePumpId(buildingId, addr);
}
log.info("---------------addr:" + addr + ",pumpId:" + pumpId + " ---------------");
if (addr.equals(pumpId)) { //取ID最小的热泵为单箱温度
publicData.setSingleTemp(tempStr);
log.info("---------------单箱温度:" + tempStr + "---------------");
}
nowPublicDataService.saveNowHistoryPublicData(publicData);
log.info("楼栋名称:" + buildingName + ",热泵编号:" + addr);
// // 保存公共数据
// NowPublicDataEntity publicData = new NowPublicDataEntity();
// publicData.setBuildingId(buildingId);
// publicData.setSingleTemp(tempStr);
// nowPublicDataService.saveNowHistoryPublicData(publicData);
//
// log.info("楼栋名称:{}, 热泵编号:{}, 水箱温度:{}", buildingName, addr, tempStr);
log.info("楼栋名称:{}, 热泵编号:{}, 水箱温度:{}", buildingName, addr, tempStr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_OUTLET_TEMP)) {
// 出水温度
@ -412,25 +393,25 @@ public class HeatPumpStrategy implements DeviceStrategy {
// 制冷设置温度
dataType.setLength(0);
dataType.append("coolSetTemp");
//pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_HEAT_SET_TEMP)) {
// 制热设置温度
dataType.setLength(0);
dataType.append("heatSetTemp");
//pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_HOT_WATER_SET_TEMP)) {
// 热水设置温度
dataType.setLength(0);
dataType.append("hotWaterSetTemp");
pumpSetService.updatePumpSetTempAndPumpName(parsedValue.toString(), buildingId, addr, deviceName);
pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_CONSTANT_TEMP_SET)) {
// 恒温设置温度
dataType.setLength(0);
dataType.append("constantTempSet");
// pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
pumpSetService.updatePumpSetTemp(parsedValue.toString(), buildingId, addr);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_MODE)) {
// 运行模式
@ -454,7 +435,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
dataType.append("isFault");
String faultStatus = (rawValue == 0) ? "无故障" : "有故障";
deviceInstallService.updateDeviceFaultAndDeviceName((rawValue == 0) ? "0" : "1", addr, "热泵", deviceName);
deviceInstallService.updateDeviceFault((rawValue == 0) ? "0" : "1", addr, "热泵");
log.info("楼栋名称:{}, 热泵编号:{}, 故障状态:{}", buildingName, addr, faultStatus);
} else if (regAddr.equals(XK814ModbusParamReadUtil.ADDR_INPUT_SWITCH_STATUS)) {
@ -962,7 +943,7 @@ public class HeatPumpStrategy implements DeviceStrategy {
return null;
}
if (!StringUtils.isBlank(sValue)) {
nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId(), deviceInstallEntity.getDataCom());
nowDataService.saveNowHistoryData(deviceInstallEntity.getDeviceAddr(), "热泵", sValue, dataType.toString(), deviceInstallEntity.getBuildingId());
log.info("时间: " + dateStr + "热泵ID:" + deviceInstallEntity.getDeviceAddr() + ",数据: " + dataStr + ",保存数据库成功!楼栋名称:" + deviceInstallEntity.getBuildingName());
}
return sValue;

2
user-service/src/main/java/com/mh/user/strategy/TempTransStrategy.java

@ -103,7 +103,7 @@ public class TempTransStrategy implements DeviceStrategy {
addr = entry.getKey();
data = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, deviceCodeParamEntity.getDeviceName());
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId);
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
}
}

2
user-service/src/main/java/com/mh/user/strategy/WaterLevelSwitchStrategy.java

@ -359,7 +359,7 @@ public class WaterLevelSwitchStrategy implements DeviceStrategy {
addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null);
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);

17
user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java

@ -61,7 +61,6 @@ public class SendAndReceiveByTcp {
String brand = deviceManageEntityList.get(i).getBrand();//品牌
String buildingId = deviceManageEntityList.get(i).getBuildingId();
String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称
String dataCom = deviceManageEntityList.get(i).getDataCom();
// 创建设备报文
Device device = DeviceFactory.createDevice(deviceType);
DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceType);
@ -111,7 +110,7 @@ public class SendAndReceiveByTcp {
String dateStr = DateUtil.dateToString(date1, "yyyy-MM-dd HH:mm:ss");
if (StringUtils.isBlank(receiveMsg)) {
log.info("TCP客户端:{},没有数据返回!{}", keyVal, i);
printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService, dataCom);
printLog(deviceAddr, deviceType, buildingId, buildingName, dateStr, log, deviceInstallService, nowDataService);
continue;
}
// 处理返回来的数据报文
@ -129,17 +128,17 @@ public class SendAndReceiveByTcp {
}
}
public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService, String dataCom) {
log.info("----------------{}离线,设备号:{},所属楼栋:{},端口号:{}----------------", deviceType, deviceAddr, buildingName, dataCom);
String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId, dataCom);
public static void printLog(String deviceAddr, String deviceType, String buildingId, String buildingName, String dateStr, Logger log, DeviceInstallService deviceInstallService, NowDataService nowDataService) {
log.info("----------------{}离线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName);
String time1 = deviceInstallService.selectLastDate(deviceType, deviceAddr, buildingId);
if (time1 == null) {
time1 = dateStr;
}
int d = ExchangeStringUtil.compareCopyTime(time1, dateStr);
if (d == 1) {
deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线", dataCom); //所有设备离线
deviceInstallService.updateNotOnline(deviceAddr, deviceType, buildingId, "离线"); //所有设备离线
if (deviceType.equals("热泵")) {
nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName, dataCom); //监控界面状态表热泵在线状态
nowDataService.updateRunState(buildingId, deviceAddr, "离线", buildingName); //监控界面状态表热泵在线状态
}
}
return;
@ -188,9 +187,9 @@ public class SendAndReceiveByTcp {
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info("----------------{}在线,设备号:{},所属楼栋:{}----------------", deviceType, deviceAddr, buildingName);
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName());
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, deviceCodeParamEntity.getDataCom()); //监控界面状态表热泵在线状态
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
// 解析返回来的数据

9
user-service/src/main/java/com/mh/user/tcp/TcpSingle.java

@ -8,6 +8,7 @@ import com.mh.user.factory.Device;
import com.mh.user.factory.DeviceFactory;
import com.mh.user.netty.session.ServerSession;
import com.mh.user.netty.session.SessionMap;
import com.mh.user.serialport.SerialTool;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.NowDataService;
@ -16,12 +17,16 @@ import com.mh.user.strategy.DeviceStrategyFactory;
import com.mh.user.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import purejavacomm.SerialPort;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import static com.mh.user.tcp.SendAndReceiveByTcp.printLog;
/**
* @author nxr
* @title
@ -102,9 +107,9 @@ public class TcpSingle {
deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线
log.info("{}在线,设备号:{},所属楼栋:{}", deviceType, deviceAddr, buildingName);
if (deviceType.equals("热泵")) {
String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName());
String strState = nowDataService.selectState(buildingId, deviceAddr);
if (strState != null && strState.equals("离线")) { //采集到数据
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态
nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态
}
}
rtData = device.analysisReceiveData(DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"),

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

@ -263,7 +263,7 @@ public class AnalysisReceiveOrder485 {
}
// 热泵
public void analysisPumpOrder485(final String dateStr, final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName, String comName) {
public void analysisPumpOrder485(final String dateStr,final String receiveData, final String registerAddr, final String brand, String buildingId, String buildingName) {
String checkStr = receiveData.substring(0, receiveData.length() - 4);//检验报文
String checkWord = ExchangeStringUtil.getStrCRC16(checkStr);//生成校验码
String sValue = null;
@ -294,7 +294,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) {
//0642设定温度,0007水箱水温
@ -321,7 +321,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("热泵ID:" + addr + ",数据:" + sValue + ",保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态
dataType = "isFault";
@ -334,7 +334,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵");
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("热泵ID:" + addr + ",数据: " + sValue + ",保存数据库成功!楼栋名称:" + buildingName);
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
@ -366,7 +366,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) {
//0003设定温度,0064水箱水温
@ -394,7 +394,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("热泵ID: " + addr + ",数据: " + sValue + ",保存数据库成功!楼栋编号:" + buildingId);
} else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态
dataType = "isFault";
@ -405,7 +405,7 @@ public class AnalysisReceiveOrder485 {
} else if (sData.substring(7, 8).equalsIgnoreCase("1")) {
sValue = "有故障";
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
@ -424,7 +424,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) {
//000A设定温度,0046水箱水温
@ -453,7 +453,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态
dataType = "isFault";
@ -466,7 +466,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵");
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0028")
|| registerAddr.equalsIgnoreCase("002C")
@ -486,7 +486,7 @@ public class AnalysisReceiveOrder485 {
log.info("----------------保存楼栋时间点温度变化值!----------------");
}
public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName, String comName) {
public String analysisPumpOrder4852(final String receiveData, final String registerAddr, final String brand, String buildingId, final String buildingName) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String dateStr = sdf1.format(date);
@ -519,7 +519,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0642") || registerAddr.equalsIgnoreCase("0007")) {
//0642设定温度,0007水箱水温
@ -540,7 +540,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000B")) { //故障状态
dataType = "isFault";
@ -553,7 +553,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵");
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0656")
|| registerAddr.equalsIgnoreCase("065A")
@ -593,7 +593,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0003") || registerAddr.equalsIgnoreCase("0064")) {
//0003设定温度,0064水箱水温
@ -614,7 +614,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0BBB")) { //故障状态
dataType = "isFault";
@ -625,7 +625,7 @@ public class AnalysisReceiveOrder485 {
} else if (sData.substring(7, 8).equalsIgnoreCase("1")) {
sValue = "有故障";
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0656")
|| registerAddr.equalsIgnoreCase("065A")
@ -652,7 +652,7 @@ public class AnalysisReceiveOrder485 {
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) {
//000A设定温度,0046水箱水温
@ -674,7 +674,7 @@ public class AnalysisReceiveOrder485 {
} else if (dataType.equals("tempSet")) {
pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态
dataType = "isFault";
@ -687,7 +687,7 @@ public class AnalysisReceiveOrder485 {
sValue = "有故障";
deviceInstallService.updateDeviceFault("1", addr, "热泵");
}
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId, comName);
nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId);
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName);
} else if (registerAddr.equalsIgnoreCase("0028")
|| registerAddr.equalsIgnoreCase("002C")
@ -748,7 +748,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey();
data = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, null);
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId);
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
}
}
@ -803,7 +803,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey();
data = entry.getValue();
if (addr != null && Integer.valueOf(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId, null);
nowDataService.saveNowHistoryData3(addr, "温度变送器", data, "waterTemp", buildingId);
nowDataService.proWaterTemp(dateStr, buildingId, addr);//保存时间点温度
}
}
@ -1388,7 +1388,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null);
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存时间点温度
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);
@ -1542,7 +1542,7 @@ public class AnalysisReceiveOrder485 {
addr = entry.getKey(); //获取Key值作为热泵ID
runState = entry.getValue();
if (addr != null && Integer.parseInt(addr) <= count) {
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId, null);
nowDataService.saveNowHistoryData3(addr, "热泵状态", runState, "runState", buildingId);
nowDataService.proPumpMinutes(buildingId, addr, runState); //计算热泵运行时长
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + runState);
}

312
user-service/src/main/java/com/mh/user/utils/XK814ModbusParamReadIntoDBUtil.java

@ -1,312 +0,0 @@
package com.mh.user.utils;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 正帝热泵协议解析保存到数据库的值
* @date 2026-05-25 17:15:42
*/
public class XK814ModbusParamReadIntoDBUtil {
/**
* XK814 冷热水机 Modbus 协议 V1.0 解析器第三张表
* 地址范围A000 ~ B009, AFFF
*/
// ==================== 地址常量(字符串格式)====================
public static final String ADDR_DISPLAY_WATER_TEMP = "A000"; // 40960
public static final String ADDR_TANK_TEMP = "A001"; // 40961
public static final String ADDR_OUTLET_TEMP = "A002"; // 40962
public static final String ADDR_INLET_TEMP = "A003"; // 40963
public static final String ADDR_AMBIENT_TEMP = "A004"; // 40964
public static final String ADDR_COIL1_TEMP = "A005"; // 40965
public static final String ADDR_SUCTION1_TEMP = "A006"; // 40966
public static final String ADDR_EXHAUST1_TEMP = "A007"; // 40967
public static final String ADDR_VALVE_AFTER1_OR_RETURN = "A008"; // 40968
public static final String ADDR_RESERVED_A009 = "A009";
public static final String ADDR_RESERVED_A00A = "A00A";
public static final String ADDR_MAIN_EXP_VALVE1_OPEN = "A00B"; // 40971
public static final String ADDR_AUX_EXP_VALVE1_OPEN = "A00C"; // 40972
public static final String ADDR_COMP1_CURRENT = "A00D"; // 40973
public static final String ADDR_COIL2_TEMP = "A00E"; // 40974
public static final String ADDR_SUCTION2_TEMP = "A00F"; // 40975
public static final String ADDR_EXHAUST2_TEMP = "A010"; // 40976
public static final String ADDR_VALVE_AFTER2_TEMP = "A011"; // 40977
public static final String ADDR_RESERVED_A012 = "A012";
public static final String ADDR_RESERVED_A013 = "A013";
public static final String ADDR_MAIN_EXP_VALVE2_OPEN = "A014"; // 40980
public static final String ADDR_AUX_EXP_VALVE2_OPEN = "A015"; // 40981
public static final String ADDR_COMP2_CURRENT = "A016"; // 40982
public static final String ADDR_RECOVERABLE_FAULT = "A017"; // 40983
public static final String ADDR_UNRECOVERABLE_FAULT = "A018"; // 40984
public static final String ADDR_VERSION_INFO = "A019"; // 40985
public static final String ADDR_INPUT_SWITCH_STATUS = "A01A"; // 40986
public static final String ADDR_WATER_LEVEL_SWITCH = "A01B"; // 40987
public static final String ADDR_OUTPUT1_STATUS = "A01C"; // 40988
public static final String ADDR_OUTPUT2_STATUS = "A01D"; // 40989
public static final String ADDR_OUTPUT3_STATUS = "A01E"; // 40990
public static final String ADDR_DIP_SWITCH = "A01F"; // 40991
public static final String ADDR_MAINBOARD_TYPE = "A020"; // 40992
public static final String ADDR_CONSTANT_TEMP_SET = "AFFF"; // 45055
public static final String ADDR_ON_OFF = "B000"; // 45056
public static final String ADDR_COOL_SET_TEMP = "B001"; // 45057
public static final String ADDR_HEAT_SET_TEMP = "B002"; // 45058
public static final String ADDR_MODE = "B003"; // 45059
public static final String ADDR_HOT_WATER_SET_TEMP = "B004"; // 45060
public static final String ADDR_FORCE_ELECTRIC_HEAT = "B005"; // 45061
public static final String ADDR_FORCE_DEFROST = "B006"; // 45062
public static final String ADDR_RESERVED_B007 = "B007";
public static final String ADDR_RETURN_VALVE_TIMER = "B008"; // 45064
public static final String ADDR_SUPPLY_VALVE_TIMER = "B009"; // 45065
// ==================== 解析器映射表 ====================
private static final Map<String, Function<Integer, Object>> PARSERS = new HashMap<>();
// ==================== 编码器映射表(写操作) ====================
private static final Map<String, Function<Object, Integer>> ENCODERS = new HashMap<>();
static {
// ---------- TEMP1 类型(无符号byte,低8位有效)----------
// 公式:温度 = (raw - 64) / 2,raw=1 表示传感器故障/未接
Function<Integer, Object> temp1Parser = v -> parseTemp1(v & 0xFF);
Function<Object, Integer> temp1Encoder = val -> encodeTemp1((Double) val);
// ---------- TEMP2 类型(无符号byte,低8位有效)----------
// 公式:温度 = raw - 32,raw=1 表示传感器故障/未接
Function<Integer, Object> temp2Parser = v -> parseTemp2(v & 0xFF);
Function<Object, Integer> temp2Encoder = val -> encodeTemp2((Integer) val);
// ---------- DIGI1 类型(无符号byte,低8位有效)----------
Function<Integer, Object> digi1Parser = v -> v & 0xFF;
Function<Object, Integer> digi1Encoder = val -> ((Number) val).intValue() & 0xFF ;
// ---------- DIG2 类型(16位无符号整型)----------
Function<Integer, Object> dig2Parser = v -> v & 0xFFFF;
Function<Object, Integer> dig2Encoder = val -> ((Number) val).intValue() & 0xFFFF;
// 地址配置(解析器 + 编码器)
// 温度读取地址(只读)
String[] temp1Addrs = {ADDR_DISPLAY_WATER_TEMP, ADDR_TANK_TEMP, ADDR_OUTLET_TEMP,
ADDR_INLET_TEMP, ADDR_AMBIENT_TEMP, ADDR_COIL1_TEMP, ADDR_SUCTION1_TEMP,
ADDR_VALVE_AFTER1_OR_RETURN, ADDR_COIL2_TEMP, ADDR_SUCTION2_TEMP,
ADDR_VALVE_AFTER2_TEMP};
for (String addr : temp1Addrs) {
PARSERS.put(addr, temp1Parser);
// 这些是只读地址,不设置编码器
}
// TEMP2 只读
String[] temp2Addrs = {ADDR_EXHAUST1_TEMP, ADDR_EXHAUST2_TEMP};
for (String addr : temp2Addrs) {
PARSERS.put(addr, temp2Parser);
}
// DIG2 只读
String[] dig2Addrs = {ADDR_MAIN_EXP_VALVE1_OPEN, ADDR_AUX_EXP_VALVE1_OPEN,
ADDR_MAIN_EXP_VALVE2_OPEN, ADDR_AUX_EXP_VALVE2_OPEN};
for (String addr : dig2Addrs) {
PARSERS.put(addr, dig2Parser);
}
// DIGI1 只读
String[] digi1Addrs = {ADDR_COMP1_CURRENT, ADDR_COMP2_CURRENT,
ADDR_RECOVERABLE_FAULT, ADDR_UNRECOVERABLE_FAULT};
for (String addr : digi1Addrs) {
PARSERS.put(addr, digi1Parser);
}
// 版本号(特殊解析)
PARSERS.put(ADDR_VERSION_INFO, XK814ModbusParamReadIntoDBUtil::parseVersion);
// 位域状态
PARSERS.put(ADDR_INPUT_SWITCH_STATUS, XK814ModbusParamReadIntoDBUtil::parseInputSwitchStatus);
PARSERS.put(ADDR_WATER_LEVEL_SWITCH, XK814ModbusParamReadIntoDBUtil::parseWaterLevelSwitch);
PARSERS.put(ADDR_OUTPUT1_STATUS, XK814ModbusParamReadIntoDBUtil::parseOutput1Status);
PARSERS.put(ADDR_OUTPUT2_STATUS, XK814ModbusParamReadIntoDBUtil::parseOutput2Status);
PARSERS.put(ADDR_OUTPUT3_STATUS, XK814ModbusParamReadIntoDBUtil::parseOutput3Status);
PARSERS.put(ADDR_DIP_SWITCH, XK814ModbusParamReadIntoDBUtil::parseDipSwitch);
PARSERS.put(ADDR_MAINBOARD_TYPE, XK814ModbusParamReadIntoDBUtil::parseMainboardType);
// ========== 可读写地址 ==========
// AFFFH 恒温设置温度 (TEMP2)
PARSERS.put(ADDR_CONSTANT_TEMP_SET, temp2Parser);
ENCODERS.put(ADDR_CONSTANT_TEMP_SET, temp2Encoder);
// B000H 开关机 (0关机,1开机)
PARSERS.put(ADDR_ON_OFF, v -> (v & 0xFF) == 0 ? "0" : "1");
ENCODERS.put(ADDR_ON_OFF, val -> (val.equals("开机") ? 1 : 0) & 0xFF);
// B001H 制冷设置温度 (TEMP2)
PARSERS.put(ADDR_COOL_SET_TEMP, temp2Parser);
ENCODERS.put(ADDR_COOL_SET_TEMP, temp2Encoder);
// B002H 制热设置温度 (TEMP2)
PARSERS.put(ADDR_HEAT_SET_TEMP, temp2Parser);
ENCODERS.put(ADDR_HEAT_SET_TEMP, temp2Encoder);
// B003H 运行模式 (0制热,1制冷,2恒温)
PARSERS.put(ADDR_MODE, v -> {
int mode = v & 0xFF;
switch (mode) {
case 0:
return "0";
case 1:
return "1";
case 2:
return "2";
default:
return "99";
}
});
ENCODERS.put(ADDR_MODE, val -> {
String mode = (String) val;
switch (mode) {
case "制热":
return 0;
case "制冷":
return 1;
case "恒温":
return 2;
default:
throw new IllegalArgumentException("无效模式: " + mode);
}
});
// B004H 热水设置温度 (TEMP2)
PARSERS.put(ADDR_HOT_WATER_SET_TEMP, temp2Parser);
ENCODERS.put(ADDR_HOT_WATER_SET_TEMP, temp2Encoder);
// B005H 强制电加热
PARSERS.put(ADDR_FORCE_ELECTRIC_HEAT, v -> (v & 0xFF) == 0 ? "0" : "1");
ENCODERS.put(ADDR_FORCE_ELECTRIC_HEAT, val -> val.equals("开启强制") ? 1 : 0);
// B006H 强制除霜
PARSERS.put(ADDR_FORCE_DEFROST, v -> (v & 0xFF) == 0 ? "0" : "1");
ENCODERS.put(ADDR_FORCE_DEFROST, val -> val.equals("开启强制") ? 1 : 0);
// B008H 回水阀定时开关 (bit0)
PARSERS.put(ADDR_RETURN_VALVE_TIMER, v -> ((v & 01) == 0) ? "0" : "1");
ENCODERS.put(ADDR_RETURN_VALVE_TIMER, val -> (val.equals("开启") ? 1 : 0) & 01);
// B009H 供水阀定时开关 (bit0)
PARSERS.put(ADDR_SUPPLY_VALVE_TIMER, v -> ((v & 01) == 0) ? "0" : "1");
ENCODERS.put(ADDR_SUPPLY_VALVE_TIMER, val -> (val.equals("开启") ? 1 : 0) & 01);
}
/**
* 解析寄存器值
*
* @param address 寄存器地址字符串格式 "A000"
* @param value 寄存器原始值0~65535
* @return 解析后的物理值若地址未定义则返回 null
*/
public static Object parse(String address, int value) {
Function<Integer, Object> parser = PARSERS.get(address);
if (parser == null) {
return null;
}
return parser.apply(value);
}
/**
* 将物理值编码为寄存器值用于写操作
*
* @param address 寄存器地址字符串格式 "A000"
* @param physicalValue 物理值类型需与协议匹配
* @return 要写入寄存器的整数值若地址不支持写或类型错误则抛出异常
*/
public static int encode(String address, Object physicalValue) {
Function<Object, Integer> encoder = ENCODERS.get(address);
if (encoder == null) {
throw new UnsupportedOperationException("地址 " + address + " 不支持写操作");
}
return encoder.apply(physicalValue);
}
// ==================== 私有解析/编码辅助方法 ====================
// TEMP1 解析:温度 = (raw - 64)/2,raw=1 表示故障
private static Double parseTemp1(int raw) {
if (raw == 1) return 1.0; // 传感器故障或未接
return (raw - 64) / 2.0;
}
// TEMP1 编码:给定温度(Double),返回 raw 值
private static int encodeTemp1(Double temp) {
if (temp == null) return 1; // 故障时写入1?协议未明确写故障,一般写有效值
int raw = (int) Math.round(temp * 2 + 64);
// 限制范围 0~255,但协议中有效温度对应 raw 范围 4~? 不做严格限制
return Math.min(255, Math.max(0, raw));
}
// TEMP2 解析:温度 = raw - 32,raw=1 表示故障
private static Integer parseTemp2(int raw) {
if (raw == 1) return 1;
return raw - 32;
}
// TEMP2 编码
private static int encodeTemp2(Integer temp) {
if (temp == null) return 1;
int raw = temp + 32;
return Math.min(255, Math.max(0, raw));
}
// 版本号解析:高8位类别版本,低8位主板版本
private static String parseVersion(int value) {
return String.valueOf(value);
}
// A01AH 输入开关状态
private static String parseInputSwitchStatus(int value) {
return String.valueOf(value);
}
// A01BH 水位开关状态
private static String parseWaterLevelSwitch(int value) {
return String.valueOf(value);
}
// A01CH 输出1状态
private static String parseOutput1Status(int value) {
return String.valueOf(value);
}
// A01DH 输出2状态
private static String parseOutput2Status(int value) {
return String.valueOf(value);
}
// A01EH 输出3状态
private static String parseOutput3Status(int value) {
return String.valueOf(value);
}
// A01FH 机组信息
private static String parseDipSwitch(int value) {
return String.valueOf(value);
}
// A020H 主板类别
private static String parseMainboardType(int value) {
return String.valueOf(value);
}
// ==================== 测试示例 ====================
public static void main(String[] args) {
// 示例:解析 A000H 显示水温,原始值 110 -> 温度 (110-64)/2 = 23℃
System.out.println("显示水温: " + parse(ADDR_DISPLAY_WATER_TEMP, 110) + "℃");
System.out.println(ADDR_DISPLAY_WATER_TEMP);
// 示例:解析 A007H 排气1温度,原始值 33 -> 33-32=1℃
System.out.println("排气1温度: " + parse(ADDR_EXHAUST1_TEMP, 33) + "℃");
// 示例:解析 B003H 运行模式,原始值 1 -> 制冷
System.out.println("运行模式: " + parse("A01D", 1));
// 编码示例:写恒温设置温度 25℃
int encoded = encode(ADDR_CONSTANT_TEMP_SET, 25); // 25+32=57
System.out.println("恒温设置温度 25℃ 编码为: " + encoded);
// 写开关机:开机
encoded = encode(ADDR_ON_OFF, "开机");
System.out.println("开机编码: " + encoded);
// 测试字符串地址传入
System.out.println("\n--- 测试字符串地址 ---");
System.out.println("显示水温: " + parse("A000", 110) + "℃");
System.out.println("运行模式: " + parse("B003", 1));
}
}

29
user-service/src/main/java/com/mh/user/utils/XK814ModbusParamWriteUtil.java

@ -78,7 +78,6 @@ public class XK814ModbusParamWriteUtil {
* @param value 物理值类型需与地址匹配参考协议
* @return 完整的 RTU 报文字节数组包含 CRC
*/
// ... existing code ...
public static String buildWriteSingleRegisterMessage(int slaveId, String address, Object value) {
// 获取编码器
String addrUpper = address.toUpperCase();
@ -90,28 +89,26 @@ public class XK814ModbusParamWriteUtil {
int regValue = encoder.apply(value);
// 地址字符串转整数
int regAddr = Integer.parseInt(addrUpper, 16);
// 构建报文(不含 CRC)- 只包含地址和值,共4字节
byte[] frameWithoutCRC = new byte[4];
frameWithoutCRC[0] = (byte) (regAddr >> 8); // 地址高字节
frameWithoutCRC[1] = (byte) (regAddr & 0xFF); // 地址低字节
frameWithoutCRC[2] = (byte) (regValue >> 8); // 值高字节
frameWithoutCRC[3] = (byte) (regValue & 0xFF);// 值低字节
// 构建报文(不含 CRC)
byte[] pdu = new byte[6];
pdu[0] = (byte) (regAddr >> 8); // 地址高字节
pdu[1] = (byte) (regAddr & 0xFF); // 地址低字节
pdu[2] = (byte) (regValue >> 8); // 值高字节
pdu[3] = (byte) (regValue & 0xFF);// 值低字节
// 添加从机地址和功能码
byte[] fullFrameWithoutCRC = new byte[1 + 1 + 4];
fullFrameWithoutCRC[0] = (byte) slaveId;
fullFrameWithoutCRC[1] = 0x06; // 功能码
System.arraycopy(frameWithoutCRC, 0, fullFrameWithoutCRC, 2, 4);
byte[] frameWithoutCRC = new byte[1 + 1 + 6];
frameWithoutCRC[0] = (byte) slaveId;
frameWithoutCRC[1] = 0x06; // 功能码
System.arraycopy(pdu, 0, frameWithoutCRC, 2, 6);
// 计算 CRC16
int crc = calculateCRC(fullFrameWithoutCRC, 0, fullFrameWithoutCRC.length);
int crc = calculateCRC(frameWithoutCRC, 0, frameWithoutCRC.length);
// 完整报文
byte[] fullFrame = new byte[fullFrameWithoutCRC.length + 2];
System.arraycopy(fullFrameWithoutCRC, 0, fullFrame, 0, fullFrameWithoutCRC.length);
byte[] fullFrame = new byte[frameWithoutCRC.length + 2];
System.arraycopy(frameWithoutCRC, 0, fullFrame, 0, frameWithoutCRC.length);
fullFrame[fullFrame.length - 2] = (byte) (crc & 0xFF);
fullFrame[fullFrame.length - 1] = (byte) ((crc >> 8) & 0xFF);
return toHexString(fullFrame);
}
// ... existing code ...
/**
* 重载地址使用整数形式

2
user-service/src/main/resources/application.yml

@ -1,6 +1,6 @@
spring:
profiles:
active: prod
active: dev
mvc:
pathmatch:
matching-strategy: ant_path_matcher

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

@ -3,7 +3,6 @@ package com.mh.user;
import com.mh.user.entity.DeviceManageEntity;
import com.mh.user.entity.GaugeEntity;
import com.mh.user.job.DealDataJob;
import com.mh.user.job.StartOrStopHotpumpJob;
import com.mh.user.serialport.SerialPortThread;
import com.mh.user.service.DeviceManageService;
import com.mh.user.service.GaugeService;
@ -28,14 +27,6 @@ class UserServiceApplicationTests {
void contextLoads() {
}
@Autowired
private StartOrStopHotpumpJob startOrStopHotpumpJob;
@Test
public void testStartOrStopHotpump() {
startOrStopHotpumpJob.startOrStopHotpump();
}
@Test
public void encode() {
String s = PasswordUtils.encode("123456", "87e03afa1f0122531f729c9a7453f475");

1
user-service/src/test/java/com/mh/user/chart/ChartTest.java

@ -9,7 +9,6 @@ package com.mh.user.chart;
*/
public class ChartTest {
public static void main(String[] args) {
String[] split = "03_0003_1_14_2_主楼-1号热泵温度设置".split("_");
System.out.println(extracted());
}

Loading…
Cancel
Save