Ver Fonte

修改bug

邵洋 há 1 ano atrás
pai
commit
cb896351aa

+ 8 - 29
environment-data-service/src/main/java/com/zksy/environment/config/NtServer.java

@@ -3,12 +3,13 @@ package com.zksy.environment.config;
 import com.zksy.environment.utils.ServerHandler;
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import io.netty.channel.*;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.ServerSocketChannel;
 import io.netty.channel.socket.SocketChannel;
 import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.handler.codec.ByteToMessageDecoder;
+import io.netty.handler.codec.MessageToMessageDecoder;
 import io.netty.handler.timeout.IdleStateHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -58,8 +59,6 @@ public class NtServer {
                             ChannelPipeline p = sc.pipeline();
                             // 添加心跳检测处理器
                             p.addLast(new IdleStateHandler(0, 0, 180, TimeUnit.SECONDS)); // 每3分钟检查一次空闲状态
-                            // 添加解码器将字节数据解码成16进制字符串
-                            p.addLast(new HexDecoder());
                             p.addLast(new ServerHandler());
                         }
                     });
@@ -81,8 +80,12 @@ public class NtServer {
                 e.printStackTrace();
             } finally {
                 //退出,释放线程池资源
-                boss.shutdownGracefully();
-                worker.shutdownGracefully();
+                if (boss != null) {
+                    boss.shutdownGracefully();
+                }
+                if (worker != null) {
+                    worker.shutdownGracefully();
+                }
             }
         });
         thread.start();
@@ -100,28 +103,4 @@ public class NtServer {
             worker.shutdownGracefully();
         }
     }
-
-    static class HexDecoder extends ByteToMessageDecoder {
-
-        @Override
-        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
-            // 读取2个字节数据
-            byte[] hexBytes = new byte[in.readableBytes()];
-            in.readBytes(hexBytes);
-
-            // 将字节数据转换为16进制字符串
-            String hexData = bytesToHex(hexBytes);
-            // 将16进制字符串添加到输出列表
-            out.add(hexData);
-        }
-
-        // 将字节数组转换为16进制字符串
-        private String bytesToHex(byte[] bytes) {
-            StringBuilder hexBuilder = new StringBuilder();
-            for (byte b : bytes) {
-                hexBuilder.append(String.format("%02X", b));
-            }
-            return hexBuilder.toString();
-        }
-    }
 }

+ 0 - 1
environment-data-service/src/main/java/com/zksy/environment/domain/po/PictureMessage.java

@@ -8,7 +8,6 @@ import io.swagger.annotations.ApiModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**

+ 0 - 1
environment-data-service/src/main/java/com/zksy/environment/domain/po/StationHour.java

@@ -8,7 +8,6 @@ import io.swagger.annotations.ApiModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**

+ 0 - 1
environment-data-service/src/main/java/com/zksy/environment/service/PictureMessageService.java

@@ -1,6 +1,5 @@
 package com.zksy.environment.service;
 
-
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zksy.environment.domain.po.PictureMessage;
 

+ 3 - 5
environment-data-service/src/main/java/com/zksy/environment/service/impl/PictureMessageServiceImpl.java

@@ -14,8 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
-import java.nio.file.Paths;
-import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.regex.Pattern;
@@ -58,7 +56,7 @@ public class PictureMessageServiceImpl extends ServiceImpl<PictureMessageMapper,
                 map.put("sendingMessageTime", DateTimeUtil.parseDateTime(sendingMessageTime).toString());
 
                 // 测站地址
-                int stationAddressIndex = dataStr.indexOf("f1f1");
+                int stationAddressIndex = dataStr.indexOf("F1F1");
                 if (stationAddressIndex != -1 && stationAddressIndex + 10 < dataStr.length()) {
                     String result = dataStr.substring(stationAddressIndex + 4, stationAddressIndex + 14);
                     map.put("measuringStationAddress",result);
@@ -88,9 +86,9 @@ public class PictureMessageServiceImpl extends ServiceImpl<PictureMessageMapper,
 
                 // 对于首个包,直接获取数据段
                 List<String> dataSegments = new ArrayList<>();
-                int startIndex = dataStr.indexOf("f3f3");
+                int startIndex = dataStr.indexOf("F3F3");
                 if (startIndex != -1) {
-                    segment = dataStr.substring(startIndex + "f3f3".length());
+                    segment = dataStr.substring(startIndex + "F3F3".length());
                     dataSegments.add(segment);
                 }
                 segment = String.join("", dataSegments);

+ 31 - 26
environment-data-service/src/main/java/com/zksy/environment/service/impl/StationHourServiceImpl.java

@@ -67,32 +67,37 @@ public class StationHourServiceImpl extends ServiceImpl<StationHourMapper, Stati
                 stationHour.setObserveTime(DateTimeUtil.parseDateTime(observeTime));
             }
             //水温
-            int waterTemperatureIndex = dataStr.indexOf("0311");
-            // 如果找到了并且后面有4个字符
-            if (waterTemperatureIndex != -1 && waterTemperatureIndex + 4 < dataStr.length()) {
-                // 提取后面的4个字符
-                String result = dataStr.substring(waterTemperatureIndex + 4, waterTemperatureIndex + 8);
-                int parseInt = Integer.parseInt(result);
-                double numberDouble = (double) parseInt / 10;
-                stationHour.setWaterTemperature(numberDouble);
-            }
-            //浊度
-            int turbidityIndex = dataStr.indexOf("4919");
-            // 如果找到了并且后面有6个字符
-            if (turbidityIndex != -1 && turbidityIndex + 6 < dataStr.length()) {
-                // 提取后面的6个字符1
-                String result = dataStr.substring(turbidityIndex + 4, turbidityIndex + 10);
-                stationHour.setTurbidity(Integer.parseInt(result));
-            }
-            //电压
-            int voltageIndex = dataStr.indexOf("3812");
-            // 如果找到了并且后面有4个字符
-            if (voltageIndex != -1 && voltageIndex + 4 < dataStr.length()) {
-                // 提取后面的4个字符
-                String result = dataStr.substring(voltageIndex + 4, voltageIndex + 8);
-                int parseInt = Integer.parseInt(result);
-                double numberDouble = (double) parseInt / 100;
-                stationHour.setVoltage(numberDouble);
+            // 寻找 "ffa01" 的位置
+            int ffa01Index = dataStr.indexOf("FFA01");
+            if (ffa01Index != -1) {
+                // 在 "ffa01" 之前查找 "0311"
+                int waterTemperatureIndex = dataStr.lastIndexOf("0311", ffa01Index - 1);
+                // 如果找到了并且后面有4个字符
+                if (waterTemperatureIndex != -1 && waterTemperatureIndex + 4 < dataStr.length()) {
+                    // 提取后面的4个字符
+                    String result = dataStr.substring(waterTemperatureIndex + 4, waterTemperatureIndex + 8);
+                    int parseInt = Integer.parseInt(result);
+                    double numberDouble = (double) parseInt / 10;
+                    stationHour.setWaterTemperature(numberDouble);
+                }
+                //浊度
+                int turbidityIndex = dataStr.indexOf("4919",ffa01Index - 1);
+                // 如果找到了并且后面有6个字符
+                if (turbidityIndex != -1 && turbidityIndex + 6 < dataStr.length()) {
+                    // 提取后面的6个字符1
+                    String result = dataStr.substring(turbidityIndex + 4, turbidityIndex + 10);
+                    stationHour.setTurbidity(Integer.parseInt(result));
+                }
+                //电压
+                int voltageIndex = dataStr.indexOf("3812",ffa01Index - 1);
+                // 如果找到了并且后面有4个字符
+                if (voltageIndex != -1 && voltageIndex + 4 < dataStr.length()) {
+                    // 提取后面的4个字符
+                    String result = dataStr.substring(voltageIndex + 4, voltageIndex + 8);
+                    int parseInt = Integer.parseInt(result);
+                    double numberDouble = (double) parseInt / 100;
+                    stationHour.setVoltage(numberDouble);
+                }
             }
             //信号强度
             int signalIndex = dataStr.indexOf("7A08");

+ 17 - 0
environment-data-service/src/main/java/com/zksy/environment/utils/HexToImageConverter.java

@@ -1,5 +1,7 @@
 package com.zksy.environment.utils;
 
+import io.netty.buffer.ByteBuf;
+
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
@@ -47,4 +49,19 @@ public class HexToImageConverter {
         }
         return data;
     }
+    /**
+     * TODO 将字节数组转成16进制
+      * @param bytes
+     * @return java.lang.String
+     * @author Administrator
+     * @date 2024/8/20 10:51:16
+     */
+
+    static String bytesToHex(byte[] bytes) {
+        StringBuilder hexBuilder = new StringBuilder();
+        for (byte b : bytes) {
+            hexBuilder.append(String.format("%02X", b));
+        }
+        return hexBuilder.toString();
+    }
 }

+ 10 - 71
environment-data-service/src/main/java/com/zksy/environment/utils/MonitorDatasynch.java

@@ -39,7 +39,10 @@ public class MonitorDatasynch {
     try {
         if (dataBuf.isReadable()) {
             // 读取并转换 ByteBuf 中的数据为16进制字符串
-            String oldDataStr = StringUtil.toHexString(dataBuf.array(), dataBuf.readerIndex(), dataBuf.readableBytes());
+            byte[] dataByte = new byte[dataBuf.readableBytes()];
+            dataBuf.readBytes(dataByte);
+            // 读取并转换 ByteBuf 中的数据为16进制字符串
+            String oldDataStr = HexToImageConverter.bytesToHex(dataByte);
 
             log.info("==========接收到数据:" + oldDataStr + "==========");
 
@@ -54,13 +57,13 @@ public class MonitorDatasynch {
             nowCode = DataCheckUtil.getCRC16Result(codeStr);
 
             //先将两个字符串转换为相同的大小写形式(默认是小写)
-            if (code.equalsIgnoreCase(nowCode)) {
+            if (code.equals(nowCode)) {
                 boolean flag = false;
                 // dataType == "32" 遥测站定时报,"33" 遥测站加时报,"34" 遥测站小时报,"36" 查询/报送 JPG 图片信息
                 // 获取报文特征
                 String dataType = oldDataStr.substring(20, 22);
 
-                if (!"2F".equalsIgnoreCase(dataType)) {
+                if (!"2F".equals(dataType)) {
                     if ("36".equals(dataType)) {
                         // 获取数据正文
                         String dataStr = oldDataStr.substring(26, oldDataStr.length() - 6);
@@ -83,78 +86,14 @@ public class MonitorDatasynch {
                 } else {
                     log.info("收到数据========", oldDataStr);
                 }
-            } else {
-                /**
-                 * 图片数据第一条分段接收的问题进行合并
-                 */
-                //开始符
-                String startCharacter = oldDataStr.substring(0, 4);
-                //结束符
-                // 获取字符串的长度
-                int length = oldDataStr.length();
-
-                // 计算倒数第5位和第6位的位置
-                int pos5 = length - 5;
-                int pos6 = length - 6;
-
-                // 截取倒数第5位到倒数第6位的子字符串
-                String subStr = oldDataStr.substring(pos6, pos5 + 1);
-                if(!"7E7E".equalsIgnoreCase(startCharacter) || !"17".equals(subStr)) {
-                    // 将不完整数据存入data1List
-                    synchronized (lock) {
-                        data1List.add(oldDataStr);
-                    }
-                    StringBuilder dataBuilder = new StringBuilder();
-                    if (data1List.size() >= 2) {
-                        for (String data : data1List) {
-                            dataBuilder.append(data);
-                        }
-                    }
-                    if (dataBuilder != null && dataBuilder.length() > 6) {
-                        //开始符
-                        String dataBuilderStartCharacter = dataBuilder.substring(0, 4);
-                        // 获取字符串的长度
-                        int dataLength = dataBuilder.length();
-                        // 计算倒数第5位和第6位的位置
-                        int dataPos5 = dataLength - 5;
-                        int dataPos6 = dataLength - 6;
-                        // 截取倒数第5位到倒数第6位的子字符串
-                        String dataSubStr = dataBuilder.substring(dataPos6, dataPos5 + 1);
-                        if (!"7E7E".equalsIgnoreCase(dataBuilderStartCharacter) && !"17".equals(dataSubStr)) {
-                            return response;
-                        } else {
-                            oldDataStr = dataBuilder.toString();
-                            System.out.println("组合不完整数据dataBuilder======" + dataBuilder);
-                        }
-                    }
-                }
-                // 获取报文特征
-                String dataType = oldDataStr.substring(20, 22);
-
-                // 获取检验码数据
-                String codeStrBuilder = oldDataStr.substring(0, oldDataStr.length() - 4);
-                // 获取数据CRC16检验码
-                String codeBuilder = oldDataStr.substring(oldDataStr.length() - 4);
-
-                // 通过数据生成CRC16校验码
-                String nowCodeBuilder = DataCheckUtil.getCRC16Result(codeStrBuilder);
-                if(codeBuilder.equalsIgnoreCase(nowCodeBuilder)) {
-                    if ("36".equals(dataType)) {
-                        // 获取数据正文
-                        String dataStr = oldDataStr.substring(26, oldDataStr.length() - 6);
-                        log.info("数据主体正文:" + dataStr);
-                        pictureMessageService.savePictureMessage(oldDataStr, dataStr);
-                    }
-                }else{
-                    log.info("==========数据解包校验不正确==========");
-                }
+            }else {
+                log.info("==========数据解包校验不正确==========");
             }
         } else {
             log.info("==========数据长度格式不正确==========");
         }
-    }finally {
-        // 确保在方法结束前释放 ByteBuf
-        dataBuf.release();
+    }catch (Exception e){
+        e.printStackTrace();
     }
         return response;
     }

+ 19 - 6
environment-data-service/src/main/java/com/zksy/environment/utils/ServerHandler.java

@@ -3,6 +3,7 @@ package com.zksy.environment.utils;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.channel.SimpleChannelInboundHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -11,7 +12,7 @@ import javax.annotation.PostConstruct;
 
 @Slf4j
 @Component
-public class ServerHandler extends ChannelInboundHandlerAdapter {
+public class ServerHandler extends SimpleChannelInboundHandler<ByteBuf> {
     private static ServerHandler serverHandler;
 
     @Autowired
@@ -71,20 +72,32 @@ public class ServerHandler extends ChannelInboundHandlerAdapter {
         ctx.close();
     }
 
+    @Override
+    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg){
+        try {
+            // 处理data数组中的数据
+            serverHandler.monitorDatasynch.pushMonitorData(msg);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+    }
+
+
     /**
      * 服务端处理客户端websocket请求的核心方法,这里接收了客户端发来的信息
      */
-    @Override
+    /*@Override
     public void channelRead(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {
         try {
-            String hexString = (String) msg; // 接收16进制字符串
-            ByteBuf buf = DataCheckUtil.hexStringToByteBuf(hexString); // 将16进制字符串转换为 ByteBuf
+            ByteBuf hexString = (ByteBuf) msg; // 接收16进制字符串
+            //ByteBuf buf = DataCheckUtil.hexStringToByteBuf(hexString); // 将16进制字符串转换为 ByteBuf
             //System.err.println("strArr==="+strArr);
             //log.info("==========数据已接收,接收时间:==========" + LocalDateTime.now());
-            String pushMonitorDataStr = serverHandler.monitorDatasynch.pushMonitorData(buf);
+            String pushMonitorDataStr = serverHandler.monitorDatasynch.pushMonitorData(hexString);
         } catch (Exception e) {
             log.info("==========数据入库失败==========");
             e.printStackTrace();
         }
-    }
+    }*/
 }