From 1fd64b07ddb99c2d9cc8a358b71aceb6a2c81492 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期三, 05 七月 2023 15:58:31 +0800
Subject: [PATCH] 修改nettyTCP客户端断开重连 增加数据库连接池 修改日志打印

---
 src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java |   23 -
 src/main/java/com/ard/utils/tcp/ClientHandler.java                           |  444 +++++++++++++++++++++++
 src/main/java/com/ard/config/DruidConfig.java                                |   49 ++
 src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java                |    2 
 pom.xml                                                                      |   19 
 src/main/java/com/ard/utils/ByteUtils.java                                   |  108 +++++
 src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HIKSDKStructure.java      |    2 
 src/main/java/com/ard/utils/hiksdk/domain/recordInfo.java                    |    2 
 src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java                |    2 
 src/main/java/com/ard/utils/SpringTool.java                                  |   18 
 src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java                |    2 
 src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java             |    3 
 src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java   |    2 
 src/main/java/com/ard/utils/mqtt/MqttConsumer.java                           |    4 
 src/main/java/com/ard/utils/tcp/MessageParsing.java                          |   38 +
 src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java               |    2 
 src/main/java/com/ard/utils/hiksdk/util/imageUtil/waterMarkUtil.java         |    2 
 src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java     |    6 
 src/main/resources/logback-spring.xml                                        |   50 ++
 src/main/java/com/ard/config/AsyncConfiguration.java                         |    4 
 src/main/java/com/ard/utils/udp/NettyUdpServer.java                          |    5 
 src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java           |   10 
 src/main/java/com/ard/utils/tcp/NettyTcpClient.java                          |    7 
 src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java            |   15 
 src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java                   |   79 ++-
 src/main/java/com/ard/utils/tcp/ClientInitialize.java                        |  136 +++++++
 src/main/resources/application.yml                                           |   35 +
 src/main/java/com/ard/config/MinioClientSingleton.java                       |   32 
 28 files changed, 962 insertions(+), 139 deletions(-)

diff --git a/pom.xml b/pom.xml
index 0244e01..419f554 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,10 +47,7 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-        </dependency>
+
         <!--娴峰悍褰曞儚鏈轰簩娆″紑鍙戜緷璧杍ar鍖�-->
         <dependency>
             <groupId>net.java.jna</groupId>
@@ -84,6 +81,20 @@
             <artifactId>geodesy</artifactId>
             <version>1.1.3</version>
         </dependency>
+        <!--druid渚濊禆-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.2.14</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java b/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java
index 1726943..914fd59 100644
--- a/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java
+++ b/src/main/java/com/ard/alarm/camera/service/impl/ArdCamerasServiceImpl.java
@@ -4,7 +4,7 @@
 import com.ard.alarm.camera.domain.ArdCameras;
 import com.ard.alarm.camera.mapper.ArdCamerasMapper;
 import com.ard.alarm.camera.service.IArdCamerasService;
-import com.ard.hiksdk.service.impl.HikClientUtil;
+import com.ard.utils.hiksdk.service.impl.HikClientUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
diff --git a/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java b/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java
index 2613750..a096f37 100644
--- a/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java
+++ b/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java
@@ -4,6 +4,7 @@
 import com.ard.alarm.radar.domain.ArdEquipRadar;
 import com.ard.alarm.radar.mapper.ArdEquipRadarMapper;
 import com.ard.alarm.radar.service.IArdEquipRadarService;
+import com.ard.utils.tcp.ClientInitialize;
 import com.ard.utils.tcp.NettyTcpClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,32 +20,10 @@
  * @date 2023-03-11
  */
 @Service
-@Slf4j(topic = "radar")
 public class ArdEquipRadarServiceImpl implements IArdEquipRadarService
 {
     @Autowired
     private ArdEquipRadarMapper ardEquipRadarMapper;
-
-
-    @Resource
-    NettyTcpClient nettyTcpClient;
-    @Value("${spring.netty.tcp.enabled}")
-    private Boolean tcpClientEnable;
-    @PostConstruct
-    public void init() {
-        if(!tcpClientEnable)
-        {
-            return;
-        }
-        List<ArdEquipRadar> ardEquipRadars = selectArdEquipRadarList(new ArdEquipRadar());
-        for (ArdEquipRadar ardEquipRadar:ardEquipRadars)
-        {
-            String host = ardEquipRadar.getIp();
-            Integer port = Integer.valueOf(ardEquipRadar.getPort());
-            log.info("TCP瀹㈡埛绔皾璇曡繛鎺ワ細"+host+":"+port);
-            nettyTcpClient.init(ardEquipRadar);
-        }
-    }
 
     /**
      * 鏌ヨradar
diff --git a/src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java b/src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java
index a8243d9..3689447 100644
--- a/src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java
+++ b/src/main/java/com/ard/alarm/tube/service/TubeAlarmService.java
@@ -39,7 +39,7 @@
             return;
         }
         nettyUdpServer.init(udpPort);
-        log.info("UDP鏈嶅姟宸插惎鍔�");
+        log.info("绠$嚎娉勯湶UDP鏈嶅姟宸插惎鍔�");
     }
 
     @Async("alarm")
diff --git a/src/main/java/com/ard/async/AsyncConfiguration.java b/src/main/java/com/ard/config/AsyncConfiguration.java
similarity index 94%
rename from src/main/java/com/ard/async/AsyncConfiguration.java
rename to src/main/java/com/ard/config/AsyncConfiguration.java
index 0d5c5ec..186acc5 100644
--- a/src/main/java/com/ard/async/AsyncConfiguration.java
+++ b/src/main/java/com/ard/config/AsyncConfiguration.java
@@ -1,4 +1,4 @@
-package com.ard.async;
+package com.ard.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -16,7 +16,7 @@
 @EnableAsync(proxyTargetClass = true)
 public class AsyncConfiguration {
     @Bean("alarm")
-    public ThreadPoolTaskExecutor executor(){
+    public ThreadPoolTaskExecutor alarmExecutor(){
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         //閰嶇疆鏍稿績绾跨▼鏁�
         executor.setCorePoolSize(15);
diff --git a/src/main/java/com/ard/config/DruidConfig.java b/src/main/java/com/ard/config/DruidConfig.java
new file mode 100644
index 0000000..d1df6c6
--- /dev/null
+++ b/src/main/java/com/ard/config/DruidConfig.java
@@ -0,0 +1,49 @@
+package com.ard.config;
+import com.alibaba.druid.filter.Filter;
+import com.alibaba.druid.filter.stat.StatFilter;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.google.common.collect.Lists;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+/**
+ * @Description: druid杩炴帴姹犵殑閰嶇疆,閰嶇疆濡備綍澶勭悊鎱ql锛�
+ * @ClassName: DruidConfig
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�04鏃�15:29
+ * @Version: 1.0
+ **/
+@Configuration
+public class DruidConfig {
+    //杩欎釜娉ㄨВ璇诲彇閰嶇疆鏂囦欢鍓嶇紑涓簆refix鐨勯厤缃紝灏嗗閮ㄧ殑閰嶇疆鏂囦欢涓庤繖閲岀粦瀹�
+    @ConfigurationProperties(prefix = "spring.datasource.druid")
+    //瀹瑰櫒鐨勫紑鍚笌鍏抽棴
+    @Bean(initMethod = "init",destroyMethod = "close")
+    public DruidDataSource dataSource(){
+        DruidDataSource dataSource=new DruidDataSource();
+        dataSource.setProxyFilters(Lists.newArrayList(statFilter()));
+        return  dataSource;
+    }
+    //bean娉ㄨВ锛屾垚涓簊pring鐨刡ean锛屽埄鐢╢ilter灏嗘參sql鐨勬棩蹇楁墦鍗板嚭鏉�
+    @Bean
+    public Filter statFilter(){
+        StatFilter statFilter=new StatFilter();
+        //澶氶暱鏃堕棿瀹氫箟涓烘參sql锛岃繖閲屽畾涔変负5s
+        statFilter.setSlowSqlMillis(5000);
+        //鏄惁鎵撳嵃鍑烘參鏃ュ織
+        statFilter.setLogSlowSql(true);
+        //鏄惁灏嗘棩蹇楀悎骞惰捣鏉�
+        statFilter.setMergeSql(true);
+        return  statFilter;
+    }
+    //杩欐槸閰嶇疆druid鐨勭洃鎺�
+    //杩欐槸閰嶇疆druid鐨勭洃鎺т笌閰嶇疆鏂囦欢涓姛鑳戒竴鏍�
+    //#stat-view-servlet:
+    //   #enabled:true
+//    @Bean
+//    public ServletRegistrationBean servletRegistrationBean(){
+//        return new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
+//    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/config/MinioClientSingleton.java b/src/main/java/com/ard/config/MinioClientSingleton.java
index eaf92cf..713af81 100644
--- a/src/main/java/com/ard/config/MinioClientSingleton.java
+++ b/src/main/java/com/ard/config/MinioClientSingleton.java
@@ -1,12 +1,16 @@
 package com.ard.config;
 
+import com.ard.utils.SpringTool;
 import io.minio.MinioClient;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
+import org.springframework.context.annotation.Bean;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
+import org.springframework.integration.channel.DefaultHeaderChannelRegistry;
+import org.springframework.integration.channel.PublishSubscribeChannel;
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
@@ -31,9 +35,9 @@
     private volatile static MinioClient minioClient;
 
     static {
-        domainUrl = getYmlNew("minio.endpoint");
-        accessKey = getYmlNew("minio.accessKey");
-        secretKey = getYmlNew("minio.secretKey");
+        domainUrl = SpringTool.getYmlInfo("minio.endpoint");
+        accessKey = SpringTool.getYmlInfo("minio.accessKey");
+        secretKey = SpringTool.getYmlInfo("minio.secretKey");
         log.info("minio淇℃伅锛�" + domainUrl + "(" + accessKey + "/" + secretKey + ")");
     }
 
@@ -56,20 +60,14 @@
         return minioClient;
     }
 
-    /*yml閰嶇疆淇℃伅鑾峰彇*/
-    public static String getYmlNew(String key) {
-        Resource resource = new ClassPathResource("application.yml");
-        Properties properties = null;
-        try {
-            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
-            yamlFactory.setResources(resource);
-            properties = yamlFactory.getObject();
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-        return properties.get(key).toString();
-    }
 
+    @Bean
+    public PublishSubscribeChannel errorChannel() {
+        return new PublishSubscribeChannel();
+    }
+    @Bean
+    public DefaultHeaderChannelRegistry integrationHeaderChannelRegistry() {
+        return new DefaultHeaderChannelRegistry();
+    }
 }
 
diff --git a/src/main/java/com/ard/utils/ByteUtils.java b/src/main/java/com/ard/utils/ByteUtils.java
index 507ddcc..33c7856 100644
--- a/src/main/java/com/ard/utils/ByteUtils.java
+++ b/src/main/java/com/ard/utils/ByteUtils.java
@@ -1,10 +1,9 @@
 package com.ard.utils;
 
 import javax.xml.bind.DatatypeConverter;
+import java.io.ByteArrayOutputStream;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.zip.CRC32;
 
 /**
  * @Description: 瀛楄妭宸ュ叿绫�
@@ -16,20 +15,20 @@
 public class ByteUtils {
     /**
      * Byte瀛楄妭杞琀ex
+     *
      * @param b 瀛楄妭
      * @return Hex
      */
-    public static String byteToHex(byte b)
-    {
+    public static String byteToHex(byte b) {
         String hexString = Integer.toHexString(b & 0xFF);
         //鐢变簬鍗佸叚杩涘埗鏄敱0~9銆丄~F鏉ヨ〃绀�1~16锛屾墍浠ュ鏋淏yte杞崲鎴怘ex鍚庡鏋滄槸<16,灏变細鏄竴涓瓧绗︼紙姣斿A=10锛夛紝閫氬父鏄娇鐢ㄤ袱涓瓧绗︽潵琛ㄧず16杩涘埗浣嶇殑,
         //鍋囧涓�涓瓧绗︾殑璇濓紝閬囧埌瀛楃涓�11锛岃繖鍒板簳鏄�1涓瓧鑺傦紝杩樻槸1鍜�1涓や釜瀛楄妭锛屽鏄撴贩娣嗭紝濡傛灉鏄ˉ0锛岄偅涔�1鍜�1琛ュ厖鍚庡氨鏄�0101锛�11灏辫〃绀虹函绮圭殑11
-        if (hexString.length() < 2)
-        {
+        if (hexString.length() < 2) {
             hexString = new StringBuilder(String.valueOf(0)).append(hexString).toString();
         }
         return hexString.toUpperCase();
     }
+
     /**
      * byte鏁扮粍杞琭loat
      */
@@ -37,6 +36,7 @@
         ByteBuffer buffer = ByteBuffer.wrap(bytes);
         return buffer.getFloat();
     }
+
     /**
      * byte鏁扮粍杞暣鍨�
      */
@@ -79,4 +79,98 @@
         return littleEndianBytes;
     }
 
+    /**
+     * 灏忕杞ぇ绔�
+     */
+    public static byte[] toBigEndian(byte[] littleEndianBytes) {
+        byte[] bigEndianBytes = new byte[littleEndianBytes.length];
+        for (int i = 0; i < littleEndianBytes.length; i++) {
+            bigEndianBytes[i] = littleEndianBytes[littleEndianBytes.length - 1 - i];
+        }
+        return bigEndianBytes;
+    }
+
+    /**
+     * int杞琤yte鏁扮粍
+     */
+    public static byte[] decimalToBytes(int decimalValue) {
+        ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES);
+        buffer.putInt(decimalValue);
+        return buffer.array();
+    }
+
+    /**
+     * byte鏁扮粍鎷兼帴
+     */
+    public static byte[] appendArrays(byte[]... arrays) {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        try {
+            for (byte[] array : arrays) {
+                outputStream.write(array);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return outputStream.toByteArray();
+    }
+
+    /**
+     * byte鏁扮粍CRC32鏍¢獙
+     */
+    public static byte[] parseCrc32(byte[] bytes) {
+        CRC32 crc32 = new CRC32();
+        crc32.update(bytes);
+        bytes = ByteUtils.decimalToBytes((int) crc32.getValue());
+        bytes = ByteUtils.toBigEndian(bytes);
+        // System.out.print("鏍¢獙:"+DatatypeConverter.printHexBinary(bytes));//鎵撳嵃crc32鐨勬牎楠屽��
+        return bytes;
+    }
+
+    /**
+     * 鍘婚櫎鍖呭ご鍖呭熬
+     * 鍒樿嫃涔�
+     * 2023/7/4 11:24
+     */
+    public static byte[] removeHeaderAndFooter(byte[] data, int headerLength, int footerLength) {
+        int payloadLength = data.length - headerLength - footerLength;
+        byte[] payload = new byte[payloadLength];
+        System.arraycopy(data, headerLength, payload, 0, payloadLength);
+        return payload;
+    }
+
+    /**
+     * 鍘婚櫎鍖呭ご鍖呭熬crc鏍¢獙
+     * 鍒樿嫃涔�
+     * 2023/7/4 11:24
+     */
+    public static byte[] removeHeaderFooterAndCRC(byte[] data, int headerLength, int footerLength, int crcLength) {
+        int payloadLength = data.length - headerLength - footerLength - crcLength;
+        byte[] payload = new byte[payloadLength];
+        System.arraycopy(data, headerLength, payload, 0, payloadLength);
+        return payload;
+    }
+
+    /**
+     * 鑾峰彇鍚庨潰鐨勫瓧鑺傛暟缁�
+     * 鍒樿嫃涔�
+     * 2023/7/4 11:24
+     */
+    public static byte[] getLastBytes(byte[] data, int count) {
+        int startIndex = data.length - count;
+        byte[] lastBytes = new byte[count];
+        System.arraycopy(data, startIndex, lastBytes, 0, count);
+        return lastBytes;
+    }
+
+    /**
+     * 鎵惧埌00鐨勭储寮曚綅缃�
+     */
+    public static int findIndexOfDoubleZero(byte[] bytes) {
+        for (int i = 0; i < bytes.length - 1; i++) {
+            if (bytes[i] == 0x00) {
+                return i;
+            }
+        }
+        return -1;
+    }
 }
diff --git a/src/main/java/com/ard/utils/SpringTool.java b/src/main/java/com/ard/utils/SpringTool.java
index 0a7acfb..123317b 100644
--- a/src/main/java/com/ard/utils/SpringTool.java
+++ b/src/main/java/com/ard/utils/SpringTool.java
@@ -1,11 +1,15 @@
 package com.ard.utils;
 
 import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
 import org.springframework.stereotype.Component;
 
 import java.nio.ByteBuffer;
+import java.util.Properties;
 
 /**
  * @Description:
@@ -36,4 +40,18 @@
         return getApplicationContext().getBean(name);
     }
 
+    /*yml閰嶇疆淇℃伅鑾峰彇*/
+    public static String getYmlInfo(String key) {
+        Resource resource = new ClassPathResource("application.yml");
+        Properties properties = null;
+        try {
+            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
+            yamlFactory.setResources(resource);
+            properties = yamlFactory.getObject();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        return properties.get(key).toString();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ard/hiksdk/common/GlobalVariable.java b/src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java
similarity index 93%
rename from src/main/java/com/ard/hiksdk/common/GlobalVariable.java
rename to src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java
index c45d12b..cf3cd15 100644
--- a/src/main/java/com/ard/hiksdk/common/GlobalVariable.java
+++ b/src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.common;
+package com.ard.utils.hiksdk.common;
 
 import com.ard.alarm.camera.domain.ArdCameras;
 import lombok.Data;
diff --git a/src/main/java/com/ard/hiksdk/domain/alarmEventInfo.java b/src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java
similarity index 96%
rename from src/main/java/com/ard/hiksdk/domain/alarmEventInfo.java
rename to src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java
index 12ee93f..ff6a06c 100644
--- a/src/main/java/com/ard/hiksdk/domain/alarmEventInfo.java
+++ b/src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.domain;
+package com.ard.utils.hiksdk.domain;
 
 import lombok.Data;
 
diff --git a/src/main/java/com/ard/hiksdk/domain/recordInfo.java b/src/main/java/com/ard/utils/hiksdk/domain/recordInfo.java
similarity index 90%
rename from src/main/java/com/ard/hiksdk/domain/recordInfo.java
rename to src/main/java/com/ard/utils/hiksdk/domain/recordInfo.java
index 1f5c021..044032c 100644
--- a/src/main/java/com/ard/hiksdk/domain/recordInfo.java
+++ b/src/main/java/com/ard/utils/hiksdk/domain/recordInfo.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.domain;
+package com.ard.utils.hiksdk.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
diff --git a/src/main/java/com/ard/hiksdk/service/impl/FMSGCallBack.java b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
similarity index 95%
rename from src/main/java/com/ard/hiksdk/service/impl/FMSGCallBack.java
rename to src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
index 2803831..b2e594c 100644
--- a/src/main/java/com/ard/hiksdk/service/impl/FMSGCallBack.java
+++ b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
@@ -1,14 +1,14 @@
-package com.ard.hiksdk.service.impl;
+package com.ard.utils.hiksdk.service.impl;
 
 import com.alibaba.fastjson2.JSON;
 import com.ard.alarm.camera.domain.ArdCameras;
 import com.ard.alarm.camera.domain.CameraCmd;
 import com.ard.alarm.camera.service.impl.ArdCamerasServiceImpl;
 import com.ard.config.MinioClientSingleton;
-import com.ard.hiksdk.common.GlobalVariable;
-import com.ard.hiksdk.domain.alarmEventInfo;
-import com.ard.hiksdk.util.hikSdkUtil.HCNetSDK;
-import com.ard.hiksdk.util.minio.MinioUtils;
+import com.ard.utils.hiksdk.common.GlobalVariable;
+import com.ard.utils.hiksdk.domain.alarmEventInfo;
+import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
+import com.ard.utils.hiksdk.util.minio.MinioUtils;
 import com.ard.utils.DateUtils;
 import com.ard.utils.SpringTool;
 import com.ard.utils.mqtt.MqttConsumer;
@@ -133,7 +133,10 @@
                 publishMqtt(info);
                 break;
             case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
-                log.info("浜鸿劯妫�娴嬩簨浠�");
+                log.info("浜鸿劯妫�娴嬩簨浠朵笂鎶�");
+                break;
+            case HCNetSDK.COMM_GISINFO_UPLOAD:
+                log.info("GPS鎶ヨ淇℃伅涓婃姤");
                 break;
             default:
                 log.info("鏈煡鎶ヨ浜嬩欢绫诲瀷:lCommand:" + Integer.toHexString(lCommand));
diff --git a/src/main/java/com/ard/hiksdk/service/impl/HikClientUtil.java b/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
similarity index 97%
rename from src/main/java/com/ard/hiksdk/service/impl/HikClientUtil.java
rename to src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
index d0fb7f6..7ace4c1 100644
--- a/src/main/java/com/ard/hiksdk/service/impl/HikClientUtil.java
+++ b/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
@@ -1,10 +1,10 @@
-package com.ard.hiksdk.service.impl;
+package com.ard.utils.hiksdk.service.impl;
 
 import com.ard.alarm.camera.domain.ArdCameras;
 import com.ard.alarm.camera.domain.CameraCmd;
-import com.ard.hiksdk.common.GlobalVariable;
-import com.ard.hiksdk.util.hikSdkUtil.HCNetSDK;
-import com.ard.hiksdk.util.minio.MinioUtils;
+import com.ard.utils.hiksdk.common.GlobalVariable;
+import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
+import com.ard.utils.hiksdk.util.minio.MinioUtils;
 import com.sun.jna.Native;
 import com.sun.jna.Platform;
 import com.sun.jna.ptr.IntByReference;
@@ -14,7 +14,7 @@
 import java.nio.ByteBuffer;
 import java.util.*;
 
-import static com.ard.hiksdk.common.GlobalVariable.cameraMap;
+import static com.ard.utils.hiksdk.common.GlobalVariable.cameraMap;
 
 
 /**
diff --git a/src/main/java/com/ard/hiksdk/service/impl/LoginResultCallBack.java b/src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
similarity index 90%
rename from src/main/java/com/ard/hiksdk/service/impl/LoginResultCallBack.java
rename to src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
index 589391a..6f52be7 100644
--- a/src/main/java/com/ard/hiksdk/service/impl/LoginResultCallBack.java
+++ b/src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
@@ -1,8 +1,8 @@
-package com.ard.hiksdk.service.impl;
+package com.ard.utils.hiksdk.service.impl;
 
 import com.ard.alarm.camera.domain.ArdCameras;
-import com.ard.hiksdk.common.GlobalVariable;
-import com.ard.hiksdk.util.hikSdkUtil.HCNetSDK;
+import com.ard.utils.hiksdk.common.GlobalVariable;
+import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK;
 import com.sun.jna.Pointer;
 import lombok.extern.slf4j.Slf4j;
 
diff --git a/src/main/java/com/ard/hiksdk/util/hikSdkUtil/HCNetSDK.java b/src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java
similarity index 99%
rename from src/main/java/com/ard/hiksdk/util/hikSdkUtil/HCNetSDK.java
rename to src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java
index bc27556..23a6961 100644
--- a/src/main/java/com/ard/hiksdk/util/hikSdkUtil/HCNetSDK.java
+++ b/src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.util.hikSdkUtil;
+package com.ard.utils.hiksdk.util.hikSdkUtil;
 
 import com.sun.jna.*;
 import com.sun.jna.examples.win32.W32API;
@@ -899,6 +899,7 @@
     public static final int COMM_ALARM_V30 = 0x4000;//9000鎶ヨ淇℃伅涓诲姩涓婁紶
     public static final int COMM_ALARM_V40 = 0x4007;
     public static final int COMM_ALARM_RULE = 0x1102;//琛屼负鍒嗘瀽淇℃伅涓婁紶
+    public static final int COMM_GISINFO_UPLOAD = 0x4012;//GIS淇℃伅涓婁紶
     public static final int COMM_ALARM_PDC = 0x1103;//瀹㈡祦閲忕粺璁℃姤璀︿笂浼�
     public static final int COMM_UPLOAD_PLATE_RESULT = 0x2800;//浜ら�氭姄鎷嶇粨鏋滀笂浼�
     public static final int COMM_ITS_PLATE_RESULT = 0x3050;//浜ら�氭姄鎷嶇殑缁堢鍥剧墖涓婁紶
diff --git a/src/main/java/com/ard/hiksdk/util/hikSdkUtil/HIKSDKStructure.java b/src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HIKSDKStructure.java
similarity index 95%
rename from src/main/java/com/ard/hiksdk/util/hikSdkUtil/HIKSDKStructure.java
rename to src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HIKSDKStructure.java
index 0b853fb..087728e 100644
--- a/src/main/java/com/ard/hiksdk/util/hikSdkUtil/HIKSDKStructure.java
+++ b/src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HIKSDKStructure.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.util.hikSdkUtil;
+package com.ard.utils.hiksdk.util.hikSdkUtil;
 
 import com.sun.jna.Structure;
 
diff --git a/src/main/java/com/ard/hiksdk/util/imageUtil/waterMarkUtil.java b/src/main/java/com/ard/utils/hiksdk/util/imageUtil/waterMarkUtil.java
similarity index 98%
rename from src/main/java/com/ard/hiksdk/util/imageUtil/waterMarkUtil.java
rename to src/main/java/com/ard/utils/hiksdk/util/imageUtil/waterMarkUtil.java
index bc6263f..6d8dedb 100644
--- a/src/main/java/com/ard/hiksdk/util/imageUtil/waterMarkUtil.java
+++ b/src/main/java/com/ard/utils/hiksdk/util/imageUtil/waterMarkUtil.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.util.imageUtil;
+package com.ard.utils.hiksdk.util.imageUtil;
 
 /**
  * @ClassName WaterMarkUtil
diff --git a/src/main/java/com/ard/hiksdk/util/minio/MinioUtils.java b/src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java
similarity index 99%
rename from src/main/java/com/ard/hiksdk/util/minio/MinioUtils.java
rename to src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java
index e64662c..9e96035 100644
--- a/src/main/java/com/ard/hiksdk/util/minio/MinioUtils.java
+++ b/src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java
@@ -1,4 +1,4 @@
-package com.ard.hiksdk.util.minio;
+package com.ard.utils.hiksdk.util.minio;
 
 import com.ard.config.MinioClientSingleton;
 import io.minio.*;
diff --git a/src/main/java/com/ard/utils/mqtt/MqttConsumer.java b/src/main/java/com/ard/utils/mqtt/MqttConsumer.java
index ea2b31a..144e233 100644
--- a/src/main/java/com/ard/utils/mqtt/MqttConsumer.java
+++ b/src/main/java/com/ard/utils/mqtt/MqttConsumer.java
@@ -165,9 +165,9 @@
                 log.info("娑堟伅鍙戦�佹垚鍔�");
             }
         } catch (MqttPersistenceException e) {
-            e.printStackTrace();
+            log.error("mqtt鎸佷箙寮傚父锛�" + e.getMessage());
         } catch (MqttException e) {
-            e.printStackTrace();
+            log.error("mqtt寮傚父锛�" + e.getMessage());
         }
     }
 }
diff --git a/src/main/java/com/ard/utils/tcp/ClientHandler.java b/src/main/java/com/ard/utils/tcp/ClientHandler.java
new file mode 100644
index 0000000..c79496d
--- /dev/null
+++ b/src/main/java/com/ard/utils/tcp/ClientHandler.java
@@ -0,0 +1,444 @@
+package com.ard.utils.tcp;
+
+/**
+ * @Description:
+ * @ClassName: ClientHandler
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�05鏃�13:13
+ * @Version: 1.0
+ **/
+
+import com.alibaba.fastjson2.JSON;
+import com.ard.alarm.radar.domain.ArdAlarmRadar;
+import com.ard.alarm.radar.domain.ArdEquipRadar;
+import com.ard.alarm.radar.domain.RadarAlarmData;
+import com.ard.utils.ByteUtils;
+import com.ard.utils.GisUtils;
+import com.ard.utils.mqtt.MqttConsumer;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelId;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.xml.bind.DatatypeConverter;
+import java.net.InetSocketAddress;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 瀹㈡埛绔鐞嗗櫒
+ *
+ * @author lijiamin
+ */
+@Slf4j(topic = "netty")
+public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
+    private ChannelHandlerContext context;
+    private ScheduledFuture<?> heartbeatTask;
+
+    /**
+     * 杩炴帴寤虹珛
+     *
+     * @param ctx
+     * @throws Exception
+     */
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        context = ctx;
+        startHeartbeatTask();//寮�濮嬪彂閫佸績璺�
+    }
+
+    /**
+     * 杩炴帴鏂紑
+     *
+     * @param ctx
+     * @throws Exception
+     */
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+        ChannelId id = ctx.channel().id();
+        InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
+        int port = ipSocket.getPort();
+        String host = ipSocket.getHostString();
+        log.error("涓庤澶�" + host + ":" + port + "杩炴帴鏂紑!");
+        ArdEquipRadar ardEquipRadar = ClientInitialize.tureConnectMap.get(id);
+        // 杩炴帴鏂紑鍚庣殑鏈�鍚庡鐞�
+        ctx.pipeline().remove(this);
+        ctx.deregister();
+        ctx.close();
+
+        // 灏嗗け璐ヤ俊鎭彃鍏et闆嗗悎
+        ClientInitialize.falseConnectSet.add(ardEquipRadar);
+        super.channelInactive(ctx);
+    }
+
+    /**
+     * 閫氶亾鏁版嵁璇诲彇
+     * 涓氬姟鎿嶄綔
+     *
+     * @param ctx
+     * @param msg
+     * @throws Exception
+     */
+    @Override
+    public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
+        ChannelId id = ctx.channel().id();
+        ArdEquipRadar ardEquipRadar = ClientInitialize.tureConnectMap.get(id);
+        // 澶勭悊鎺ユ敹鍒扮殑娑堟伅
+        byte[] byteArray = new byte[msg.readableBytes()];
+        msg.getBytes(msg.readerIndex(), byteArray);
+        byte[] bytes = MessageParsing.receiveCompletePacket(byteArray);
+        if (bytes != null) {
+            processData(ardEquipRadar, bytes);
+        }
+    }
+
+    /**
+     * 閫氶亾鏁版嵁澶勭悊瀹屾垚
+     *
+     * @param ctx
+     * @throws Exception
+     */
+    @Override
+    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
+        super.channelReadComplete(ctx);
+    }
+
+    /**
+     * 浜嬩欢瑙﹀彂
+     *
+     * @param ctx
+     * @param evt
+     * @throws Exception
+     */
+    @Override
+    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
+        super.userEventTriggered(ctx, evt);
+    }
+
+    /**
+     * 寮傚父瑙﹀彂
+     *
+     * @param ctx
+     * @param cause
+     * @throws Exception
+     */
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+        // 鍙戠敓寮傚父鏃剁殑澶勭悊
+        cause.printStackTrace();
+        ctx.close();
+        stopHeartbeatTask();//鍋滄蹇冭烦鍙戦��
+    }
+
+    /**
+     * 寮�濮嬪績璺充换鍔�
+     */
+    private void startHeartbeatTask() {
+        heartbeatTask = context.executor().scheduleAtFixedRate(() -> {
+            // 鍙戦�佸績璺虫秷鎭�
+            ByteBuf message = context.alloc().buffer();
+            byte[] header = {0x01, 0x02, 0x01};
+            byte[] payload = {0x10, 0x00, 0x00, 0x00};
+            byte[] payloadCrc32 = ByteUtils.parseCrc32(payload);
+            byte[] footer = {0x01, 0x02, 0x00};
+            byte[] heart = ByteUtils.appendArrays(header, payload, payloadCrc32, footer);
+//            byte[] heart = {0x01, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, (byte) 0x83, (byte) 0x88, 0x5d, 0x71, 0x01, 0x02, 0x00};
+            String hexString = DatatypeConverter.printHexBinary(heart);
+            log.info("鍙戦�佸績璺�:" + hexString);
+            message.writeBytes(heart);
+            context.writeAndFlush(message);
+
+        }, 0, 5, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 鍋滄蹇冭烦浠诲姟
+     */
+    private void stopHeartbeatTask() {
+        if (heartbeatTask != null) {
+            heartbeatTask.cancel(false);
+            heartbeatTask = null;
+        }
+    }
+
+    /**
+     * 瑙f瀽鎶ヨ鏁版嵁
+     */
+    public void processData(ArdEquipRadar ardEquipRadarbyte, byte[] data) {
+        try {
+            String radarId = ardEquipRadarbyte.getId();
+            String radarName = ardEquipRadarbyte.getName();
+            Double radarLongitude = ardEquipRadarbyte.getLongitude();
+            Double radarLagitude = ardEquipRadarbyte.getLatitude();
+            //region crc鏍¢獙-鐩墠浠呯敤浜庢樉绀烘牎楠岀粨鏋�
+            Boolean crc32Check = MessageParsing.CRC32Check(data);
+            if (!crc32Check) {
+                log.info("CRC32鏍¢獙涓嶉�氳繃");
+            } else {
+                log.info("CRC32鏍¢獙閫氳繃");
+            }
+            //endregion
+            //log.info("鍘熷鏁版嵁:" + DatatypeConverter.printHexBinary(data));
+            //log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + altitude);
+            data = MessageParsing.transferData(data);//鍘绘帀鍖呭ご鍜屽寘灏俱�佹牎楠屽強杞箟
+            //region 璐熻浇澶磋В鏋�
+            byte[] type = Arrays.copyOfRange(data, 0, 1);//鍛戒护绫诲瀷
+            //  log.info("鍛戒护绫诲瀷:" + DatatypeConverter.printHexBinary(type));
+            byte[] cmdId = Arrays.copyOfRange(data, 1, 2);//鍛戒护ID
+            //  log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId));
+            byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬
+            payloadSize = ByteUtils.toLittleEndian(payloadSize);
+            int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize);
+            // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal);
+            //endregion
+            List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>();
+            String alarmTime = "";
+            Integer targetNum = 0;
+            if (Arrays.equals(cmdId, new byte[]{0x01})) {
+                //region 鍛婅淇℃伅鍙嶉
+                byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
+                dwTim = ByteUtils.toLittleEndian(dwTim);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                long l = ByteUtils.bytesToDecimal(dwTim);
+                alarmTime = sdf.format(l * 1000);
+                // log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime);
+
+                byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10);
+                wTargetNum = ByteUtils.toLittleEndian(wTargetNum);
+                targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                if (targetNum == 0) {
+                    return;
+                }
+                log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
+
+                //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟)
+                int uintSize = (payloadSizeToDecimal - 64) / targetNum;
+                // log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize);
+
+                for (int i = 0; i < targetNum; i++) {
+
+                    Integer index = 68 + uintSize * i;
+                    byte[] dwID = Arrays.copyOfRange(data, index, index + 4);
+                    // log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(cmdId));
+                    dwID = ByteUtils.toLittleEndian(dwID);
+                    int id = ByteUtils.bytesToDecimal(dwID);
+
+                    // log.info("鐩爣ID鍙凤細" + id);
+
+                    byte[] iDistance = Arrays.copyOfRange(data, index + 8, index + 12);
+                    iDistance = ByteUtils.toLittleEndian(iDistance);
+                    Double Distance = ByteUtils.bytesToDouble(iDistance);
+                    // log.info("鐩爣褰撳墠璺濈(m):" + Distance);
+                    //region 涓嶉渶瑕佺殑瀛楁
+//                    byte[] dwGSum = Arrays.copyOfRange(data, index + 4, index + 8);
+//                    dwGSum = toLittleEndian(dwGSum);
+//                    int GSum = byteArrayToDecimal(dwGSum);
+//                    log.info("鐩爣褰撳墠鍍忕礌鐏板害鍜岋細" + GSum);
+//                    byte[] iTw = Arrays.copyOfRange(data, index + 12, index + 16);
+//                    iTw = toLittleEndian(iTw);
+//                    int Tw = byteArrayToDecimal(iTw);
+//                    log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw);
+//
+//                    byte[] iTh = Arrays.copyOfRange(data, index + 16, index + 20);
+//                    iTh = toLittleEndian(iTh);
+//                    int Th = byteArrayToDecimal(iTh);
+//                    log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th);
+//
+//                    byte[] wPxlArea = Arrays.copyOfRange(data, index + 20, index + 22);
+//                    wPxlArea = toLittleEndian(wPxlArea);
+//                    int PxlArea = byteArrayToDecimal(wPxlArea);
+//                    log.info("鐩爣褰撳墠鍍忕礌闈㈢Н:" + PxlArea);
+//
+//                    byte[] cTrkNum = Arrays.copyOfRange(data, index + 22, index + 23);
+//                    cTrkNum = toLittleEndian(cTrkNum);
+//                    int TrkNum = byteArrayToDecimal(cTrkNum);
+//                    log.info("杞ㄨ抗鐐规暟:" + TrkNum);
+
+//                    byte[] sVx = Arrays.copyOfRange(data, index + 24, index + 26);
+//                    sVx = toLittleEndian(sVx);
+//                    int Vx = byteArrayToDecimal(sVx);
+//                    log.info("鐩爣褰撳墠閫熷害鐭㈤噺(鍍忕礌璺濈)X:" + Vx);
+//
+//                    byte[] sVy = Arrays.copyOfRange(data, index + 26, index + 28);
+//                    sVy = toLittleEndian(sVy);
+//                    int Vy = byteArrayToDecimal(sVy);
+//                    log.info("鐩爣褰撳墠閫熷害鐭㈤噺(鍍忕礌璺濈)Y:" + Vy);
+//
+//                    byte[] sAreaNo = Arrays.copyOfRange(data, index + 28, index + 30);
+//                    sAreaNo = toLittleEndian(sAreaNo);
+//                    int AreaNo = byteArrayToDecimal(sAreaNo);
+//                    log.info("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo);
+//
+//                    byte[] cGrp = Arrays.copyOfRange(data, index + 30, index + 31);
+//                    cGrp = toLittleEndian(cGrp);
+//                    int Grp = byteArrayToDecimal(cGrp);
+//                    log.info("鎵�灞炵粍:" + Grp);
+                    //endregion
+                    String alarmType = "";
+                    byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24);
+                    cStat = ByteUtils.toLittleEndian(cStat);
+                    String binaryString = String.format("%8s", Integer.toBinaryString(cStat[0] & 0xFF)).replace(' ', '0');
+                    // log.info("鐩爣褰撳墠鐘舵��:" + binaryString);
+                    // 鎻愬彇绗�4浣嶈嚦绗�6浣嶇殑鍊�
+                    int extractedValue = (cStat[0] >> 4) & 0b00001111;
+                    // 鍒ゆ柇鎻愬彇鐨勫��
+                    if (extractedValue == 0b0000) {
+                        alarmType = "杩愬姩鐩爣妫�娴�";
+                    } else if (extractedValue == 0b0001) {
+                        alarmType = "鐑簮妫�娴�";
+                    }
+                    // log.info("鎶ヨ绫诲瀷:" + alarmType);
+
+                    byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96);
+                    int position = ByteUtils.findIndexOfDoubleZero(szName);
+                    String alarmPointName;
+                    if (position != -1) {
+                        byte[] result = new byte[position];
+                        System.arraycopy(szName, 0, result, 0, position);
+                        alarmPointName = new String(result, "GBK");
+                    } else {
+                        alarmPointName = new String(szName, "GBK");
+                    }
+                    // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
+                    byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100);
+                    afTx = ByteUtils.toLittleEndian(afTx);
+                    float fTx = ByteUtils.bytesToFloat(afTx);
+                    //  log.info("姘村钩瑙掑害:" + fTx);
+                    byte[] afTy = Arrays.copyOfRange(data, index + 112, index + 116);
+                    afTy = ByteUtils.toLittleEndian(afTy);
+                    float fTy = ByteUtils.bytesToFloat(afTy);
+                    //  log.info("鍨傜洿瑙掑害:" + fTy);
+                    Double[] radarXY = {radarLagitude, radarLagitude};
+                    Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx);
+                    //  log.info("鎶ヨ淇℃伅锛�" + "銆恑d銆�" + id + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恉istance銆�" + Distance + "銆怭銆�" + fTx + "銆怲銆�" + fTy + "銆怷銆�" + alarmXY[0] + "銆怸銆�" + alarmXY[1]);
+                    ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
+                    ardAlarmRadar.setTargetId(id);
+                    ardAlarmRadar.setName(alarmPointName);
+                    ardAlarmRadar.setLongitude(alarmXY[0]);
+                    ardAlarmRadar.setLatitude(alarmXY[1]);
+                    ardAlarmRadar.setAlarmType(alarmType);
+                    radarAlarmInfos.add(ardAlarmRadar);
+                }
+                //endregion
+            }
+            if (Arrays.equals(cmdId, new byte[]{0x04})) {
+                //region鎶芥补鏈篈I鐘舵�佸弽棣�
+                String hexString = DatatypeConverter.printHexBinary(data);
+                //log.info(hexString);
+
+                byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
+                dwTim = ByteUtils.toLittleEndian(dwTim);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                long l = ByteUtils.bytesToDecimal(dwTim);
+                alarmTime = sdf.format(l * 1000);
+                //log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime);
+
+                byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10);
+                wTargetNum = ByteUtils.toLittleEndian(wTargetNum);
+                targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
+                if (targetNum == 0) {
+                    return;
+                }
+                //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟)
+                int uintSize = (payloadSizeToDecimal - 64) / targetNum;
+                //log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize);
+                for (int i = 0; i < targetNum; i++) {
+                    Integer index = 68 + uintSize * i;
+                    byte[] dwID = Arrays.copyOfRange(data, index, index + 4);
+                    //log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(dwID));
+                    dwID = ByteUtils.toLittleEndian(dwID);
+                    int id = ByteUtils.bytesToDecimal(dwID);
+                    //log.info("鐩爣ID鍙凤細" + id);
+                    //region 涓嶉渶瑕佺殑瀛楁
+                    byte[] iTw = Arrays.copyOfRange(data, index + 4, index + 8);
+                    iTw = ByteUtils.toLittleEndian(iTw);
+                    int Tw = ByteUtils.bytesToDecimal(iTw);
+                    // log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw);
+
+                    byte[] iTh = Arrays.copyOfRange(data, index + 8, index + 12);
+                    iTh = ByteUtils.toLittleEndian(iTh);
+                    int Th = ByteUtils.bytesToDecimal(iTh);
+                    //log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th);
+
+                    byte[] fTx = Arrays.copyOfRange(data, index + 12, index + 16);
+                    fTx = ByteUtils.toLittleEndian(fTx);
+                    float fTxAngle = ByteUtils.bytesToFloat(fTx);
+                    //log.info("p瑙掑害:" + fTxAngle);
+                    byte[] fTy = Arrays.copyOfRange(data, index + 16, index + 20);
+                    fTy = ByteUtils.toLittleEndian(fTy);
+                    float fTyAngle = ByteUtils.bytesToFloat(fTy);
+                    //log.info("t瑙掑害:" + fTyAngle);
+
+                    byte[] sAreaNo = Arrays.copyOfRange(data, index + 20, index + 22);
+                    sAreaNo = ByteUtils.toLittleEndian(sAreaNo);
+                    int AreaNo = ByteUtils.bytesToDecimal(sAreaNo);
+                    //log.info("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo);
+
+                    byte[] cGrp = Arrays.copyOfRange(data, index + 22, index + 23);
+                    cGrp = ByteUtils.toLittleEndian(cGrp);
+                    int Grp = ByteUtils.bytesToDecimal(cGrp);
+                    //log.info("鎵�灞炵粍:" + Grp);
+                    //endregion
+                    String alarmType;
+                    byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24);
+                    cStat = ByteUtils.toLittleEndian(cStat);
+                    //String binaryString = String.format("%8s", Integer.toBinaryString(cStat[0] & 0xFF)).replace(' ', '0');
+                    //log.info("鐩爣褰撳墠鐘舵��:" + binaryString);
+                    // 鎻愬彇绗�0浣嶅��
+                    // 浣跨敤浣嶈繍绠楁搷浣滃垽鏂0浣嶆槸鍚︿负1
+                    boolean isB0 = (cStat[0] & 0x01) == 0x00;
+                    // 鍒ゆ柇鎻愬彇鐨勫��
+                    if (isB0) {
+                        alarmType = "闆疯揪鎶芥补鏈哄仠鏈�";
+                    } else {
+                        continue;
+                    }
+                    //log.info("鎶ヨ绫诲瀷:" + alarmType);
+
+                    byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
+                    //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName));
+                    int position = ByteUtils.findIndexOfDoubleZero(szName);
+                    String alarmPointName;
+                    if (position != -1) {
+                        byte[] result = new byte[position];
+                        System.arraycopy(szName, 0, result, 0, position);
+                        alarmPointName = new String(result, "GBK");
+                    } else {
+                        alarmPointName = new String(szName, "GBK");
+                    }
+                    // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
+                    //log.info("鎶ヨ淇℃伅锛�" + "銆恑d銆�" + id + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime);
+                    ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
+                    ardAlarmRadar.setTargetId(id);
+                    ardAlarmRadar.setName(alarmPointName);
+                    ardAlarmRadar.setAlarmType(alarmType);
+                    radarAlarmInfos.add(ardAlarmRadar);
+                }
+                //endregion
+            }
+            if (StringUtils.isEmpty(alarmTime)) {
+                return;
+            }
+            if (targetNum == 0) {
+                return;
+            }
+            RadarAlarmData radarAlarmData = new RadarAlarmData();
+            radarAlarmData.setRadarId(radarId);
+            radarAlarmData.setRadarName(radarName);
+            radarAlarmData.setAlarmTime(alarmTime);
+            radarAlarmData.setArdAlarmRadars(radarAlarmInfos);
+            MqttConsumer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData));
+        } catch (Exception ex) {
+            log.error("闆疯揪鎶ユ枃瑙f瀽寮傚父:" + ex.getMessage());
+        }
+    }
+
+}
diff --git a/src/main/java/com/ard/utils/tcp/ClientInitialize.java b/src/main/java/com/ard/utils/tcp/ClientInitialize.java
new file mode 100644
index 0000000..0fa3d9e
--- /dev/null
+++ b/src/main/java/com/ard/utils/tcp/ClientInitialize.java
@@ -0,0 +1,136 @@
+package com.ard.utils.tcp;
+
+/**
+ * @Description:
+ * @ClassName: init
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�07鏈�05鏃�13:11
+ * @Version: 1.0
+ **/
+
+import com.ard.alarm.radar.domain.ArdEquipRadar;
+import com.ard.alarm.radar.service.IArdEquipRadarService;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.function.Consumer;
+
+/**
+ * 瀹㈡埛绔垵濮嬪寲
+ *
+ * @author lijiamin
+ */
+@Component
+@Slf4j(topic = "netty")
+public class ClientInitialize {
+
+    @Resource
+    IArdEquipRadarService ardEquipRadarService;
+
+    @Value("${spring.netty.tcp.enabled}")
+    private Boolean tcpClientEnable;
+
+    private Bootstrap bootstrap;
+    public static CopyOnWriteArraySet<ArdEquipRadar> falseConnectSet = new CopyOnWriteArraySet();
+    public static ConcurrentHashMap<ChannelId, ArdEquipRadar> tureConnectMap = new ConcurrentHashMap();
+
+    /**
+     * Netty鍒濆鍖栭厤缃�
+     */
+    public void initNettyTcp() {
+        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+        bootstrap = new Bootstrap();
+        bootstrap.group(eventLoopGroup)
+                .channel(NioSocketChannel.class)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .handler(new ChannelInitializer<SocketChannel>() {
+                    @Override
+                    protected void initChannel(SocketChannel socketChannel) {
+                        socketChannel.pipeline().addLast(new ClientHandler());
+                    }
+                });
+
+        // 寮傛鎸佺画鐩戝惉杩炴帴澶辫触鐨勫湴鍧�
+        CompletableFuture.runAsync(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        if (falseConnectSet.size() != 0) {
+                            // 寰幆闆嗗悎鍐呭厓绱�
+                            falseConnectSet.forEach(new Consumer<ArdEquipRadar>() {
+                                @Override
+                                public void accept(ArdEquipRadar ardEquipRadar) {
+                                    connectServer(ardEquipRadar);
+                                }
+                            });
+                        }
+                        Thread.sleep(3000);
+                    } catch (Exception e) {
+                        log.error("Netty鍒濆鍖栭厤缃洃鍚湴鍧�鍑虹幇寮傚父");
+                        e.printStackTrace();
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 鏈嶅姟杩炴帴
+     *
+     * @param ardEquipRadar
+     */
+    public void connectServer(ArdEquipRadar ardEquipRadar) {
+        // 鑾峰彇鍦板潃鍙婄鍙�
+        String host = ardEquipRadar.getIp();
+        Integer port = ardEquipRadar.getPort();
+        // 寮傛杩炴帴tcp鏈嶅姟绔�
+        bootstrap.remoteAddress(host, port).connect().addListener((ChannelFuture futureListener) -> {
+            if (!futureListener.isSuccess()) {
+                log.error(host + ":" + port + "闆疯揪TCP鏈嶅姟绔繛鎺ュけ璐�");
+                futureListener.channel().close();
+                // 杩炴帴澶辫触淇℃伅鎻掑叆Set
+                falseConnectSet.add(ardEquipRadar);
+                // 杩炴帴澶辫触淇℃伅浠巑ap绉婚櫎
+                tureConnectMap.remove(futureListener.channel().id());
+            } else {
+                log.info(host + ":" + port + "闆疯揪TCP鏈嶅姟绔繛鎺ユ垚鍔�");
+                // 杩炴帴鎴愬姛淇℃伅浠嶴et鎷旈櫎
+                falseConnectSet.remove(ardEquipRadar);
+                // 杩炴帴鎴愬姛淇℃伅鍐欏叆map
+                tureConnectMap.put(futureListener.channel().id(), ardEquipRadar);
+            }
+        });
+    }
+
+    /**
+     * 鍒濆鍖栨柟娉�
+     */
+    @PostConstruct
+    public void initialize() {
+        if (!tcpClientEnable) {
+            return;
+        }
+        initNettyTcp();//鍒濆鍖杗ettyTcp
+        List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
+        for (ArdEquipRadar ardEquipRadar : ardEquipRadars) {
+            String host = ardEquipRadar.getIp();
+            Integer port = Integer.valueOf(ardEquipRadar.getPort());
+            log.info("TCP瀹㈡埛绔皾璇曡繛鎺ワ細" + host + ":" + port);
+            connectServer(ardEquipRadar);//杩炴帴姣忎竴涓浄杈炬湇鍔�
+        }
+    }
+}
diff --git a/src/main/java/com/ard/utils/tcp/MessageParsing.java b/src/main/java/com/ard/utils/tcp/MessageParsing.java
index 14aa3c5..e468e9d 100644
--- a/src/main/java/com/ard/utils/tcp/MessageParsing.java
+++ b/src/main/java/com/ard/utils/tcp/MessageParsing.java
@@ -1,5 +1,7 @@
 package com.ard.utils.tcp;
 
+import com.ard.utils.ByteUtils;
+
 import javax.xml.bind.DatatypeConverter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -44,6 +46,36 @@
     }
 
     /**
+     * crc32鏍¢獙妫�鏌�
+     * 鍒樿嫃涔�
+     * 2023/7/4 11:24
+     */
+    public static Boolean CRC32Check(byte[] packet) {
+        //System.out.println(DatatypeConverter.printHexBinary(packet));
+        int headerLength = 3;//鍖呭ご3涓瓧鑺�
+        int footerLength = 3;//鍖呭熬3涓瓧鑺�
+        int crcLength = 4;//crc鏍¢獙4涓瓧鑺�
+        //鍘绘帀鍖呭ご鍖呭熬
+        byte[] payloadCrc32 = ByteUtils.removeHeaderAndFooter(packet, headerLength, footerLength);
+        //System.out.println(DatatypeConverter.printHexBinary(payloadCrc32));
+        //鑾峰彇鍒版暟鎹惡甯︾殑crc32鍊�
+        byte[] oldCrc32 = ByteUtils.getLastBytes(payloadCrc32, crcLength);
+        //鍘绘帀鍖呭ご鍖呭熬crc32瀛楄妭锛屼粎淇濈暀璐熻浇
+        byte[] payload = ByteUtils.removeHeaderFooterAndCRC(packet, headerLength, footerLength, crcLength);
+       // System.out.println(DatatypeConverter.printHexBinary(payload));
+        //璁$畻璐熻浇鐨刢rc32鍊�
+        byte[] NewCrc32 = ByteUtils.parseCrc32(payload);
+        System.out.println("old:"+DatatypeConverter.printHexBinary(oldCrc32));
+        System.out.println("new:"+DatatypeConverter.printHexBinary(NewCrc32));
+        //鍒ゆ柇鏁版嵁鐨刢rc32鏍¢獙鍊煎拰璁$畻鍊兼槸鍚︾浉鍚�
+        if (Arrays.equals(oldCrc32, NewCrc32)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
      * 鑾峰彇鍖呯粨鏉熺储寮�
      */
     public static int findPacketEndIndex(List<Byte> buffer, byte[] packetEnd) {
@@ -78,8 +110,10 @@
      * 鍘绘帀鍖呭ご鍜屽寘灏炬牎楠屽強杞箟
      */
     public static byte[] transferData(byte[] data) {
-        data = Arrays.copyOfRange(data, 3, data.length);
-        data = Arrays.copyOfRange(data, 0, data.length - 7);
+        int headerLength = 3;//鍖呭ご3涓瓧鑺�
+        int footerLength = 3;//鍖呭熬3涓瓧鑺�
+        int crcLength = 4;//crc鏍¢獙4涓瓧鑺�
+        data= ByteUtils.removeHeaderFooterAndCRC(data,headerLength,footerLength,crcLength);
         String dataStr = DatatypeConverter.printHexBinary(data);
         if (dataStr.contains("01020201")) {//杞箟01020201
             dataStr = dataStr.replaceAll("01020201", "010201");
diff --git a/src/main/java/com/ard/utils/tcp/NettyTcpClient.java b/src/main/java/com/ard/utils/tcp/NettyTcpClient.java
index 2eab8e2..464bba5 100644
--- a/src/main/java/com/ard/utils/tcp/NettyTcpClient.java
+++ b/src/main/java/com/ard/utils/tcp/NettyTcpClient.java
@@ -16,7 +16,7 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * @Description:
+ * @Description: 鍙︿竴绉峵cp瀹㈡埛绔� 鐩墠寮冪敤
  * @ClassName: NettyTcpClient
  * @Author: 鍒樿嫃涔�
  * @Date: 2023骞�06鏈�25鏃�17:00
@@ -24,11 +24,10 @@
  **/
 @EnableAsync
 @Component
-@Slf4j(topic = "radar")
+@Slf4j(topic = "netty")
 public class NettyTcpClient {
-    @Async
+    @Async("alarm")
     public void init(ArdEquipRadar ardEquipRadar) {
-
         while (true) {
             NioEventLoopGroup group = new NioEventLoopGroup();
             try {
diff --git a/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java b/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
index fa6016c..37d339e 100644
--- a/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
+++ b/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
@@ -11,20 +11,22 @@
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.SimpleChannelInboundHandler;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import javax.xml.bind.DatatypeConverter;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
+
 /**
- * @Description: tcp瀹㈡埛绔鐞�
+ * @Description: tcp瀹㈡埛绔鐞�-寮冪敤
  * @ClassName: NettyTcpClientHandler
  * @Author: 鍒樿嫃涔�
  * @Date: 2023骞�06鏈�25鏃�17:02
  * @Version: 1.0
  **/
-@Slf4j(topic = "radar")
+@Slf4j(topic = "netty")
 public class NettyTcpClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
 
     private String host;
@@ -72,7 +74,12 @@
         heartbeatTask = context.executor().scheduleAtFixedRate(() -> {
             // 鍙戦�佸績璺虫秷鎭�
             ByteBuf message = context.alloc().buffer();
-            byte[] heart = {0x01, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, (byte) 0x83, (byte) 0x88, 0x5d, 0x71, 0x01, 0x02, 0x00};
+            byte[] header = {0x01, 0x02, 0x01};
+            byte[] payload = {0x10, 0x00, 0x00, 0x00};
+            byte[] payloadCrc32 = ByteUtils.parseCrc32(payload);
+            byte[] footer = {0x01, 0x02, 0x00};
+            byte[] heart = ByteUtils.appendArrays(header, payload, payloadCrc32, footer);
+//            byte[] heart = {0x01, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, (byte) 0x83, (byte) 0x88, 0x5d, 0x71, 0x01, 0x02, 0x00};
             String hexString = DatatypeConverter.printHexBinary(heart);
             log.info("鍙戦�佸績璺�:" + hexString);
             message.writeBytes(heart);
@@ -105,23 +112,32 @@
      */
     public void processData(byte[] data) {
         try {
+            //region crc鏍¢獙-鐩墠浠呯敤浜庢樉绀烘牎楠岀粨鏋�
+            Boolean crc32Check = MessageParsing.CRC32Check(data);
+            if (!crc32Check) {
+                log.info("CRC32鏍¢獙涓嶉�氳繃");
+            } else {
+                log.info("CRC32鏍¢獙閫氳繃");
+            }
+            //endregion
             //log.info("鍘熷鏁版嵁:" + DatatypeConverter.printHexBinary(data));
-            log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + altitude);
+            //log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + altitude);
             data = MessageParsing.transferData(data);//鍘绘帀鍖呭ご鍜屽寘灏俱�佹牎楠屽強杞箟
-
+            //region 璐熻浇澶磋В鏋�
             byte[] type = Arrays.copyOfRange(data, 0, 1);//鍛戒护绫诲瀷
             //  log.info("鍛戒护绫诲瀷:" + DatatypeConverter.printHexBinary(type));
-
             byte[] cmdId = Arrays.copyOfRange(data, 1, 2);//鍛戒护ID
             //  log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId));
-
             byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬
             payloadSize = ByteUtils.toLittleEndian(payloadSize);
             int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize);
             // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal);
+            //endregion
             List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>();
-            String alarmTime="";
+            String alarmTime = "";
+            Integer targetNum = 0;
             if (Arrays.equals(cmdId, new byte[]{0x01})) {
+                //region 鍛婅淇℃伅鍙嶉
                 byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
                 dwTim = ByteUtils.toLittleEndian(dwTim);
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -131,8 +147,11 @@
 
                 byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10);
                 wTargetNum = ByteUtils.toLittleEndian(wTargetNum);
-                int targetNum = ByteUtils.bytesToDecimal(wTargetNum);
-                //log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
+                targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                if (targetNum == 0) {
+                    return;
+                }
+                log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
 
                 //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟)
                 int uintSize = (payloadSizeToDecimal - 64) / targetNum;
@@ -213,7 +232,7 @@
                     // log.info("鎶ヨ绫诲瀷:" + alarmType);
 
                     byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96);
-                    int position = findIndexOfDoubleZero(szName);
+                    int position = ByteUtils.findIndexOfDoubleZero(szName);
                     String alarmPointName;
                     if (position != -1) {
                         byte[] result = new byte[position];
@@ -242,10 +261,11 @@
                     ardAlarmRadar.setAlarmType(alarmType);
                     radarAlarmInfos.add(ardAlarmRadar);
                 }
-
+                //endregion
             }
             if (Arrays.equals(cmdId, new byte[]{0x04})) {
-                //String hexString = DatatypeConverter.printHexBinary(data);
+                //region鎶芥补鏈篈I鐘舵�佸弽棣�
+                String hexString = DatatypeConverter.printHexBinary(data);
                 //log.info(hexString);
 
                 byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
@@ -257,9 +277,11 @@
 
                 byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10);
                 wTargetNum = ByteUtils.toLittleEndian(wTargetNum);
-                int targetNum = ByteUtils.bytesToDecimal(wTargetNum);
-                //log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
-
+                targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
+                if (targetNum == 0) {
+                    return;
+                }
                 //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟)
                 int uintSize = (payloadSizeToDecimal - 64) / targetNum;
                 //log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize);
@@ -307,9 +329,9 @@
                     //log.info("鐩爣褰撳墠鐘舵��:" + binaryString);
                     // 鎻愬彇绗�0浣嶅��
                     // 浣跨敤浣嶈繍绠楁搷浣滃垽鏂0浣嶆槸鍚︿负1
-                    boolean isBitSet = (cStat[0] & 0x01) == 0x00;
+                    boolean isB0 = (cStat[0] & 0x01) == 0x00;
                     // 鍒ゆ柇鎻愬彇鐨勫��
-                    if (isBitSet) {
+                    if (isB0) {
                         alarmType = "闆疯揪鎶芥补鏈哄仠鏈�";
                     } else {
                         continue;
@@ -318,7 +340,7 @@
 
                     byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
                     //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName));
-                    int position = findIndexOfDoubleZero(szName);
+                    int position = ByteUtils.findIndexOfDoubleZero(szName);
                     String alarmPointName;
                     if (position != -1) {
                         byte[] result = new byte[position];
@@ -335,6 +357,13 @@
                     ardAlarmRadar.setAlarmType(alarmType);
                     radarAlarmInfos.add(ardAlarmRadar);
                 }
+                //endregion
+            }
+            if (StringUtils.isEmpty(alarmTime)) {
+                return;
+            }
+            if (targetNum == 0) {
+                return;
             }
             RadarAlarmData radarAlarmData = new RadarAlarmData();
             radarAlarmData.setRadarId(id);
@@ -345,18 +374,6 @@
         } catch (Exception ex) {
             log.error("闆疯揪鎶ユ枃瑙f瀽寮傚父:" + ex.getMessage());
         }
-    }
-
-    /**
-     * 鎵惧埌00鐨勭储寮曚綅缃�
-     */
-    private int findIndexOfDoubleZero(byte[] bytes) {
-        for (int i = 0; i < bytes.length - 1; i++) {
-            if (bytes[i] == 0x00) {
-                return i;
-            }
-        }
-        return -1;
     }
 
 }
diff --git a/src/main/java/com/ard/utils/udp/NettyUdpServer.java b/src/main/java/com/ard/utils/udp/NettyUdpServer.java
index 724458d..caa5a8e 100644
--- a/src/main/java/com/ard/utils/udp/NettyUdpServer.java
+++ b/src/main/java/com/ard/utils/udp/NettyUdpServer.java
@@ -18,9 +18,8 @@
     /**
      * 鍚姩鏈嶅姟
      */
-    @Async
+    @Async("alarm")
     public void init(int port) {
-
         //琛ㄧず鏈嶅姟鍣ㄨ繛鎺ョ洃鍚嚎绋嬬粍锛屼笓闂ㄦ帴鍙� accept 鏂扮殑瀹㈡埛绔痗lient 杩炴帴
         EventLoopGroup bossLoopGroup = new NioEventLoopGroup();
         try {
@@ -40,7 +39,7 @@
             //7銆佺洃鍚�氶亾鍏抽棴浜嬩欢锛屽簲鐢ㄧ▼搴忎細涓�鐩寸瓑寰咃紝鐩村埌channel鍏抽棴
             channelFuture.channel().closeFuture().sync();
         } catch (Exception e) {
-            log.error("error:"+e.getMessage());
+            log.error("error:" + e.getMessage());
         } finally {
             log.info("netty udp close!");
             //8 鍏抽棴EventLoopGroup锛�
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 50a9b71..2f6c991 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,11 +1,34 @@
 spring:
+  datasource:
+      #  浣跨敤druid鏁版嵁搴撹繛鎺ユ睜
+    druid:
+        #寮�鍚痙ruid鐩戞帶web
+      stat-view-servlet:
+        enabled: true
+      driver-class-name: org.postgresql.Driver
+          #    url: jdbc:postgresql://111.40.46.199:15432/ry-vue?stringtype=unspecified
+          #    username: postgres
+          #    password: Yykj.2021
+      url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified
+      username: postgres
+      password: postgres
+      #鏈�澶ц繛鎺ユ暟
+      maxActive: 30
+      #鏈�灏忚繛鎺ユ暟
+      minIdle: 5
+      #鑾峰彇杩炴帴鐨勬渶澶х瓑寰呮椂闂�
+      maxWait: 10000
+      #瑙e喅mysql8灏忔椂鐨勯棶棰�
+      validation-query: SELECT 'X'
+      #绌洪棽杩炴帴鐨勬鏌ユ椂闂撮棿闅�
+      timeBetweenEvictionRunsMillis: 60000
+      #绌洪棽杩炴帴鏈�灏忕┖闂叉椂闂�
+      minEvictableIdleTimeMillis: 300000
   netty:
     udp:
       port: 40000
       enabled: true
     tcp:
-      host: 112.98.126.2
-      port: 1200
       enabled: true
   mqtt:
     host: tcp://192.168.1.15:1883
@@ -18,14 +41,6 @@
     enabled: true
   stealelec:
     url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil
-  datasource:
-    driver-class-name: org.postgresql.Driver
-#    url: jdbc:postgresql://111.40.46.199:15432/ry-vue?stringtype=unspecified
-#    username: postgres
-#    password: Yykj.2021
-    url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified
-    username: postgres
-    password: postgres
 mybatis:
   typeAliasesPackage: com.ard.alarm.**.domain
   mapperLocations: classpath:/mapper/*.xml
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 390b765..02e95f2 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -76,13 +76,35 @@
             <onMismatch>DENY</onMismatch>
         </filter>
     </appender>
-    <!--闆疯揪鎶ヨ鏃ュ織杈撳嚭-->
-    <appender name="radar" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${log.path}/radar.log</file>
+    <!--Netty鏃ュ織杈撳嚭-->
+    <appender name="netty" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/netty.log</file>
         <!--寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠�-->
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!--鏃ュ織鏂囦欢鍚嶆牸寮�-->
-            <fileNamePattern>${log.path}/radar.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${log.path}/netty.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!--鏃ュ織鏈�澶х殑鍘嗗彶60澶�-->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!--杩囨护鐨勭骇鍒�-->
+            <level>INFO</level>
+            <!--鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛�-->
+            <onMatch>ACCEPT</onMatch>
+            <!--涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛�-->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!--Mqtt鏃ュ織杈撳嚭-->
+    <appender name="mqtt" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/mqtt.log</file>
+        <!--寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠�-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--鏃ュ織鏂囦欢鍚嶆牸寮�-->
+            <fileNamePattern>${log.path}/mqtt.%d{yyyy-MM-dd}.log</fileNamePattern>
             <!--鏃ュ織鏈�澶х殑鍘嗗彶60澶�-->
             <maxHistory>60</maxHistory>
         </rollingPolicy>
@@ -106,16 +128,20 @@
         <appender-ref ref="sys-info"/>
     </root>
     <!--绠$嚎娉勯湶鎶ヨ鎿嶄綔鏃ュ織-->
-    <root level="INFO">
+    <logger name="tube" level="INFO">
         <appender-ref ref="tube"/>
-    </root>
+    </logger>
     <!--閫氱敤鍏夌數鎶ヨ鎿嶄綔鏃ュ織-->
-    <root level="INFO">
+    <logger name="camera" level="INFO">
         <appender-ref ref="camera"/>
-    </root>
-    <!--闆疯揪鎶ヨ鏃ュ織-->
-    <root level="INFO">
-        <appender-ref ref="radar"/>
-    </root>
+    </logger>
+    <!--Netty鏃ュ織-->
+    <logger name="netty"  level="INFO">
+        <appender-ref ref="netty"/>
+    </logger>
+    <!--Mqtt鏃ュ織-->
+    <logger name="mqtt"  level="INFO">
+        <appender-ref ref="mqtt"/>
+    </logger>
 </configuration>
 

--
Gitblit v1.9.3