You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
13 KiB
286 lines
13 KiB
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<String> 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 ""; |
|
} |
|
}
|
|
|