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 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 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; List psMonitorSzList = psMonitorSzService.pushMonitorData(oldDataStr,dataArr,ipPort); psMonitorSzService.saveBatch(psMonitorSzList); } 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 List minuteDataInfoData(String oldDataStr,String[] dataArr) { ArrayList arrayList = new ArrayList<>(); List 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 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; } }