diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java index df7426c..e2dac04 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java @@ -1,20 +1,20 @@ package com.mh.user.serialport; import com.mh.common.utils.StringUtils; +import com.mh.user.constants.Constant; import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.service.BuildingService; import com.mh.user.service.DeviceInstallService; import com.mh.user.service.NowDataService; -import com.mh.user.utils.AnalysisReceiveOrder485; -import com.mh.user.utils.ExchangeStringUtil; -import com.mh.user.utils.SendOrderUtils; -import com.mh.user.utils.SpringBeanUtil; +import com.mh.user.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import java.io.IOException; import purejavacomm.SerialPort; +import purejavacomm.SerialPortEvent; +import purejavacomm.SerialPortEventListener; /** * @author nxr @@ -51,73 +51,95 @@ public class SerialPortSingle2 { if (serialPort != null) { String sendStr = SendOrderUtils.getSendStr(deviceCodeParamEntity); SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort, sendStr, deviceCodeParamEntity.getDeviceType()); - if (deviceCodeParamEntity.getDeviceType().equals("热泵")) { - Thread.sleep(4000); - } else { - Thread.sleep(2000); - } + CacheTools.initReceiveMsg(serialPort.getName()); + SerialPort finalSerialPort = serialPort; + SerialTool.addListener(serialPortEvent -> { + try { + for (int i = 0; i < 5; i++) { + Thread.sleep(1000); + byte[] bytes = SerialTool.readFromPort(finalSerialPort); + if (bytes!= null && bytes.length > 0) { + if (Constant.WEB_FLAG) { + CacheTools.setReceiveMsg(finalSerialPort.getName(), ExchangeStringUtil.printHexString(bytes)); + break; + } + } + } + } catch (Exception e) { + log.error("单抄串口" + finalSerialPort + "异常,关闭串口", e); + } + }, serialPort); } } catch (Exception e) { SerialTool.closePort(serialPort); log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e); return "fail"; } - //对返回数据进行相关解析处理 - byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据 - if (null == bytes) { - SerialTool.closePort(serialPort); - log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口"); - return "fail"; - } - String receiveStr = null; - receiveStr = ExchangeStringUtil.printHexString(bytes); - //去掉空格和null - receiveStr = receiveStr.replace("null", "").replace(" ", ""); - log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); - //返回值全部变成大写 - String receiveData = receiveStr.toUpperCase(); - //截取去掉FE - String dataStr = receiveData.replace("FE", ""); - String deviceType = deviceCodeParamEntity.getDeviceType(); - String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); - String registerAddr = deviceCodeParamEntity.getRegisterAddr(); - String brand = deviceCodeParamEntity.getBrand(); - String buildingId = deviceCodeParamEntity.getBuildingId(); - String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 +// //对返回数据进行相关解析处理 +// byte[] bytes = SerialTool.readFromPort(serialPort); //读取串口数据 +// if (null == bytes) { +// SerialTool.closePort(serialPort); +// log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口"); +// return "fail"; +// } +// String receiveStr = null; +// receiveStr = ExchangeStringUtil.printHexString(bytes); + String receiveStr; + if (serialPort != null) { + receiveStr = CacheTools.waitReceiveMsg(serialPort.getName()); + //去掉空格和null + if (StringUtils.isBlank(receiveStr)) { + return "fail"; + } + receiveStr = receiveStr.replace("null", "").replace(" ", ""); + log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); + //返回值全部变成大写 + String receiveData = receiveStr.toUpperCase(); + //截取去掉FE + String dataStr = receiveData.replace("FE", ""); + String deviceType = deviceCodeParamEntity.getDeviceType(); + String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); + String registerAddr = deviceCodeParamEntity.getRegisterAddr(); + String brand = deviceCodeParamEntity.getBrand(); + String buildingId = deviceCodeParamEntity.getBuildingId(); + String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 - deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 - log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName); - if (deviceType.equals("热泵")) { - String strState = nowDataService.selectState(buildingId, deviceAddr); - if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 + log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName); + if (deviceType.equals("热泵")) { + String strState = nowDataService.selectState(buildingId, deviceAddr); + if (strState != null && strState.equals("离线")) { //采集到数据 + nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 + } } - } - try { - if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { - rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { - rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("压变")) { - rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 - analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("水位开关") && (StringUtils.isBlank(registerAddr) || (registerAddr.equals("0018") || registerAddr.equals("0017")))) { - rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("热泵")) { - rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("时控")) { - rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("水位开关") && !StringUtils.isBlank(registerAddr) && registerAddr.equals("0010")) { //热泵状态 - rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("温度变送器")) { - rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("热泵状态")) { - rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); + try { + if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { + rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { + rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("压变")) { + rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 + analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("水位开关") && (StringUtils.isBlank(registerAddr) || (registerAddr.equals("0018") || registerAddr.equals("0017")))) { + rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("热泵")) { + rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("时控")) { + rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("水位开关") && !StringUtils.isBlank(registerAddr) && registerAddr.equals("0010")) { //热泵状态 + rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("温度变送器")) { + rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + } else if (deviceType.equals("热泵状态")) { + rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); + } + } catch (Exception e) { + log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!", e); + SerialTool.closePort(serialPort); + return "fail"; } - } catch (Exception e) { - log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!", e); - SerialTool.closePort(serialPort); + } else { return "fail"; } SerialTool.closePort(serialPort); diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialTool.java b/user-service/src/main/java/com/mh/user/serialport/SerialTool.java index 16d8961..6f12040 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialTool.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialTool.java @@ -1,5 +1,8 @@ package com.mh.user.serialport; +import com.mh.user.constants.Constant; +import com.mh.user.utils.CacheTools; +import com.mh.user.utils.ExchangeStringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import purejavacomm.*; @@ -206,6 +209,9 @@ public class SerialTool { in.read(bytes); bufflenth = in.available(); } + if (bytes == null) { + return null; + } } catch (Exception e) { throw e; } finally { @@ -219,7 +225,6 @@ public class SerialTool { } } - return bytes; } 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 ea43584..2a51123 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 @@ -78,14 +78,13 @@ public class DeviceControlServiceImpl implements DeviceControlService { deviceCodeParam.setParam(param); + deviceCodeParam.setDataValue(serialPortModel.getDataValue());//传入相关参数值 + ControlSetEntity controlData = new ControlSetEntity(); controlData.setBuildingId(deviceInstallEntity.getBuildingId()); // 根据设备类型和参数执行相应的操作 switch (deviceType) { - case "热泵": - rtData = handleHotPump(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); - break; case "时控": rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); break; @@ -105,6 +104,7 @@ public class DeviceControlServiceImpl implements DeviceControlService { rtData = handleElectricMeter(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); break; default: + // 热泵 rtData = handleHotPump(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); break; } @@ -250,17 +250,17 @@ public class DeviceControlServiceImpl implements DeviceControlService { PumpSetEntity pumpData = new PumpSetEntity(); pumpData.setBuildingId(deviceCodeParam.getBuildingId()); pumpData.setPumpId(deviceCodeParam.getDeviceAddr()); - if (StringUtils.isBlank(deviceCodeParam.getParam()) || deviceCodeParam.getParam().equals("温度设定")) { - //发送指令 - if (deviceCodeParam.getBrand().equals("美的")) { - deviceCodeParam.setRegisterAddr("0642"); //寄存器地址 - deviceCodeParam.setFunCode("10"); //功能码写数据 - } else { - deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 - deviceCodeParam.setFunCode("06"); //功能码写数据 - } + if (StringUtils.isBlank(deviceCodeParam.getParam()) || deviceCodeParam.getParam().contains("温度设定")) { //保存数据 if (Constant.READ.equals(type)) { + deviceCodeParam.setFunCode("03"); //功能码读数据 + if (deviceCodeParam.getBrand().equals("美的")) { + deviceCodeParam.setRegisterAddr("0642"); //寄存器地址 + } else if ("瑞星".equals(deviceCodeParam.getBrand())) { + deviceCodeParam.setRegisterAddr("000A"); //寄存器地址 + } else { + deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 + } rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 if (!rtData.equals("fail")) { pumpData.setTempSet(rtData); @@ -268,6 +268,17 @@ public class DeviceControlServiceImpl implements DeviceControlService { } return rtData; } + //发送指令 + if (deviceCodeParam.getBrand().equals("美的")) { + deviceCodeParam.setRegisterAddr("0642"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + } else if (deviceCodeParam.getBrand().equals("瑞星")) { + deviceCodeParam.setRegisterAddr("000A"); //寄存器地址 + deviceCodeParam.setFunCode("10"); //功能码写数据 + } else { + deviceCodeParam.setRegisterAddr("0003"); //寄存器地址 + deviceCodeParam.setFunCode("06"); //功能码写数据 + } pumpData.setTempSet(serialPortModel.getDataValue()); pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 @@ -312,6 +323,8 @@ public class DeviceControlServiceImpl implements DeviceControlService { deviceCodeParam.setFunCode("03"); //功能码读数据 if ("美的".equals(deviceCodeParam.getBrand())) { deviceCodeParam.setRegisterAddr("0007"); //寄存器地址 + } else if ("瑞星".equals(deviceCodeParam.getBrand())) { + deviceCodeParam.setRegisterAddr("0046"); //寄存器地址 } else { deviceCodeParam.setRegisterAddr("0064"); //寄存器地址 } @@ -325,6 +338,8 @@ public class DeviceControlServiceImpl implements DeviceControlService { deviceCodeParam.setFunCode("03"); //功能码读数据 if ("美的".equals(deviceCodeParam.getBrand())) { deviceCodeParam.setRegisterAddr("0641"); //寄存器地址 + } else if ("瑞星".equals(deviceCodeParam.getBrand())) { + deviceCodeParam.setRegisterAddr("0001"); } else { deviceCodeParam.setRegisterAddr("0BBD"); //寄存器地址 } diff --git a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java index 5a37e33..6b835a3 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java @@ -14,6 +14,8 @@ import com.mh.user.service.NowDataService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -263,8 +265,12 @@ public class NowDataServiceImpl implements NowDataService { if (data1!=null){ if (dataType.equals("tempSet")){ //温度设定 data1.setTempSet(strData); - }else if (dataType.equals("waterTemp")){ //水箱水温 - data1.setWaterTemp(strData); + } else if (dataType.equals("waterTemp")){ //水箱水温 + BigDecimal bigDecimal = new BigDecimal(strData); + if (bigDecimal.compareTo(new BigDecimal(0)) >= 0 + && bigDecimal.compareTo(new BigDecimal(100)) <= 0) { + data1.setWaterTemp(strData); + } }else if (dataType.equals("runState")){ //运行状态 data1.setRunState(strData); }else if (dataType.equals("isFault")){ //是否故障 diff --git a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java index ba73850..9758026 100644 --- a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java +++ b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java @@ -589,6 +589,67 @@ public class AnalysisReceiveOrder485 { } else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) { log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); } + } else if (brand.equals("瑞星")) { + if (checkStr.substring(2, 4).equalsIgnoreCase("03")) {//读 + if (registerAddr.equalsIgnoreCase("0001")) { //运行状态 + dataType = "runState"; + data = checkStr.substring(8, 10); + if (data.equalsIgnoreCase("00")) { + sValue = "不运行"; //关机模式 + } else if (data.equalsIgnoreCase("01")) { + sValue = "运行"; //制热模式 + } + //计算热泵运行时间,按分钟 + nowDataService.proPumpMinutes(buildingId, addr, sValue); + log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue); + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); + } else if (registerAddr.equalsIgnoreCase("000A") || registerAddr.equalsIgnoreCase("0046")) { + //000A设定温度,0046水箱水温 + if (registerAddr.equalsIgnoreCase("000A")) { + dataType = "tempSet"; + } else { + dataType = "waterTemp"; + } + //读数 + sValue = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)); + if (dataType.equals("waterTemp")) { + sValue = String.valueOf(Double.parseDouble(sValue)/10); + NowPublicDataEntity publicData = new NowPublicDataEntity(); + publicData.setBuildingId(buildingId); + publicData.setUseWaterTemp(sValue); + publicData.setBackWaterTemp(sValue); + nowPublicDataService.saveNowHistoryPublicData(publicData); + nowDataService.proWaterTemp(dateStr, buildingId, addr); //保存楼栋时间点温度变化 + } else if (dataType.equals("tempSet")) { + pumpSetService.updatePumpSetTemp(sValue, buildingId, addr); //更新设定温度 + } + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); + } else if (registerAddr.equalsIgnoreCase("0050")) { //故障状态 + dataType = "isFault"; + String sData = ExchangeStringUtil.hexString2binaryString(checkStr.substring(8, 10)); + sData = ExchangeStringUtil.addZeroForNum(sData, 8); + if (sData.substring(7, 8).equalsIgnoreCase("0")) { + sValue = "无故障"; + deviceInstallService.updateDeviceFault("0", addr, "热泵"); + } else if (sData.substring(7, 8).equalsIgnoreCase("1")) { + sValue = "有故障"; + deviceInstallService.updateDeviceFault("1", addr, "热泵"); + } + nowDataService.saveNowHistoryData(addr, "热泵", sValue, dataType, buildingId); + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",数据: " + sValue + "保存数据库成功!楼栋名称:" + buildingName); + } else if (registerAddr.equalsIgnoreCase("0028") + || registerAddr.equalsIgnoreCase("002C") + || registerAddr.equalsIgnoreCase("0030")) { //读定时设置值 + String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14); + String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22); + sValue = startTime + closetTime; + } + } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { + log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! "); + } + rtData = sValue; } } else { log.info("热泵报文检验失败: " + receiveData); diff --git a/user-service/src/main/java/com/mh/user/utils/CacheTools.java b/user-service/src/main/java/com/mh/user/utils/CacheTools.java new file mode 100644 index 0000000..45253e2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/utils/CacheTools.java @@ -0,0 +1,79 @@ +package com.mh.user.utils; + + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import io.micrometer.core.instrument.util.StringUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.Objects; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * @author LJF + * @version 1.0 + * @project TAD_Server + * @description 缓存等待数据 + * @date 2023/7/4 08:45:16 + */ +@Slf4j +public class CacheTools { + + /** + * 响应消息缓存 + */ + private static final Cache> responseMsgCache = CacheBuilder.newBuilder() + .maximumSize(500) + .expireAfterWrite(1000, TimeUnit.SECONDS) + .build(); + + + /** + * 等待响应消息 + * + * @param key 消息唯一标识 + * @return ReceiveDdcMsgVo + */ + public static String waitReceiveMsg(String key) { + try { + //设置超时时间 + String vo = Objects.requireNonNull(responseMsgCache.getIfPresent(key)) + .poll(1000 * 5, TimeUnit.MILLISECONDS); + + //删除key + responseMsgCache.invalidate(key); + return vo; + } catch (Exception e) { + log.error("获取数据异常,sn={},msg=null", key); + return ""; + } + + } + + /** + * 初始化响应消息的队列 + * + * @param key 消息唯一标识 + */ + public static void initReceiveMsg(String key) { + responseMsgCache.put(key, new LinkedBlockingQueue(1)); + } + + /** + * 设置响应消息 + * + * @param key 消息唯一标识 + */ + public static void setReceiveMsg(String key, String msg) { + if (!responseMsgCache.asMap().containsKey(key)) { + initReceiveMsg(key); + } + if (responseMsgCache.getIfPresent(key) != null) { + responseMsgCache.getIfPresent(key).add(msg); + return; + } + log.warn("sn {}不存在", key); + } +} diff --git a/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java index 1c65b54..d5cb136 100644 --- a/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java +++ b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java @@ -23,15 +23,15 @@ public class GetReadOrder485 { // 调用service ApplicationContext context = SpringBeanUtil.getApplicationContext(); DeviceDisplayServiceImpl.GatewayManageService gatewayManageService = context.getBean(DeviceDisplayServiceImpl.GatewayManageService.class); - DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); - DeviceCodeParamService deviceCodeParamService=context.getBean(DeviceCodeParamService.class); + DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); + DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); // 电表 - public static String createMeterOrder(DeviceCodeParamEntity orderParamModel){ - String str=""; - String deviceAddr=orderParamModel.getDeviceAddr(); - if (deviceAddr!=null && deviceAddr.length()>0){ - try{ + public static String createMeterOrder(DeviceCodeParamEntity orderParamModel) { + String str = ""; + String deviceAddr = orderParamModel.getDeviceAddr(); + if (deviceAddr != null && deviceAddr.length() > 0) { + try { //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 str = String.format("%012d", Long.parseLong(deviceAddr)); //转换位置 @@ -44,21 +44,21 @@ public class GetReadOrder485 { //检验和 String checkSum = ExchangeStringUtil.makeChecksum(str); str = "FEFEFE" + str + checkSum + "16"; - }catch (Exception e){ - log.error("生成采集电表指令错误==>",e); + } catch (Exception e) { + log.error("生成采集电表指令错误==>", e); } } return str.toUpperCase(); } // 水表 - public static String createWtMeterOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ - if (brand==null || brand.equals("") || brand.equals("艾美柯")){ + public static String createWtMeterOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { + if (brand == null || brand.equals("") || brand.equals("艾美柯")) { // 0 代表前面补充0,14 代表长度为14,d 代表参数为正数型 str = String.format("%014d", Long.parseLong(deviceAddr));//基表通讯号 // 转换位置 @@ -68,14 +68,14 @@ public class GetReadOrder485 { // 检验和 String checkSum = ExchangeStringUtil.makeChecksum(str); str = "FEFEFE" + str + checkSum + "16"; - }else if(brand.equals("脉冲")){ + } else if (brand.equals("脉冲")) { str = ExchangeStringUtil.decToHex(deviceAddr); - str=ExchangeStringUtil.addZeroForNum(str,2); - str=str+"0302020002";//读表累计值 - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = ExchangeStringUtil.addZeroForNum(str, 2); + str = str + "0302020002";//读表累计值 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; } - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); log.error("生成水表采集指令异常>>>>", e); } @@ -84,222 +84,257 @@ public class GetReadOrder485 { } // 热泵,参数:功能码、品牌、数据、通讯表号、寄存器地址 - public static String createPumpOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String funCode=orderParamModel.getFunCode(); - String registerAddr=orderParamModel.getRegisterAddr(); - String dataValue=orderParamModel.getDataValue(); - String str=""; - String param=""; - if(deviceAddr!=null && deviceAddr.length()>0) { - try{ + public static String createPumpOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String funCode = orderParamModel.getFunCode(); + String registerAddr = orderParamModel.getRegisterAddr(); + String dataValue = orderParamModel.getDataValue(); + String str = ""; + String param = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { // 0代表前面补充0,2代表长度为2,d代表参数为正数型 str = ExchangeStringUtil.decToHex(deviceAddr); - str=ExchangeStringUtil.addZeroForNum(str,2); - if (brand==null || brand.equals("") || brand.equals("美的")){ - if (funCode==null || funCode.equals("") || funCode.equals("03")){ - if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0641")){ // 运行状态 - str = str + "0306410001"; - param="运行状态"; - } else if (registerAddr.equalsIgnoreCase("0007")){ // 水温 - str = str + "0300070001"; - param="实际温度"; - } else if (registerAddr.equalsIgnoreCase("000B")){ // 故障状态,100*N+11 - str = str + "03000B0001"; - param="故障状态"; - } else if (registerAddr.equalsIgnoreCase("0642")){ // 读温度设定 - str = str + "0306420001"; - param="设定温度"; - } else if (registerAddr.equalsIgnoreCase("0656")){ //读时段1 - str = str + "0306560004"; - param="时段1"; - } else if (registerAddr.equalsIgnoreCase("065A")){ //读时段2 - str = str + "03065A0004"; - param="时段2"; + str = ExchangeStringUtil.addZeroForNum(str, 2); + if (brand == null || brand.equals("") || brand.equals("美的")) { + if (funCode == null || funCode.equals("") || funCode.equals("03")) { + if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0641")) { // 运行状态 + str = str + "0306410001"; + param = "运行状态"; + } else if (registerAddr.equalsIgnoreCase("0007")) { // 水温 + str = str + "0300070001"; + param = "实际温度"; + } else if (registerAddr.equalsIgnoreCase("000B")) { // 故障状态,100*N+11 + str = str + "03000B0001"; + param = "故障状态"; + } else if (registerAddr.equalsIgnoreCase("0642")) { // 读温度设定 + str = str + "0306420001"; + param = "设定温度"; + } else if (registerAddr.equalsIgnoreCase("0656")) { //读时段1 + str = str + "0306560004"; + param = "时段1"; + } else if (registerAddr.equalsIgnoreCase("065A")) { //读时段2 + str = str + "03065A0004"; + param = "时段2"; } - }else{//10 - if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0642")){//温度设定,写 - str = str + "100642000102"+ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)),4); //写,待测试 - }else if(registerAddr.equalsIgnoreCase("0656")){//时段1 - if(dataValue.length()==8){ - String strData="00"+dataValue.substring(0,2)+"00"+dataValue.substring(2,4)+"00"+dataValue.substring(4,6)+"00"+dataValue.substring(6,8); - str = str + "100656000408"+strData; //写 + } else {//10 + if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0642")) {//温度设定,写 + str = str + "100642000102" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试 + } else if (registerAddr.equalsIgnoreCase("0656")) {//时段1 + if (dataValue.length() == 8) { + String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8); + str = str + "100656000408" + strData; //写 } - }else if(registerAddr.equalsIgnoreCase("065A")){//时段2 - if(dataValue.length()==8){ - String strData="00"+dataValue.substring(0,2)+"00"+dataValue.substring(2,4)+"00"+dataValue.substring(4,6)+"00"+dataValue.substring(6,8); - str = str + "10065A000408"+strData; //写 + } else if (registerAddr.equalsIgnoreCase("065A")) {//时段2 + if (dataValue.length() == 8) { + String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8); + str = str + "10065A000408" + strData; //写 } } } - }else if(brand.equals("美的2")){ - if (funCode==null || funCode.equals("") || funCode.equals("03")){ - if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0BBD")){ // 运行状态 - str = str + "030BBD0001"; - param="运行状态"; - } else if (registerAddr.equalsIgnoreCase("0064")){ // 水温 - str = str + "0300640001"; - param="实际温度"; - } else if (registerAddr.equalsIgnoreCase("0BBB")){ // 故障状态 - str = str + "030BBB0001"; - param="故障状态"; - } else if (registerAddr.equalsIgnoreCase("0003")){ // 读温度设定 - str = str + "0300030001"; - param="设定温度"; + } else if (brand.equals("美的2")) { + if (funCode == null || funCode.equals("") || funCode.equals("03")) { + if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0BBD")) { // 运行状态 + str = str + "030BBD0001"; + param = "运行状态"; + } else if (registerAddr.equalsIgnoreCase("0064")) { // 水温 + str = str + "0300640001"; + param = "实际温度"; + } else if (registerAddr.equalsIgnoreCase("0BBB")) { // 故障状态 + str = str + "030BBB0001"; + param = "故障状态"; + } else if (registerAddr.equalsIgnoreCase("0003")) { // 读温度设定 + str = str + "0300030001"; + param = "设定温度"; } - }else{//06 - if (registerAddr==null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0003")){//温度设定,写 - str = str + "060003"+ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)),4); //写,待测试 - }else if(registerAddr.equals("0000")) {//开关机 - if(dataValue.equals("0000")){ - str = str + "0600000000"; //关机 - }else{ - str = str + "0600000003"; //制热水,开机 + } else {//06 + if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0003")) {//温度设定,写 + str = str + "060003" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试 + } else if (registerAddr.equals("0000")) {//开关机 + if (dataValue.equals("0000")) { + str = str + "0600000000"; //关机 + } else { + str = str + "0600000003"; //制热水,开机 + } + } + } + } else if (brand.equals("瑞星")) { + if (funCode == null || funCode.equals("") || funCode.equals("03")) { + if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("0001")) { // 运行状态 + str = str + "0300010001"; + param = "运行状态"; + } else if (registerAddr.equalsIgnoreCase("0046")) { // 水温 + str = str + "0300460001"; + param = "实际温度"; + } else if (registerAddr.equalsIgnoreCase("0050")) { // 故障状态,100*N+11 + str = str + "0300500001"; + param = "故障状态"; + } else if (registerAddr.equalsIgnoreCase("000A")) { // 读温度设定 + str = str + "03000A0001"; + param = "设定温度"; + } else if (registerAddr.equalsIgnoreCase("0028")) { //读时段1 + str = str + "0300280004"; + param = "时段1"; + } else if (registerAddr.equalsIgnoreCase("002C")) { //读时段2 + str = str + "03002C0004"; + param = "时段2"; + } + } else {//10 + if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("000A")) {//温度设定,写 + str = str + "10000A000102" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试 + } else if (registerAddr.equalsIgnoreCase("0028")) {//时段1 + if (dataValue.length() == 8) { + String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8); + str = str + "100028000408" + strData; //写 + } + } else if (registerAddr.equalsIgnoreCase("002C")) {//时段2 + if (dataValue.length() == 8) { + String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8); + str = str + "10002C000408" + strData; //写 } } } } - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; - }catch (Exception e){ - log.info("热泵"+param+"指令>>>>异常" + str, e); + } catch (Exception e) { + log.info("热泵" + param + "指令>>>>异常" + str, e); } } - log.info("热泵"+param+"指令>>>>" + str); + log.info("热泵" + param + "指令>>>>" + str); return str.toUpperCase(); } // 水位开关(水位设定) - public static String createRelayOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String funCode=orderParamModel.getFunCode(); - String registerAddr=orderParamModel.getRegisterAddr(); - String dataValue=orderParamModel.getDataValue(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ - if (brand==null || brand.equals("") || brand.equals("中凯")) - { + public static String createRelayOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String funCode = orderParamModel.getFunCode(); + String registerAddr = orderParamModel.getRegisterAddr(); + String dataValue = orderParamModel.getDataValue(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { + if (brand == null || brand.equals("") || brand.equals("中凯")) { str = ExchangeStringUtil.decToHex(deviceAddr); - str=ExchangeStringUtil.addZeroForNum(str,2); - if (funCode==null || funCode.equals("") || funCode.equals("17")){ //读 - str ="33"+ str + "1700000000"; //旧版继电器 - }else if (funCode.equals("12")){//写 - if (dataValue!=null && !dataValue.equals("")){ + str = ExchangeStringUtil.addZeroForNum(str, 2); + if (funCode == null || funCode.equals("") || funCode.equals("17")) { //读 + str = "33" + str + "1700000000"; //旧版继电器 + } else if (funCode.equals("12")) {//写 + if (dataValue != null && !dataValue.equals("")) { //0001(90%) 0002(80%) 0003(70%)... - if (dataValue.equals("100%")){ - registerAddr="1300000000"; //全开 - }else if (dataValue.equals("90%")){ - registerAddr="1200000001"; - }else if(dataValue.equals("80%")){ - registerAddr="1200000002"; - }else if(dataValue.equals("70%")){ - registerAddr="1200000003"; - }else if(dataValue.equals("60%")){ - registerAddr="1200000004"; - }else if(dataValue.equals("50%")){ - registerAddr="1200000005"; - }else if(dataValue.equals("40%")){ - registerAddr="1200000006"; + if (dataValue.equals("100%")) { + registerAddr = "1300000000"; //全开 + } else if (dataValue.equals("90%")) { + registerAddr = "1200000001"; + } else if (dataValue.equals("80%")) { + registerAddr = "1200000002"; + } else if (dataValue.equals("70%")) { + registerAddr = "1200000003"; + } else if (dataValue.equals("60%")) { + registerAddr = "1200000004"; + } else if (dataValue.equals("50%")) { + registerAddr = "1200000005"; + } else if (dataValue.equals("40%")) { + registerAddr = "1200000006"; } - str ="33"+ str+registerAddr; //示例:33011200000001 + str = "33" + str + registerAddr; //示例:33011200000001 } - }else if (funCode.equals("13")) {//写 - str ="33"+ str + "1300000000"; //全开 - }else { - str ="33"+ str + "1400000000"; //全合 + } else if (funCode.equals("13")) {//写 + str = "33" + str + "1300000000"; //全开 + } else { + str = "33" + str + "1400000000"; //全合 } // 检验和 String checkSum = ExchangeStringUtil.makeChecksum(str); - str = str + checkSum ; + str = str + checkSum; - } else if (brand.equals("远向")){ + } else if (brand.equals("远向")) { str = ExchangeStringUtil.decToHex(deviceAddr); - str=ExchangeStringUtil.addZeroForNum(str,2); - if (funCode==null || funCode.equals("") || funCode.equals("03")){//读 - if (registerAddr.equalsIgnoreCase("0018")){ //读全部位置 - str = str + "0300180008"; - } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI - str = str + "0300100008"; + str = ExchangeStringUtil.addZeroForNum(str, 2); + if (funCode == null || funCode.equals("") || funCode.equals("03")) {//读 + if (registerAddr.equalsIgnoreCase("0018")) { //读全部位置 + str = str + "0300180008"; + } else if (registerAddr.equalsIgnoreCase("0010")) { //读全部DI + str = str + "0300100008"; } - }else if (funCode.equals("06")){ // 写 - if (dataValue!=null && !dataValue.equals("")){ - if (dataValue.equals("100%")){ - registerAddr="10001800081000000000000000000000000000000000"; //全开 - }else if (dataValue.equals("90%")){ - registerAddr="0600180001"; - }else if(dataValue.equals("80%")){ - registerAddr="0600190001"; - }else if(dataValue.equals("70%")){ - registerAddr="06001A0001"; - }else if(dataValue.equals("60%")){ - registerAddr="06001B0001"; - }else if(dataValue.equals("50%")){ - registerAddr="06001C0001"; - }else if(dataValue.equals("40%")){ - registerAddr="06001D0001"; + } else if (funCode.equals("06")) { // 写 + if (dataValue != null && !dataValue.equals("")) { + if (dataValue.equals("100%")) { + registerAddr = "10001800081000000000000000000000000000000000"; //全开 + } else if (dataValue.equals("90%")) { + registerAddr = "0600180001"; + } else if (dataValue.equals("80%")) { + registerAddr = "0600190001"; + } else if (dataValue.equals("70%")) { + registerAddr = "06001A0001"; + } else if (dataValue.equals("60%")) { + registerAddr = "06001B0001"; + } else if (dataValue.equals("50%")) { + registerAddr = "06001C0001"; + } else if (dataValue.equals("40%")) { + registerAddr = "06001D0001"; } //0018(90%) 0019(80%) 001A(70%)... - str = str +registerAddr; //示例:010600180001 + str = str + registerAddr; //示例:010600180001 } - }else {//写 - if (dataValue.equals("0000")){ + } else {//写 + if (dataValue.equals("0000")) { str = str + "10001800081000000000000000000000000000000000"; //全开 - }else{ + } else { str = str + "10001800081000010001000100010001000100010001"; //全合 } } - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; - }else if (brand.equals("顶威")){ + } else if (brand.equals("顶威")) { str = String.format("%012d", Long.parseLong(deviceAddr)); //转换位置 str = ExchangeStringUtil.changePosition(str); //表号 - String strData=""; - if (funCode.equals("0407")){//写 - str ="68"+str+"680407"; - String mark="25C0"; //C025交换位置 - String strData1="00000000"; //命令带密码4字节,权限密码默认为00000000 - String strData2=""; - if (dataValue.equals("100%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00000000"); - }else if(dataValue.equals("90%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00000001"); - }else if(dataValue.equals("85%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00000011"); - }else if(dataValue.equals("80%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00000111"); - }else if(dataValue.equals("75%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00001111"); - }else if(dataValue.equals("70%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00011111"); - }else if(dataValue.equals("65%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00111111"); - }else if(dataValue.equals("60%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("01111111"); - }else if(dataValue.equals("50%")){ - strData2=ExchangeStringUtil.parseByte2HexStr("11111111"); - }else if(dataValue.equals("自动")){ - strData2=ExchangeStringUtil.parseByte2HexStr("00100110"); + String strData = ""; + if (funCode.equals("0407")) {//写 + str = "68" + str + "680407"; + String mark = "25C0"; //C025交换位置 + String strData1 = "00000000"; //命令带密码4字节,权限密码默认为00000000 + String strData2 = ""; + if (dataValue.equals("100%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00000000"); + } else if (dataValue.equals("90%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00000001"); + } else if (dataValue.equals("85%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00000011"); + } else if (dataValue.equals("80%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00000111"); + } else if (dataValue.equals("75%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00001111"); + } else if (dataValue.equals("70%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00011111"); + } else if (dataValue.equals("65%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00111111"); + } else if (dataValue.equals("60%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("01111111"); + } else if (dataValue.equals("50%")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("11111111"); + } else if (dataValue.equals("自动")) { + strData2 = ExchangeStringUtil.parseByte2HexStr("00100110"); } - strData=mark+strData1+strData2; - }else if (funCode.equals("0102")){ //读 - str ="68"+str+"680102"; - strData="25C0"; //标志 + strData = mark + strData1 + strData2; + } else if (funCode.equals("0102")) { //读 + str = "68" + str + "680102"; + strData = "25C0"; //标志 } - strData=ExchangeStringUtil.addThree(strData); //加33 - str=str+strData; + strData = ExchangeStringUtil.addThree(strData); //加33 + str = str + strData; //检验和 String checkSum = ExchangeStringUtil.makeChecksum(str);//校验 str = "FEFEFE" + str + checkSum + "16"; } - }catch (Exception e){ + } catch (Exception e) { // e.printStackTrace(); - if(registerAddr.equals("0010")){ + if (registerAddr.equals("0010")) { log.error("生成热泵状态指令出错!" + str); - }else{ + } else { log.error("生成水位开关指令出错!" + str); } } @@ -314,52 +349,51 @@ public class GetReadOrder485 { } // 热泵状态(8路开关) - public static String createPumpStateOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String funCode=orderParamModel.getFunCode(); - String registerAddr=orderParamModel.getRegisterAddr(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ - if (brand==null || brand.equals("") || brand.equals("中凯")) - { + public static String createPumpStateOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String funCode = orderParamModel.getFunCode(); + String registerAddr = orderParamModel.getRegisterAddr(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { + if (brand == null || brand.equals("") || brand.equals("中凯")) { str = ExchangeStringUtil.decToHex(deviceAddr); - str=ExchangeStringUtil.addZeroForNum(str,2); + str = ExchangeStringUtil.addZeroForNum(str, 2); //if (funCode==null || funCode.equals("") || funCode.equals("17")){ //读 - str ="33"+ str + "1700000000"; //旧版继电器 + str = "33" + str + "1700000000"; //旧版继电器 //} // 检验和 String checkSum = ExchangeStringUtil.makeChecksum(str); - str = str + checkSum ; - } else if (brand.equals("远向")){ + str = str + checkSum; + } else if (brand.equals("远向")) { str = ExchangeStringUtil.decToHex(deviceAddr); - str=ExchangeStringUtil.addZeroForNum(str,2); + str = ExchangeStringUtil.addZeroForNum(str, 2); //if (funCode==null || funCode.equals("") || funCode.equals("03")){//读 - //if (registerAddr.equalsIgnoreCase("0018")){ //读全部DO - // str = str + "0300180008"; - // } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI - str = str + "0300100008"; - //} + //if (registerAddr.equalsIgnoreCase("0018")){ //读全部DO + // str = str + "0300180008"; + // } else if (registerAddr.equalsIgnoreCase("0010")){ //读全部DI + str = str + "0300100008"; //} - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + //} + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; - }else if (brand.equals("顶威")){ + } else if (brand.equals("顶威")) { str = String.format("%012d", Long.parseLong(deviceAddr)); //转换位置 str = ExchangeStringUtil.changePosition(str); //表号 - String strData=""; - // if (funCode.equals("0102")){ //读 - str ="68"+str+"680102"; - strData="25C0"; //标志 - // } - strData=ExchangeStringUtil.addThree(strData); //加33 - str=str+strData; + String strData = ""; + // if (funCode.equals("0102")){ //读 + str = "68" + str + "680102"; + strData = "25C0"; //标志 + // } + strData = ExchangeStringUtil.addThree(strData); //加33 + str = str + strData; //检验和 String checkSum = ExchangeStringUtil.makeChecksum(str);//校验 str = "FEFEFE" + str + checkSum + "16"; } - }catch (Exception e){ + } catch (Exception e) { // e.printStackTrace(); log.error("生成热泵状态指令出错!" + str, e); } @@ -369,12 +403,12 @@ public class GetReadOrder485 { } //状态检测 - public static String createStateOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ + public static String createStateOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { // 0代表前面补充0,12代表长度为12,d代表参数为正数型.12位通讯地址,以0补位 str = String.format("%012d", Long.parseLong(deviceAddr)); // 转换位置 @@ -388,33 +422,33 @@ public class GetReadOrder485 { String checkSum = ExchangeStringUtil.makeChecksum(str); str = "FEFEFE" + str + checkSum + "16"; - }catch (Exception e){ + } catch (Exception e) { // e.printStackTrace(); - log.error("生成状态检测指令出错!" + str,e); + log.error("生成状态检测指令出错!" + str, e); } } return str.toUpperCase(); } // 压变 - public static String createPressureOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ + public static String createPressureOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { str = ExchangeStringUtil.decToHex(deviceAddr); //十进制转为十六进制 str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 - if (brand==null || brand.equals("")){ - str = str + "0300000002"; // 压力变送器(新的协议) - }else if (brand.equals("澳升")){ - str = str + "0300040001"; // 新款压力变送器 - }else if (brand.equals("汝翊")){ - str = str + "0300040001"; + if (brand == null || brand.equals("")) { + str = str + "0300000002"; // 压力变送器(新的协议) + } else if (brand.equals("澳升")) { + str = str + "0300040001"; // 新款压力变送器 + } else if (brand.equals("汝翊")) { + str = str + "0300040001"; } - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; - }catch (Exception e){ + } catch (Exception e) { log.info("生成压变指令出错!" + str, e); } } @@ -422,12 +456,12 @@ public class GetReadOrder485 { } // 温控 - public static String createTempOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String registerAddr=orderParamModel.getRegisterAddr(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ + public static String createTempOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String registerAddr = orderParamModel.getRegisterAddr(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { str = ExchangeStringUtil.decToHex(deviceAddr); str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 // if(registerAddr.equals("")){ @@ -435,10 +469,10 @@ public class GetReadOrder485 { // }else if(registerAddr.equals("")){ // str=str+"0300000002"; // } - str=str+"0300000002"; - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + "0300000002"; + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; - }catch (Exception e){ + } catch (Exception e) { // e.printStackTrace(); log.error("生成温控指令出错!" + str, e); } @@ -447,18 +481,18 @@ public class GetReadOrder485 { } // 温度变送器 - public static String createMulTempOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String registerAddr=orderParamModel.getRegisterAddr(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ - try{ + public static String createMulTempOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String registerAddr = orderParamModel.getRegisterAddr(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { + try { str = ExchangeStringUtil.decToHex(deviceAddr); str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 - str=str+"0300280008"; //读8路温度 - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + str = str + "0300280008"; //读8路温度 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; - }catch (Exception e){ + } catch (Exception e) { log.info("生成多路温度变送器指令出错!" + str, e); } } @@ -466,34 +500,34 @@ public class GetReadOrder485 { } //时控设置,registerAddr 0009(L1)、000D(L2)、0011(L3) 读:010300090004、写:01100009000408+dataValue - public static String createTimeSetOrder(DeviceCodeParamEntity orderParamModel){ - String deviceAddr=orderParamModel.getDeviceAddr(); - String brand=orderParamModel.getBrand(); - String funCode=orderParamModel.getFunCode(); - String registerAddr=orderParamModel.getRegisterAddr(); - String dataValue=orderParamModel.getDataValue(); - String str=""; - if(deviceAddr!=null && deviceAddr.length()>0){ + public static String createTimeSetOrder(DeviceCodeParamEntity orderParamModel) { + String deviceAddr = orderParamModel.getDeviceAddr(); + String brand = orderParamModel.getBrand(); + String funCode = orderParamModel.getFunCode(); + String registerAddr = orderParamModel.getRegisterAddr(); + String dataValue = orderParamModel.getDataValue(); + String str = ""; + if (deviceAddr != null && deviceAddr.length() > 0) { str = ExchangeStringUtil.decToHex(deviceAddr); str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 - try{ + try { // if (!brand.equals("")){ //品牌 - if (!funCode.equals("") && !registerAddr.equals("")){ - registerAddr=ExchangeStringUtil.addZeroForNum(registerAddr,4); //寄存器地址 - funCode=ExchangeStringUtil.addZeroForNum(funCode,2); // 功能码 - - if (funCode.equals("03")){ //功能码,读 - str = str + "03"+registerAddr +"0004"; - }else if (funCode.equals("10")){//写 - if (!dataValue.equals("")){ - str = str + "10"+registerAddr +"000408"+dataValue; + if (!funCode.equals("") && !registerAddr.equals("")) { + registerAddr = ExchangeStringUtil.addZeroForNum(registerAddr, 4); //寄存器地址 + funCode = ExchangeStringUtil.addZeroForNum(funCode, 2); // 功能码 + + if (funCode.equals("03")) { //功能码,读 + str = str + "03" + registerAddr + "0004"; + } else if (funCode.equals("10")) {//写 + if (!dataValue.equals("")) { + str = str + "10" + registerAddr + "000408" + dataValue; } } } - String checkWord=ExchangeStringUtil.getStrCRC16(str); //CRC16校验 + String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; // } - }catch (Exception e){ + } catch (Exception e) { log.error("生成时控指令出错!" + str, e); } } @@ -501,30 +535,30 @@ public class GetReadOrder485 { } // 冷量计 - public static String createCloudOrder(String IP,String port, String dataCom,String cloudNum, String cloudType){ + public static String createCloudOrder(String IP, String port, String dataCom, String cloudNum, String cloudType) { IP = ExchangeStringUtil.ipToHex(IP); - port = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(port),4); - dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(ExchangeStringUtil.getNumFromString(dataCom)),2); + port = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(port), 4); + dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(ExchangeStringUtil.getNumFromString(dataCom)), 2); String str1 = IP + port + dataCom; // 0 代表前面补充0,2 代表长度为2,d 代表参数为正数型 String str = ExchangeStringUtil.decToHex(cloudNum); str = String.format("%02d", Long.parseLong(str)); - if (cloudType.equalsIgnoreCase("4")){ //温控设备,地址为十六进制 - str = str + "0300000002"; - } else if (cloudType.equalsIgnoreCase("31")){ //流量计冷冻水量 - str = str + "0300080002"; - } else if (cloudType.equalsIgnoreCase("32")){ // 流量计出水温度 - str = str + "0300490002"; - } else if (cloudType.equalsIgnoreCase("33")){ // 流量计回水温度 - str = str + "03004B0002"; - } else if (cloudType.equalsIgnoreCase("34")){ // 流量计冷量累积量 - str = str + "0300500002"; + if (cloudType.equalsIgnoreCase("4")) { //温控设备,地址为十六进制 + str = str + "0300000002"; + } else if (cloudType.equalsIgnoreCase("31")) { //流量计冷冻水量 + str = str + "0300080002"; + } else if (cloudType.equalsIgnoreCase("32")) { // 流量计出水温度 + str = str + "0300490002"; + } else if (cloudType.equalsIgnoreCase("33")) { // 流量计回水温度 + str = str + "03004B0002"; + } else if (cloudType.equalsIgnoreCase("34")) { // 流量计冷量累积量 + str = str + "0300500002"; } byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); - checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); - checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); str = str + checkWord; // 拼接字符 str = str1 + str; @@ -534,6 +568,7 @@ public class GetReadOrder485 { /** * // 冷水机组 指令:IP+端口+COM口+数据+modeBus校验 + * * @param chillersEntity * @return */ @@ -548,11 +583,11 @@ public class GetReadOrder485 { // 获取端口号,转16进制 int port = chillersEntity.getPort(); String portStr = ExchangeStringUtil.decToHex(String.valueOf(port)); - portStr = ExchangeStringUtil.addZeroForNum(portStr,4); + portStr = ExchangeStringUtil.addZeroForNum(portStr, 4); str += portStr; // 获取COM口 String com = ExchangeStringUtil.getNumFromString(chillersEntity.getDataCom()); - String dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(com),2); + String dataCom = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(com), 2); str += dataCom; // 获取冷水机组地址 String chillerAddr = chillersEntity.getCollectionNum(); @@ -560,16 +595,16 @@ public class GetReadOrder485 { String str1 = ExchangeStringUtil.addZeroForNum(chillerAddr, 2); // 获取功能码 String funCode = chillersEntity.getFunCode(); - str1 = str1 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(funCode),2); + str1 = str1 + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(funCode), 2); // 寄存器地址 String registerAddr = chillersEntity.getRegisterAddress(); - str1 = str1 + ExchangeStringUtil.addZeroForNum(registerAddr,4) + "0001"; + str1 = str1 + ExchangeStringUtil.addZeroForNum(registerAddr, 4) + "0001"; log.info(str1); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(str1); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); - checkWord = ExchangeStringUtil.addZeroForNum(checkWord,4); - checkWord = checkWord.substring(2,4) + checkWord.substring(0,2); + checkWord = ExchangeStringUtil.addZeroForNum(checkWord, 4); + checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); str1 = str1 + checkWord; // 拼接新的采集报文 str = str + str1; @@ -599,59 +634,59 @@ public class GetReadOrder485 { } // 生成对设备操作指令参数 - public void createOrderParam(){ + public void createOrderParam() { List deviceList1; deviceCodeParamService.selectInsertDeviceCodeParam(); //查询插入设备采集参数,包括压变、温控、温度变送器、热泵状态 - deviceList1=deviceInstallService.selectDeviceParams();//查找多个采集参数的设备,包括热泵 + deviceList1 = deviceInstallService.selectDeviceParams();//查找多个采集参数的设备,包括热泵 System.out.println(deviceList1); - for (DeviceInstallEntity devices:deviceList1) { + for (DeviceInstallEntity devices : deviceList1) { List deviceCodeParamEntityList = new ArrayList<>(); - if (devices.getDeviceType().equals("热泵")){ - if (devices.getBrand().equals("美的")){ - - DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity(); - deviceCodeParamEntity3.setRegisterAddr("0007");//水温 - deviceCodeParamEntity3.setFunCode("03"); - deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr()); - deviceCodeParamEntity3.setDeviceName(devices.getDeviceName()); - deviceCodeParamEntity3.setDeviceType(devices.getDeviceType()); - deviceCodeParamEntity3.setBaudrate(devices.getBaudRate()); - deviceCodeParamEntity3.setBrand(devices.getBrand()); - deviceCodeParamEntity3.setDataCom(devices.getDataCom()); - deviceCodeParamEntity3.setBuildingId(devices.getBuildingId()); - deviceCodeParamEntity3.setParity(devices.getParity()); - deviceCodeParamEntityList.add(deviceCodeParamEntity3); - - }else if (devices.getBrand().equals("美的2")){ - - DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity(); - deviceCodeParamEntity3.setRegisterAddr("0064");//水温 - deviceCodeParamEntity3.setFunCode("03"); - deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr()); - deviceCodeParamEntity3.setDeviceName(devices.getDeviceName()); - deviceCodeParamEntity3.setDeviceType(devices.getDeviceType()); - deviceCodeParamEntity3.setBaudrate(devices.getBaudRate()); - deviceCodeParamEntity3.setBrand(devices.getBrand()); - deviceCodeParamEntity3.setDataCom(devices.getDataCom()); - deviceCodeParamEntity3.setBuildingId(devices.getBuildingId()); - deviceCodeParamEntity3.setParity(devices.getParity()); - deviceCodeParamEntityList.add(deviceCodeParamEntity3); - } + if (devices.getDeviceType().equals("热泵")) { + if (devices.getBrand().equals("美的")) { + + DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity(); + deviceCodeParamEntity3.setRegisterAddr("0007");//水温 + deviceCodeParamEntity3.setFunCode("03"); + deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity3.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity3.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity3.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity3.setBrand(devices.getBrand()); + deviceCodeParamEntity3.setDataCom(devices.getDataCom()); + deviceCodeParamEntity3.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity3.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity3); + + } else if (devices.getBrand().equals("美的2")) { + + DeviceCodeParamEntity deviceCodeParamEntity3 = new DeviceCodeParamEntity(); + deviceCodeParamEntity3.setRegisterAddr("0064");//水温 + deviceCodeParamEntity3.setFunCode("03"); + deviceCodeParamEntity3.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity3.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity3.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity3.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity3.setBrand(devices.getBrand()); + deviceCodeParamEntity3.setDataCom(devices.getDataCom()); + deviceCodeParamEntity3.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity3.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity3); + } } deviceCodeParamService.insertDeviceCodeParamList(deviceCodeParamEntityList); } } // 生成对设备操作指令参数 - public void createOrderParam2(){ + public void createOrderParam2() { List deviceList1; deviceCodeParamService.selectInsertDeviceCodeParam2(); //查询插入设备采集参数,包括水、电表、状态检测 - deviceList1=deviceInstallService.selectDeviceParams(); //查找多个采集参数的设备,包括热泵 + deviceList1 = deviceInstallService.selectDeviceParams(); //查找多个采集参数的设备,包括热泵 System.out.println(deviceList1); - for (DeviceInstallEntity devices:deviceList1) { + for (DeviceInstallEntity devices : deviceList1) { List deviceCodeParamEntityList = new ArrayList<>(); if (devices.getDeviceType().equals("热泵")) { if (devices.getBrand().equals("美的")) { @@ -687,16 +722,16 @@ public class GetReadOrder485 { } // 生成对设备操作指令参数 - public void createOrderParam3(){ + public void createOrderParam3() { List deviceList1; // deviceCodeParamService.selectInsertDeviceCodeParam3(); //查询插入设备采集参数-水位开关 - deviceList1=deviceInstallService.selectDeviceParams2(); //查找多个采集参数的设备,包括热泵、水位开关 + deviceList1 = deviceInstallService.selectDeviceParams2(); //查找多个采集参数的设备,包括热泵、水位开关 System.out.println(deviceList1); - for (DeviceInstallEntity devices:deviceList1) { + for (DeviceInstallEntity devices : deviceList1) { List deviceCodeParamEntityList = new ArrayList<>(); - if (devices.getDeviceType().equals("热泵")){ - if (devices.getBrand().equals("美的")){ + if (devices.getDeviceType().equals("热泵")) { + if (devices.getBrand().equals("美的")) { DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); deviceCodeParamEntity2.setRegisterAddr("0642");//设定温度 deviceCodeParamEntity2.setFunCode("03"); @@ -723,7 +758,7 @@ public class GetReadOrder485 { deviceCodeParamEntity4.setParity(devices.getParity()); deviceCodeParamEntityList.add(deviceCodeParamEntity4); - }else if (devices.getBrand().equals("美的2")){ + } else if (devices.getBrand().equals("美的2")) { DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); deviceCodeParamEntity2.setRegisterAddr("0003");//设定温度 @@ -751,8 +786,9 @@ public class GetReadOrder485 { deviceCodeParamEntity4.setParity(devices.getParity()); deviceCodeParamEntityList.add(deviceCodeParamEntity4); } - } if (devices.getDeviceType().equals("水位开关")){ - if (devices.getBrand().equals("远向")){ + } + if (devices.getDeviceType().equals("水位开关")) { + if (devices.getBrand().equals("远向")) { DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); deviceCodeParamEntity2.setRegisterAddr("0018");//读水位设定 deviceCodeParamEntity2.setFunCode("03"); @@ -778,7 +814,7 @@ public class GetReadOrder485 { deviceCodeParamEntity4.setBuildingId(devices.getBuildingId()); deviceCodeParamEntity4.setParity(devices.getParity()); deviceCodeParamEntityList.add(deviceCodeParamEntity4); - }else if (devices.getBrand().equals("中凯")){ + } else if (devices.getBrand().equals("中凯")) { DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); deviceCodeParamEntity2.setRegisterAddr("0017");//读水位设定 deviceCodeParamEntity2.setFunCode("03");