MonitorDatasynch.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.zksy.environmentHJ212.utils;
  2. import com.zksy.environmentHJ212.domain.po.MinuteDataInfo;
  3. import com.zksy.environmentHJ212.domain.po.PsMonitorSz;
  4. import com.zksy.environmentHJ212.service.MinuteDataInfoService;
  5. import com.zksy.environmentHJ212.service.PsMonitorSzService;
  6. import io.netty.channel.ChannelHandlerContext;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.context.annotation.Scope;
  11. import org.springframework.stereotype.Service;
  12. import java.math.BigDecimal;
  13. import java.net.InetSocketAddress;
  14. import java.time.LocalDateTime;
  15. import java.util.*;
  16. import java.util.regex.Pattern;
  17. import java.util.stream.Collectors;
  18. import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
  19. /**
  20. * @Description
  21. * @Date 2021- 06-01-下午 14:37
  22. * @auther Javen
  23. */
  24. @Service
  25. @Slf4j
  26. @Scope(SCOPE_PROTOTYPE)
  27. public class MonitorDatasynch {
  28. private final PsMonitorSzService psMonitorSzService;
  29. private final MinuteDataInfoService minuteDataInfoService;
  30. @Autowired
  31. public MonitorDatasynch(PsMonitorSzService psMonitorSzService, MinuteDataInfoService minuteDataInfoService) {
  32. this.psMonitorSzService = psMonitorSzService;
  33. this.minuteDataInfoService = minuteDataInfoService;
  34. }
  35. private static LinkedHashMap<String, String> fieldMap = new LinkedHashMap<>();
  36. static {
  37. fieldMap.put("a01001", "TEMP");// 温度
  38. fieldMap.put("a01002", "HUMIDITY");// 湿度
  39. fieldMap.put("DataTime", "SAMPLETIME");// 采样时间
  40. fieldMap.put("CN", "CN");// 命令编码
  41. fieldMap.put("ST", "ST");// 系统编码
  42. fieldMap.put("MN", "MN");// 设备唯一标志
  43. }
  44. /**
  45. * 获取水质同步数据,数据有效性校验,解析
  46. */
  47. public String pushMonitorData(ChannelHandlerContext channelHandlerContext, String oldDataStr){
  48. log.info("==========接收到数据:" + oldDataStr + "==========");
  49. MinuteDataInfo monitordata = null;
  50. String response = null;
  51. if (oldDataStr.length() > 6) {
  52. String lenstr = oldDataStr.substring(2, 6);
  53. // 获取数据长度
  54. int codeLen = Integer.parseInt(lenstr);
  55. log.info("数据主体长度:" + codeLen);
  56. // 获取数据正文
  57. String dataStr = oldDataStr.substring(6, oldDataStr.length()-6);
  58. log.info("数据主体正文:" + dataStr);
  59. // 获取数据CRC16检验码
  60. String code = oldDataStr.substring(oldDataStr.length()-6, oldDataStr.length()-2);
  61. log.info(code);
  62. // 通过数据生成CRC16校验码
  63. String nowCode = DataCheckUtil.crc16_Checkout(dataStr, codeLen);
  64. log.info("==========自带的验证码:" + code + "新生成的验证码:" + nowCode);
  65. // 前后crc16校验码比对(true-数据传输无问题,false-数据传输出现问题)
  66. if (code.equals(nowCode)) {
  67. try {
  68. String[] dataArr = dataStr.split(";");
  69. List<String> collect = Arrays.asList(dataArr).stream().filter(item -> item.contains("CN=")).collect(Collectors.toList());
  70. String cn = "";
  71. if (collect != null && collect.size() > 0) {
  72. cn = collect.get(0);
  73. }
  74. // 判断是实时数据(2011)
  75. if ("2011".equals(cn.substring(3))) {
  76. String host = ((InetSocketAddress)channelHandlerContext.channel().remoteAddress()).getAddress().getHostAddress();
  77. int port = ((InetSocketAddress)channelHandlerContext.channel().remoteAddress()).getPort();
  78. String ipPort = host+":"+port;
  79. List<PsMonitorSz> psMonitorSzList = psMonitorSzService.pushMonitorData(oldDataStr,dataArr,ipPort);
  80. psMonitorSzService.saveBatch(psMonitorSzList);
  81. } else if ("2051".equals(cn.substring(3)) || "2061".equals(cn.substring(3))){
  82. //分钟,小时数据
  83. minuteDataInfoService.saveMonitordata(oldDataStr,dataArr);
  84. }else{
  85. System.err.println("报警"+oldDataStr);
  86. }
  87. } catch (Exception e) {
  88. log.info("==========数据解析错误==========", oldDataStr);
  89. e.printStackTrace();
  90. }
  91. } else {
  92. log.info("==========数据传输错误,验证不匹配==========", oldDataStr);
  93. }
  94. } else {
  95. log.info("==========数据长度格式不正确==========");
  96. }
  97. return response;
  98. }
  99. public static List<MinuteDataInfo> minuteDataInfoData(String oldDataStr,String[] dataArr) {
  100. ArrayList<String> arrayList = new ArrayList<>();
  101. List<MinuteDataInfo> minuteDataInfolist = new ArrayList<>();
  102. for (String param : dataArr) {
  103. System.out.println("param = " + param);
  104. String String = "&&";
  105. boolean contains = param.contains(String);
  106. if (contains) {
  107. param = param.replace(String, ",");
  108. }
  109. if (param.contains(",")) {
  110. arrayList.add(param);
  111. }
  112. }
  113. ArrayList<String> objects = new ArrayList<>();
  114. for (String entity : arrayList) {
  115. String substring = null;
  116. if (entity.contains("-")) {
  117. substring = entity.substring(0, entity.indexOf("-"));
  118. }
  119. if (StringUtils.isBlank(substring)) {
  120. continue;
  121. }
  122. if (entity.startsWith(substring)) {
  123. objects.add(substring);
  124. String[] split = entity.split(",");
  125. MinuteDataInfo minuteDataInfo = new MinuteDataInfo();
  126. minuteDataInfo.setRemark(oldDataStr);
  127. for (String parameters : split) {
  128. String[] split1 = parameters.split("=");
  129. minuteDataInfo.setCode(substring);
  130. if (parameters.startsWith(substring + "-Cou=")) {
  131. minuteDataInfo.setDataCouValue(new BigDecimal(split1[1]));
  132. }
  133. if (parameters.startsWith(substring + "-Min=")) {
  134. minuteDataInfo.setDataMinValue(new BigDecimal(split1[1]));
  135. }
  136. if (parameters.startsWith(substring + "-Avg=")) {
  137. minuteDataInfo.setDataAvgValue(new BigDecimal(split1[1]));
  138. }
  139. if (parameters.startsWith(substring + "-Max=")) {
  140. minuteDataInfo.setDataMaxValue(new BigDecimal(split1[1]));
  141. }
  142. if (parameters.startsWith(substring + "-Flag=")) {
  143. minuteDataInfo.setDataFlag(split1[1]);
  144. }
  145. minuteDataInfo.setCreateTime(LocalDateTime.now());
  146. minuteDataInfo.setId(UUID.randomUUID().toString().replace("-", ""));
  147. for (String comParams : dataArr) {
  148. if (comParams.contains("&&") && !comParams.contains(",")) {
  149. String replace = comParams.replace("&&", ",");
  150. String[] split2 = replace.split(",");
  151. if (split2.length>1) {
  152. String dateString = split2[1];
  153. if (dateString.startsWith("DataTime=")) {
  154. minuteDataInfo.setDataTime(DateTimeUtil.parseDateTime(dateString.split("=")[1]));
  155. }
  156. }
  157. }
  158. String[] comsplit1 = comParams.split("=");
  159. String paraname = comsplit1[0];
  160. String value = comsplit1[1];
  161. if (paraname.equals("MN")) {
  162. minuteDataInfo.setMn(value);
  163. }
  164. if (paraname.equals("Flag")) {
  165. minuteDataInfo.setFlag(value);
  166. }
  167. }
  168. }
  169. minuteDataInfolist.add(minuteDataInfo);
  170. }
  171. }
  172. return minuteDataInfolist;
  173. }
  174. }