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