Browse Source

1、广州理工兼容蒙浩时控;

prod_20251209
25604 3 weeks ago
parent
commit
d8d5cad9c0
  1. 2
      user-service/src/main/java/com/mh/user/constants/Constant.java
  2. 1
      user-service/src/main/java/com/mh/user/constants/DeviceEnum.java
  3. 1
      user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java
  4. 154
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  5. 73
      user-service/src/main/java/com/mh/user/strategy/TimeControlStrategy.java

2
user-service/src/main/java/com/mh/user/constants/Constant.java

@ -60,6 +60,8 @@ public class Constant {
public static final String BRAND_ALITA = "阿丽塔"; public static final String BRAND_ALITA = "阿丽塔";
public static final String BRAND_MH = "蒙浩";
private static final String RUNNING = "运行"; private static final String RUNNING = "运行";
private static final String NOT_RUNNING = "不运行"; private static final String NOT_RUNNING = "不运行";

1
user-service/src/main/java/com/mh/user/constants/DeviceEnum.java

@ -19,6 +19,7 @@ public enum DeviceEnum {
BackTempControlEnum("回水温控", BackTempControl.getInstance()), BackTempControlEnum("回水温控", BackTempControl.getInstance()),
TimeControlEnum("时控", TimeControl.getInstance()), TimeControlEnum("时控", TimeControl.getInstance()),
ALiTaControlEnum("阿丽塔时控", TimeControl.getInstance()), ALiTaControlEnum("阿丽塔时控", TimeControl.getInstance()),
MHControlEnum("蒙浩时控", TimeControl.getInstance()),
WaterLevelSwitchEnum("水位开关", WaterLevelSwitch.getInstance()), WaterLevelSwitchEnum("水位开关", WaterLevelSwitch.getInstance()),
StatusCheckEnum("状态检测", StatusCheck.getInstance()), StatusCheckEnum("状态检测", StatusCheck.getInstance()),
TempTransEnum("温度变送器", TempTrans.getInstance()), TempTransEnum("温度变送器", TempTrans.getInstance()),

1
user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java

@ -19,6 +19,7 @@ public enum DeviceStrategyEnum {
BackTempControlEnum("回水温控", BackTempControlStrategy.getInstance()), BackTempControlEnum("回水温控", BackTempControlStrategy.getInstance()),
TimeControlEnum("时控", TimeControlStrategy.getInstance()), TimeControlEnum("时控", TimeControlStrategy.getInstance()),
ALitaTimeControlEnum("阿丽塔时控", TimeControlStrategy.getInstance()), ALitaTimeControlEnum("阿丽塔时控", TimeControlStrategy.getInstance()),
MHTimeControlEnum("蒙浩时控", TimeControlStrategy.getInstance()),
WaterLevelSwitchEnum("水位开关", WaterLevelSwitchStrategy.getInstance()), WaterLevelSwitchEnum("水位开关", WaterLevelSwitchStrategy.getInstance()),
StatusCheckEnum("状态检测", StatusCheckStrategy.getInstance()), StatusCheckEnum("状态检测", StatusCheckStrategy.getInstance()),
TempTransEnum("温度变送器", TempTransStrategy.getInstance()), TempTransEnum("温度变送器", TempTransStrategy.getInstance()),

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

@ -103,6 +103,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
break; break;
case "时控": case "时控":
case "阿丽塔时控": case "阿丽塔时控":
case "蒙浩时控":
rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
log.info("设备类型为时控==>{}", rtData); log.info("设备类型为时控==>{}", rtData);
break; break;
@ -351,6 +352,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) { ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) {
if ("阿丽塔".equals(deviceCodeParam.getBrand())) { if ("阿丽塔".equals(deviceCodeParam.getBrand())) {
rtData = handleAlitaTimeControl(serialPortModel, deviceCodeParam, type, serialPortSingle); rtData = handleAlitaTimeControl(serialPortModel, deviceCodeParam, type, serialPortSingle);
} else if ("蒙浩".equals(deviceCodeParam.getBrand())) {
rtData = handleMHTimeControl(serialPortModel, deviceCodeParam, type, serialPortSingle);
} else { } else {
rtData = handleDefaultTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); rtData = handleDefaultTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle);
} }
@ -358,6 +361,157 @@ public class DeviceControlServiceImpl implements DeviceControlService {
return rtData; return rtData;
} }
private String handleMHTimeControl(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, String type, SerialPortSingle2 serialPortSingle) {
// 设置值前面两位是场景选择,_隔开,后面是传入实际操作值
String[] split = serialPortModel.getDataValue().split("_");
if (split.length < 1) {
return Constant.FAIL;
}
// 场景
int scene = Integer.parseInt(split[0]);
if (Constant.WRITE.equals(type)) {
// 实际操作值
deviceCodeParam.setDataValue(split[1].replace(":", ""));
serialPortModel.setDataValue(split[1].replace(":", ""));
}
// 根据读写类型设置功能码
deviceCodeParam.setFunCode(Constant.READ.equals(type) ? "03" : "06");
// 根据参数类型设置寄存器地址
String registerStr = "";
switch (deviceCodeParam.getParam()) {
case "switching":
// 开关动作
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(64 + (scene - 1) * 6)), 4);
deviceCodeParam.setRegisterSize(1);
break;
case "timeSetOpen1":
// 开时间设置\读取1
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(30 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(1);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetClose1":
// 关时间设置\读取1
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(31 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(2);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetOpen2":
// 开时间设置\读取2
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(32 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(1);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetClose2":
// 关时间设置\读取2
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(33 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(2);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetOpen3":
// 开时间设置\读取3
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(34 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(1);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetClose3":
// 关时间设置\读取3
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(35 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(2);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetOpen4":
// 开时间设置\读取4
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(36 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(1);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "timeSetClose4":
// 关时间设置\读取4
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(37 + (scene - 1) * 18)), 4);
deviceCodeParam.setRegisterSize(2);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("06");
String[] time = split[1].split(":");
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time[0])*60 + Integer.parseInt(time[1])));
}
break;
case "channelSet":
// 多路设置
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(68 + (scene - 1) * 6)), 4);
deviceCodeParam.setRegisterSize(2);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("10");
}
break;
case "weekSet":
// 星期设置
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(24 + (scene-1) * 18)), 4);
if (Constant.WRITE.equals(type)) {
String dataValue = ExchangeStringUtil.addZeroForNum(deviceCodeParam.getDataValue(), 8);
dataValue = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.parseByte2HexStr(dataValue), 4);
dataValue = ExchangeStringUtil.hexToDec(dataValue);
deviceCodeParam.setDataValue(dataValue);
serialPortModel.setDataValue(dataValue);
}
deviceCodeParam.setRegisterSize(1);
break;
case "dateCalibrationSet":
// 时间设置
int registerValue = 0;
deviceCodeParam.setRegisterSize(7);
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(registerValue)), 4);
if (Constant.WRITE.equals(type)) {
deviceCodeParam.setFunCode("10");
}
break;
default:
return Constant.FAIL;
}
deviceCodeParam.setRegisterAddr(registerStr);
return serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令
}
private String handleAlitaTimeControl(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, String type, SerialPortSingle2 serialPortSingle) { private String handleAlitaTimeControl(SerialPortModel serialPortModel, DeviceCodeParamEntity deviceCodeParam, String type, SerialPortSingle2 serialPortSingle) {
// 设置值前面两位是场景选择,_隔开,后面是传入实际操作值 // 设置值前面两位是场景选择,_隔开,后面是传入实际操作值
String[] split = serialPortModel.getDataValue().split("_"); String[] split = serialPortModel.getDataValue().split("_");

73
user-service/src/main/java/com/mh/user/strategy/TimeControlStrategy.java

@ -53,7 +53,40 @@ public class TimeControlStrategy implements DeviceStrategy {
if (deviceAddr != null && !deviceAddr.isEmpty()) { if (deviceAddr != null && !deviceAddr.isEmpty()) {
str = ExchangeStringUtil.decToHex(deviceAddr); str = ExchangeStringUtil.decToHex(deviceAddr);
str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位
if (!StringUtils.isBlank(brand) && Constant.BRAND_ALITA.equals(brand)) { if (!StringUtils.isBlank(brand) && Constant.BRAND_MH.equals(brand)) {
try {
if (!StringUtils.isBlank(funCode)) {
registerAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4); //寄存器地址
funCode = ExchangeStringUtil.addZeroForNum(funCode, 2); // 功能码
if (funCode.equals("03")) { //功能码,读
str = str + "03" + registerAddr + registerSize;
} else if (funCode.equals("10")) {//写
// 判断寄存器地址
registerAddr = registerAddr.toUpperCase();
if ("0108".equals(registerAddr)) {
// 1F1001080003060014001200225B97
str = str + funCode + registerAddr + "000306"
+ "00" + dataValue.substring(2, 4) // 年
+ "00" + dataValue.substring(4,6) // 月
+ "00" + dataValue.substring(6,8); // 日
} else if ("0004".equals(registerAddr)) {
// 1F10010C0004080015004300300002BA23
str = str + funCode + registerAddr + "000306"
+ "00" + dataValue.substring(8, 10) // 时
+ "00" + dataValue.substring(10,12) // 分
+ "0000"; // 秒
}
} else if (funCode.equals("06")) {
str = str + funCode + registerAddr + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(dataValue), 4);
}
}
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord;
} catch (Exception e) {
log.error("生成蒙浩时控指令出错!" + str, e);
}
} else if (!StringUtils.isBlank(brand) && Constant.BRAND_ALITA.equals(brand)) {
try { try {
if (!StringUtils.isBlank(funCode)) { if (!StringUtils.isBlank(funCode)) {
registerAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4); //寄存器地址 registerAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4); //寄存器地址
@ -137,14 +170,46 @@ public class TimeControlStrategy implements DeviceStrategy {
if (!checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { if (!checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) {
return result; return result;
} }
log.info("时控报文检验成功: " + dataStr); log.info("时控报文检验成功: {}", dataStr);
//地址 //地址
String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));
log.info("时控号: " + addr); log.info("时控号: {}", addr);
String data = ""; String data = "";
if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读
int rec = dataStr.length(); int rec = dataStr.length();
if (!StringUtils.isBlank(brand) && Constant.BRAND_ALITA.equals(brand)) { if (!StringUtils.isBlank(brand) && Constant.BRAND_MH.equals(brand)) {
// 开关时间
// 发送:0603001E0001E5BB
// 返回:0603020041CDB4
if (rec == 14 && isExactlyDivisible("001E", registerAddr)) {
// 开关时间
data = ExchangeStringUtil.hexToDec(checkStr.substring(8, 10));
// 得出整数,然后拆分时分,比如data="65",换算成时分就是01:05
int totalMinutes = Integer.parseInt(data);
int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;
data = String.format("%02d:%02d", hours, minutes);
} else if (rec == 14 && isExactlyDivisible("0018", registerAddr)) {
// 星期掩码
// 截取时间
// 发送:06030018000105BA
// 返回:060302007F4C64
data = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)), 8);
// 截取七天
data = new StringBuilder(data).reverse().substring(0, 7);
} else if (rec == 38 && isExactlyDivisible("0000", registerAddr)) {
// 设备当前时间
// 直接截取年、月、日、小时、分、秒
// 发送:06030000000705BF
// 返回:06030E0019000B001B0003001000320029777B
data = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(8, 10)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(12, 14)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(16, 18)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(24, 26)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(28, 30)), 2)
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(32, 34)), 2);
}
} else if (!StringUtils.isBlank(brand) && Constant.BRAND_ALITA.equals(brand)) {
if (rec == 14 && isExactlyDivisible("0040", registerAddr)) { if (rec == 14 && isExactlyDivisible("0040", registerAddr)) {
// 开关设置 // 开关设置
// 16进制转2进制 10011 // 16进制转2进制 10011

Loading…
Cancel
Save