package com.mh.common.utils; import com.mh.common.core.domain.entity.CollectionParamsManage; import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @author ljf * @title : * @description : 解析485接收的数据 * @updateTime 2020-04-23 * @throws : */ @Slf4j public class AnalysisReceiveOrder485 { // 调用service private final SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private final DecimalFormat df = new DecimalFormat("#.##"); //解析冷量表 public void analysisCloudOrder485(final String dataStr1, final CollectionParamsManage deviceCodeParam) { // 去掉空格 String dataStr = dataStr1.replace(" ", "").toUpperCase(); // 检验报文 String checkStr = dataStr.substring(0, dataStr.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 Date date = new Date(); String dateStr = sdf1.format(date); ; //保留两位小数处理 DecimalFormat decimalFormat = new DecimalFormat("0.00"); // 表号 String cloudId = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); // 读数 String data = ""; data = dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4) + dataStr.substring(dataStr.length() - 12, dataStr.length() - 10) + dataStr.substring(dataStr.length() - 10, dataStr.length() - 8); String registerAddr = deviceCodeParam.getRegisterAddr(); if (ExchangeStringUtil.isInDate(date, "00:00:00", "00:00:30")) { dateStr = dateStr.substring(0, 17) + "00"; } else if (ExchangeStringUtil.isInDate(date, "00:00:30", "00:00:59")) { dateStr = dateStr.substring(0, 17) + "30"; } try { if (registerAddr.equals("32") || registerAddr.equals("33") || registerAddr.equals("35") || registerAddr.equals("36")) { data = decimalFormat.format(Math.abs(ExchangeStringUtil.hexToSingle(data)));//十六进制字符串转IEEE754浮点型 log.info("冷量计==>{},寄存器地址==>{},读数==>{}", cloudId, registerAddr, data); } else if (registerAddr.equals("31") || registerAddr.equals("34")) { long lData = Long.parseLong(ExchangeStringUtil.hexToDec(data)); log.info("冷量计==>{},寄存器地址==>{},累计读数==>{}", cloudId, registerAddr, lData); } } catch (Exception e) { log.error("保存冷量计数据失败!", e); } } else { log.info("冷量计校验失败===>{}", dataStr); } } /** * 解析水表返回的数据 * * @param dataStr1 */ public String analysisWaterOrder485(final String dataStr1, final CollectionParamsManage deviceCodeParam) { // 去掉空格 String dataStr = dataStr1.replace(" ", "").toUpperCase(); // 检验报文 String checkStr = dataStr.substring(0, dataStr.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 Date date = new Date(); String dateStr = sdf1.format(date); ; //保留两位小数处理 DecimalFormat decimalFormat = new DecimalFormat("0.00"); // 表号 String cloudId = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); // 读数 String data = ""; data = dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4) + dataStr.substring(dataStr.length() - 12, dataStr.length() - 10) + dataStr.substring(dataStr.length() - 10, dataStr.length() - 8); int dataType = deviceCodeParam.getDataType(); if (ExchangeStringUtil.isInDate(date, "00:00:00", "00:00:30")) { dateStr = dateStr.substring(0, 17) + "00"; System.out.println("插入时间00" + dateStr); } else if (ExchangeStringUtil.isInDate(date, "00:00:30", "00:00:59")) { dateStr = dateStr.substring(0, 17) + "30"; System.out.println("插入时间30" + dateStr); } try { if (dataType == 3) { data = decimalFormat.format(Math.abs(ExchangeStringUtil.hexToSingle(data)));//十六进制字符串转IEEE754浮点型 log.info("水表==>{},寄存器地址==>{},读数==>{}", cloudId, deviceCodeParam.getRegisterAddr(), data); } else if (dataType == 2) { data = dataStr.substring(dataStr.length() - 12, dataStr.length() - 10) + dataStr.substring(dataStr.length() - 10, dataStr.length() - 8) + dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4); data = ExchangeStringUtil.hexToDec(data); BigDecimal bigDecimal = new BigDecimal(data); bigDecimal = bigDecimal.divide(new BigDecimal((int) Math.pow(10, deviceCodeParam.getDigits()))).setScale(2, RoundingMode.HALF_UP); // 除以1000并保留整数 data = bigDecimal.toString(); log.info("水表==>{},寄存器地址==>{},累计读数==>{}", cloudId, deviceCodeParam.getRegisterAddr(), data); } // 判断data大于99999999,就返回空 if (new BigDecimal(data).intValue() > 99999999) { return ""; } return data; } catch (Exception e) { log.error("保存水表数据失败!", e); } } else { log.info("水表===>{}", dataStr); return ""; } return ""; } /** * 解析电表返回的数据 * * @param dataStr1 */ public String analysisMeterOrder485(final String dataStr1, final CollectionParamsManage deviceCodeParam) { // 去掉空格 String dataStr = dataStr1.replace(" ", "").toUpperCase(); // 检验报文 String checkStr = dataStr.substring(0, dataStr.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 Date date = new Date(); String dateStr = sdf1.format(date); ; //保留两位小数处理 DecimalFormat decimalFormat = new DecimalFormat("0.00"); // 表号 String cloudId = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); // 读数 String data = ""; data = dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4) + dataStr.substring(dataStr.length() - 12, dataStr.length() - 10) + dataStr.substring(dataStr.length() - 10, dataStr.length() - 8); int dataType = deviceCodeParam.getDataType(); if (ExchangeStringUtil.isInDate(date, "00:00:00", "00:00:30")) { dateStr = dateStr.substring(0, 17) + "00"; System.out.println("插入时间00" + dateStr); } else if (ExchangeStringUtil.isInDate(date, "00:00:30", "00:00:59")) { dateStr = dateStr.substring(0, 17) + "30"; System.out.println("插入时间30" + dateStr); } try { if (dataType == 3) { data = decimalFormat.format(Math.abs(ExchangeStringUtil.hexToSingle(data)));//十六进制字符串转IEEE754浮点型 log.info("电表==>{},寄存器地址==>{},读数==>{}", cloudId, deviceCodeParam.getRegisterAddr(), data); } else if (dataType == 2) { data = ExchangeStringUtil.hexToDec(data); log.info("电表==>{},寄存器地址==>{},累计读数==>{}", cloudId, deviceCodeParam.getRegisterAddr(), data); } // 判断data大于99999999,就返回空 if (new BigDecimal(data).intValue() > 99999999) { return ""; } return data; } catch (Exception e) { log.error("保存电表数据失败!", e); } } else { log.info("电表===>{}", dataStr); return ""; } return ""; } public static int dValue(String lastDate) throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date lastTime = format.parse(lastDate); long min = lastTime.getTime(); Calendar calendar = Calendar.getInstance(); long min1 = calendar.getTimeInMillis(); long subtract = min1 - min; // System.out.println("相减值: " + subtract/(1000*60)); return (int) subtract / (1000 * 60); } // 判断是否存在寄存器地址 public Boolean queryRegisterAddr(List stringList, String registerAddr) { boolean flag = false; for (int i = 0; i < stringList.size(); i++) { if (stringList.get(i).equalsIgnoreCase(registerAddr)) { flag = true; break; } } return flag; } public String analysisHeatPumpOrder485(String receiveStr, CollectionParamsManage deviceCodeParam) { // 去掉空格 String dataStr = receiveStr.replace(" ", "").toUpperCase(); // 检验报文 String checkStr = dataStr.substring(0, dataStr.length() - 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(checkStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); if (checkWord.equalsIgnoreCase(dataStr.substring(dataStr.length() - 4))) { //创建SimpleDateFormat对象,指定样式 2019-05-13 22:39:30 Date date = new Date(); String dateStr = sdf1.format(date); //保留两位小数处理 DecimalFormat decimalFormat = new DecimalFormat("0.00"); // 表号 String cloudId = ExchangeStringUtil.hexToDec(dataStr.substring(0, 2)); // 读数 String data = ""; data = dataStr.substring(dataStr.length() - 8, dataStr.length() - 6) + dataStr.substring(dataStr.length() - 6, dataStr.length() - 4); int dataType = deviceCodeParam.getDataType(); if (ExchangeStringUtil.isInDate(date, "00:00:00", "00:00:30")) { dateStr = dateStr.substring(0, 17) + "00"; System.out.println("插入时间00" + dateStr); } else if (ExchangeStringUtil.isInDate(date, "00:00:30", "00:00:59")) { dateStr = dateStr.substring(0, 17) + "30"; System.out.println("插入时间30" + dateStr); } try { if (dataType == 3) { data = decimalFormat.format(Math.abs(ExchangeStringUtil.hexToSingle(data)));//十六进制字符串转IEEE754浮点型 } else if (dataType == 2 && (deviceCodeParam.getParamType().equals("5") || deviceCodeParam.getParamType().equals("2") || deviceCodeParam.getParamType().equals("12") || deviceCodeParam.getParamType().equals("14") || deviceCodeParam.getParamType().equals("48") )) { data = ExchangeStringUtil.hexToDec(data); } log.info("热泵==>{},寄存器地址==>{},读数==>{}", cloudId, deviceCodeParam.getRegisterAddr(), data); return data; } catch (Exception e) { log.error("保存热泵数据失败!", e); } } else { log.info("热泵===>{}", dataStr); return ""; } return ""; } }