From d8d5cad9c0505a713a32015537097f963e6228c6 Mon Sep 17 00:00:00 2001 From: 25604 Date: Thu, 27 Nov 2025 17:51:40 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=B9=BF=E5=B7=9E=E7=90=86=E5=B7=A5?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E8=92=99=E6=B5=A9=E6=97=B6=E6=8E=A7=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mh/user/constants/Constant.java | 2 + .../com/mh/user/constants/DeviceEnum.java | 1 + .../mh/user/constants/DeviceStrategyEnum.java | 1 + .../impl/DeviceControlServiceImpl.java | 154 ++++++++++++++++++ .../mh/user/strategy/TimeControlStrategy.java | 73 ++++++++- 5 files changed, 227 insertions(+), 4 deletions(-) diff --git a/user-service/src/main/java/com/mh/user/constants/Constant.java b/user-service/src/main/java/com/mh/user/constants/Constant.java index 7d5e58d..3fa7d80 100644 --- a/user-service/src/main/java/com/mh/user/constants/Constant.java +++ b/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_MH = "蒙浩"; + private static final String RUNNING = "运行"; private static final String NOT_RUNNING = "不运行"; diff --git a/user-service/src/main/java/com/mh/user/constants/DeviceEnum.java b/user-service/src/main/java/com/mh/user/constants/DeviceEnum.java index ae73f78..95a34d9 100644 --- a/user-service/src/main/java/com/mh/user/constants/DeviceEnum.java +++ b/user-service/src/main/java/com/mh/user/constants/DeviceEnum.java @@ -19,6 +19,7 @@ public enum DeviceEnum { BackTempControlEnum("回水温控", BackTempControl.getInstance()), TimeControlEnum("时控", TimeControl.getInstance()), ALiTaControlEnum("阿丽塔时控", TimeControl.getInstance()), + MHControlEnum("蒙浩时控", TimeControl.getInstance()), WaterLevelSwitchEnum("水位开关", WaterLevelSwitch.getInstance()), StatusCheckEnum("状态检测", StatusCheck.getInstance()), TempTransEnum("温度变送器", TempTrans.getInstance()), diff --git a/user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java b/user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java index 31f8cc7..989d336 100644 --- a/user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java +++ b/user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java @@ -19,6 +19,7 @@ public enum DeviceStrategyEnum { BackTempControlEnum("回水温控", BackTempControlStrategy.getInstance()), TimeControlEnum("时控", TimeControlStrategy.getInstance()), ALitaTimeControlEnum("阿丽塔时控", TimeControlStrategy.getInstance()), + MHTimeControlEnum("蒙浩时控", TimeControlStrategy.getInstance()), WaterLevelSwitchEnum("水位开关", WaterLevelSwitchStrategy.getInstance()), StatusCheckEnum("状态检测", StatusCheckStrategy.getInstance()), TempTransEnum("温度变送器", TempTransStrategy.getInstance()), diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java index 98f0f25..3a3d0a2 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java @@ -103,6 +103,7 @@ public class DeviceControlServiceImpl implements DeviceControlService { break; case "时控": case "阿丽塔时控": + case "蒙浩时控": rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); log.info("设备类型为时控==>{}", rtData); break; @@ -351,6 +352,8 @@ public class DeviceControlServiceImpl implements DeviceControlService { ControlSetEntity controlData, String rtData, String type, SerialPortSingle2 serialPortSingle) { if ("阿丽塔".equals(deviceCodeParam.getBrand())) { rtData = handleAlitaTimeControl(serialPortModel, deviceCodeParam, type, serialPortSingle); + } else if ("蒙浩".equals(deviceCodeParam.getBrand())) { + rtData = handleMHTimeControl(serialPortModel, deviceCodeParam, type, serialPortSingle); } else { rtData = handleDefaultTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); } @@ -358,6 +361,157 @@ public class DeviceControlServiceImpl implements DeviceControlService { 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) { // 设置值前面两位是场景选择,_隔开,后面是传入实际操作值 String[] split = serialPortModel.getDataValue().split("_"); diff --git a/user-service/src/main/java/com/mh/user/strategy/TimeControlStrategy.java b/user-service/src/main/java/com/mh/user/strategy/TimeControlStrategy.java index 1d92e6b..c27464f 100644 --- a/user-service/src/main/java/com/mh/user/strategy/TimeControlStrategy.java +++ b/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()) { str = ExchangeStringUtil.decToHex(deviceAddr); 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 { if (!StringUtils.isBlank(funCode)) { registerAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4); //寄存器地址 @@ -137,14 +170,46 @@ public class TimeControlStrategy implements DeviceStrategy { if (!checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { return result; } - log.info("时控报文检验成功: " + dataStr); + log.info("时控报文检验成功: {}", dataStr); //地址 String addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2)); - log.info("时控号: " + addr); + log.info("时控号: {}", addr); String data = ""; if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {// 读 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)) { // 开关设置 // 16进制转2进制 10011