|
|
@@ -0,0 +1,253 @@
|
|
|
+package com.zksy.environmentHJ212.utils;
|
|
|
+
|
|
|
+import com.zksy.environmentHJ212.domain.po.MinuteDataInfo;
|
|
|
+import com.zksy.environmentHJ212.domain.po.PsMonitorSz;
|
|
|
+import com.zksy.environmentHJ212.service.MinuteDataInfoService;
|
|
|
+import com.zksy.environmentHJ212.service.PsMonitorSzService;
|
|
|
+import io.netty.channel.ChannelHandlerContext;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Scope;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.net.InetSocketAddress;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description
|
|
|
+ * @Date 2021- 06-01-下午 14:37
|
|
|
+ * @auther Javen
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+@Scope(SCOPE_PROTOTYPE)
|
|
|
+public class MonitorDatasynch {
|
|
|
+
|
|
|
+ private final PsMonitorSzService psMonitorSzService;
|
|
|
+
|
|
|
+ private final MinuteDataInfoService minuteDataInfoService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public MonitorDatasynch(PsMonitorSzService psMonitorSzService, MinuteDataInfoService minuteDataInfoService) {
|
|
|
+ this.psMonitorSzService = psMonitorSzService;
|
|
|
+ this.minuteDataInfoService = minuteDataInfoService;
|
|
|
+ }
|
|
|
+ private static LinkedHashMap<String, String> fieldMap = new LinkedHashMap<>();
|
|
|
+ static {
|
|
|
+ fieldMap.put("a01001", "TEMP");// 温度
|
|
|
+ fieldMap.put("a01002", "HUMIDITY");// 湿度
|
|
|
+ fieldMap.put("DataTime", "SAMPLETIME");// 采样时间
|
|
|
+ fieldMap.put("CN", "CN");// 命令编码
|
|
|
+ fieldMap.put("ST", "ST");// 系统编码
|
|
|
+ fieldMap.put("MN", "MN");// 设备唯一标志
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 获取水质同步数据,数据有效性校验,解析
|
|
|
+ */
|
|
|
+ public String pushMonitorData(ChannelHandlerContext channelHandlerContext, String oldDataStr){
|
|
|
+ log.info("==========接收到数据:" + oldDataStr + "==========");
|
|
|
+ MinuteDataInfo monitordata = null;
|
|
|
+ String response = null;
|
|
|
+ if (oldDataStr.length() > 6) {
|
|
|
+ String lenstr = oldDataStr.substring(2, 6);
|
|
|
+ // 获取数据长度
|
|
|
+ int codeLen = Integer.parseInt(lenstr);
|
|
|
+ log.info("数据主体长度:" + codeLen);
|
|
|
+ // 获取数据正文
|
|
|
+ String dataStr = oldDataStr.substring(6, oldDataStr.length()-6);
|
|
|
+ log.info("数据主体正文:" + dataStr);
|
|
|
+ // 获取数据CRC16检验码
|
|
|
+ String code = oldDataStr.substring(oldDataStr.length()-6, oldDataStr.length()-2);
|
|
|
+ log.info(code);
|
|
|
+ // 通过数据生成CRC16校验码
|
|
|
+ String nowCode = DataCheckUtil.crc16_Checkout(dataStr, codeLen);
|
|
|
+ log.info("==========自带的验证码:" + code + "新生成的验证码:" + nowCode);
|
|
|
+ // 前后crc16校验码比对(true-数据传输无问题,false-数据传输出现问题)
|
|
|
+ if (code.equals(nowCode)) {
|
|
|
+ try {
|
|
|
+ String[] dataArr = dataStr.split(";");
|
|
|
+ List<String> collect = Arrays.asList(dataArr).stream().filter(item -> item.contains("CN=")).collect(Collectors.toList());
|
|
|
+ String cn = "";
|
|
|
+ if (collect != null && collect.size() > 0) {
|
|
|
+ cn = collect.get(0);
|
|
|
+ }
|
|
|
+ // 判断是实时数据(2011)
|
|
|
+ if ("2011".equals(cn.substring(3))) {
|
|
|
+ String host = ((InetSocketAddress)channelHandlerContext.channel().remoteAddress()).getAddress().getHostAddress();
|
|
|
+ int port = ((InetSocketAddress)channelHandlerContext.channel().remoteAddress()).getPort();
|
|
|
+ String ipPort = host+":"+port;
|
|
|
+ psMonitorSzService.pushMonitorData(oldDataStr,dataArr,ipPort);
|
|
|
+ } else if ("2051".equals(cn.substring(3)) || "2061".equals(cn.substring(3))){
|
|
|
+ //分钟,小时数据
|
|
|
+ minuteDataInfoService.saveMonitordata(oldDataStr,dataArr);
|
|
|
+ }else{
|
|
|
+ System.err.println("报警"+oldDataStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("==========数据解析错误==========", oldDataStr);
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.info("==========数据传输错误,验证不匹配==========", oldDataStr);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.info("==========数据长度格式不正确==========");
|
|
|
+ }
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static PsMonitorSz setPsMonitorSz(Map map, String[] dataArr, Map keyMap, String resultStr, PsMonitorSz monitordata) {
|
|
|
+ Pattern pattern = Pattern.compile("^[aw]{1}[0-9]{1,5}$");
|
|
|
+ fieldMap.keySet().forEach(item -> {
|
|
|
+ String aa = item;
|
|
|
+ if (pattern.matcher(item).matches()) {
|
|
|
+ aa = item + resultStr;
|
|
|
+ } else {
|
|
|
+ aa = item;
|
|
|
+ }
|
|
|
+ keyMap.put(aa, fieldMap.get(item));
|
|
|
+ });
|
|
|
+ for (String str : dataArr) {
|
|
|
+ // 判断对应值是有包含&&符号,如有就替换为空字符
|
|
|
+ if (str.contains("&&")) {
|
|
|
+ str = str.replace("&&", "");
|
|
|
+ }
|
|
|
+ List<String> dtList = new ArrayList<>();
|
|
|
+ if (str.contains(",")) {
|
|
|
+ // 通过,符号截取同项目不同数据值的数据。
|
|
|
+ String[] split = str.split(",");
|
|
|
+ dtList = Arrays.asList(split);
|
|
|
+ } else {
|
|
|
+ dtList.add(str);
|
|
|
+ }
|
|
|
+ for (String item : dtList) {
|
|
|
+ if (item.contains("=")) {
|
|
|
+ int index = item.indexOf("=");
|
|
|
+ int lastIndex = item.lastIndexOf("=");
|
|
|
+ // 判断是否有多个数据值
|
|
|
+ if (index == lastIndex) {
|
|
|
+ // 判断=符号,是否是最后一个字符
|
|
|
+ if (index + 1 != item.length()) {
|
|
|
+ String key = item.substring(0, index);// 011-Rtd
|
|
|
+ String val = item.substring(index + 1); // 35.570
|
|
|
+ // 替换字段键
|
|
|
+ if (keyMap.containsKey(key)) {
|
|
|
+ if ("DataTime".equals(key)) {
|
|
|
+ map.put(keyMap.get(key), DateTimeUtil.parseDateTime(val));
|
|
|
+ } else {
|
|
|
+ map.put(keyMap.get(key), val);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 判断=符号,是否是最后一个字符
|
|
|
+ if (lastIndex + 1 != item.length()) {
|
|
|
+ String key = item.substring(index + 1, lastIndex);
|
|
|
+ String val = item.substring(lastIndex + 1);
|
|
|
+ // 替换字段键
|
|
|
+ if (keyMap.containsKey(key)) {
|
|
|
+ if ("DataTime".equals(key)) {
|
|
|
+ map.put(keyMap.get(key), DateTimeUtil.parseDateTime(val));
|
|
|
+ } else {
|
|
|
+ map.put(keyMap.get(key), val);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return monitordata;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<MinuteDataInfo> minuteDataInfoData(String oldDataStr,String[] dataArr) {
|
|
|
+ Pattern pattern = Pattern.compile("^[aw]{1}[0-9]{1,5}$");
|
|
|
+ ArrayList<String> arrayList = new ArrayList<>();
|
|
|
+ List<MinuteDataInfo> minuteDataInfolist = new ArrayList<>();
|
|
|
+ for (String param : dataArr) {
|
|
|
+ System.out.println("param = " + param);
|
|
|
+ String String = "&&";
|
|
|
+ boolean contains = param.contains(String);
|
|
|
+ if (contains) {
|
|
|
+ param = param.replace(String, ",");
|
|
|
+
|
|
|
+ }
|
|
|
+ if (param.contains(",")) {
|
|
|
+ arrayList.add(param);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ ArrayList<String> objects = new ArrayList<>();
|
|
|
+ for (String entity : arrayList) {
|
|
|
+ String substring = null;
|
|
|
+ if (entity.contains("-")) {
|
|
|
+ substring = entity.substring(0, entity.indexOf("-"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(substring)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (entity.startsWith(substring)) {
|
|
|
+ objects.add(substring);
|
|
|
+ String[] split = entity.split(",");
|
|
|
+
|
|
|
+ MinuteDataInfo minuteDataInfo = new MinuteDataInfo();
|
|
|
+ minuteDataInfo.setRemark(oldDataStr);
|
|
|
+ for (String parameters : split) {
|
|
|
+
|
|
|
+ String[] split1 = parameters.split("=");
|
|
|
+ minuteDataInfo.setCode(substring);
|
|
|
+ if (parameters.startsWith(substring + "-Cou=")) {
|
|
|
+
|
|
|
+ minuteDataInfo.setDataCouValue(new BigDecimal(split1[1]));
|
|
|
+ }
|
|
|
+ if (parameters.startsWith(substring + "-Min=")) {
|
|
|
+ minuteDataInfo.setDataMinValue(new BigDecimal(split1[1]));
|
|
|
+ }
|
|
|
+ if (parameters.startsWith(substring + "-Avg=")) {
|
|
|
+ minuteDataInfo.setDataAvgValue(new BigDecimal(split1[1]));
|
|
|
+ }
|
|
|
+ if (parameters.startsWith(substring + "-Max=")) {
|
|
|
+ minuteDataInfo.setDataMaxValue(new BigDecimal(split1[1]));
|
|
|
+ }
|
|
|
+ if (parameters.startsWith(substring + "-Flag=")) {
|
|
|
+ minuteDataInfo.setDataFlag(split1[1]);
|
|
|
+ }
|
|
|
+ minuteDataInfo.setCreateTime(LocalDateTime.now());
|
|
|
+ minuteDataInfo.setId(UUID.randomUUID().toString().replace("-", ""));
|
|
|
+ for (String comParams : dataArr) {
|
|
|
+ if (comParams.contains("&&") && !comParams.contains(",")) {
|
|
|
+ String replace = comParams.replace("&&", ",");
|
|
|
+ String[] split2 = replace.split(",");
|
|
|
+ if (split2.length>1) {
|
|
|
+ String dateString = split2[1];
|
|
|
+ if (dateString.startsWith("DataTime=")) {
|
|
|
+ minuteDataInfo.setDataTime(DateTimeUtil.parseDateTime(dateString.split("=")[1]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String[] comsplit1 = comParams.split("=");
|
|
|
+ String paraname = comsplit1[0];
|
|
|
+ String value = comsplit1[1];
|
|
|
+ if (paraname.equals("MN")) {
|
|
|
+ minuteDataInfo.setMn(value);
|
|
|
+ }
|
|
|
+ if (paraname.equals("Flag")) {
|
|
|
+ minuteDataInfo.setFlag(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ minuteDataInfolist.add(minuteDataInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return minuteDataInfolist;
|
|
|
+ }
|
|
|
+}
|