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> <!--海康å½åæºäºæ¬¡å¼åä¾èµjarå --> <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> 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; 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 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") src/main/java/com/ard/config/AsyncConfiguration.java
ÎļþÃû´Ó src/main/java/com/ard/async/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); 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è¿æ¥æ± çé ç½®,é ç½®å¦ä½å¤çæ ¢sqlï¼ * @ClassName: DruidConfig * @Author: åèä¹ * @Date: 2023å¹´07æ04æ¥15:29 * @Version: 1.0 **/ @Configuration public class DruidConfig { //è¿ä¸ªæ³¨è§£è¯»åé ç½®æä»¶åç¼ä¸ºprefixçé ç½®ï¼å°å¤é¨çé ç½®æä»¶ä¸è¿éç»å® @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æ³¨è§£ï¼æä¸ºspringçbeanï¼å©ç¨filterå°æ ¢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/*"); // } } 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(); } } 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åè转Hex * * @param b åè * @return Hex */ public static String byteToHex(byte b) { public static String byteToHex(byte b) { String hexString = Integer.toHexString(b & 0xFF); //ç±äºåå è¿å¶æ¯ç±0~9ãA~Fæ¥è¡¨ç¤º1~16ï¼æä»¥å¦æByteè½¬æ¢æHexå妿æ¯<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æ°ç»è½¬float */ @@ -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转byteæ°ç» */ 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; } } 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(); } } src/main/java/com/ard/utils/hiksdk/common/GlobalVariable.java
ÎļþÃû´Ó src/main/java/com/ard/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; src/main/java/com/ard/utils/hiksdk/domain/alarmEventInfo.java
ÎļþÃû´Ó src/main/java/com/ard/hiksdk/domain/alarmEventInfo.java ÐÞ¸Ä @@ -1,4 +1,4 @@ package com.ard.hiksdk.domain; package com.ard.utils.hiksdk.domain; import lombok.Data; src/main/java/com/ard/utils/hiksdk/domain/recordInfo.java
ÎļþÃû´Ó src/main/java/com/ard/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; src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java
ÎļþÃû´Ó src/main/java/com/ard/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)); src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java
ÎļþÃû´Ó src/main/java/com/ard/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; /** src/main/java/com/ard/utils/hiksdk/service/impl/LoginResultCallBack.java
ÎļþÃû´Ó src/main/java/com/ard/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; src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HCNetSDK.java
ÎļþÃû´Ó src/main/java/com/ard/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;//äº¤éææçç»ç«¯å¾çä¸ä¼ src/main/java/com/ard/utils/hiksdk/util/hikSdkUtil/HIKSDKStructure.java
ÎļþÃû´Ó src/main/java/com/ard/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; src/main/java/com/ard/utils/hiksdk/util/imageUtil/waterMarkUtil.java
ÎļþÃû´Ó src/main/java/com/ard/hiksdk/util/imageUtil/waterMarkUtil.java ÐÞ¸Ä @@ -1,4 +1,4 @@ package com.ard.hiksdk.util.imageUtil; package com.ard.utils.hiksdk.util.imageUtil; /** * @ClassName WaterMarkUtil src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java
ÎļþÃû´Ó src/main/java/com/ard/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.*; 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()); } } } 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(); // å°å¤±è´¥ä¿¡æ¯æå ¥Setéå 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; } } /** * è§£ææ¥è¦æ°æ® */ 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 + "ãportã" + port + "ãXã" + longitude + "ãYã" + lagitude + "ãZã" + 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("å¨è§å¾åçåºç°æ¶é´(转date):" + alarmTime); byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); wTargetNum = ByteUtils.toLittleEndian(wTargetNum); targetNum = ByteUtils.bytesToDecimal(wTargetNum); if (targetNum == 0) { return; } log.info("ç®æ æ»ç¹æ°(转æ´å):" + targetNum); //è§£æNET_TARGET_UNIT(64æ¯NET_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("æ¥è¦ä¿¡æ¯ï¼" + "ãidã" + id + "ãnameã" + alarmPointName + "ãalarmTypeã" + alarmType + "ãalarmTimeã" + alarmTime + "ãdistanceã" + Distance + "ãPã" + fTx + "ãTã" + fTy + "ãXã" + alarmXY[0] + "ãYã" + 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æ½æ²¹æºAIç¶æåé¦ 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("å¨è§å¾åçåºç°æ¶é´(转date):" + alarmTime); byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10); wTargetNum = ByteUtils.toLittleEndian(wTargetNum); targetNum = ByteUtils.bytesToDecimal(wTargetNum); log.info("ç®æ æ»ç¹æ°(转æ´å):" + targetNum); if (targetNum == 0) { return; } //è§£æNET_TARGET_UNIT(64æ¯NET_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("æ¥è¦ä¿¡æ¯ï¼" + "ãidã" + id + "ãnameã" + alarmPointName + "ãalarmTypeã" + alarmType + "ãalarmTimeã" + 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("é·è¾¾æ¥æè§£æå¼å¸¸:" + ex.getMessage()); } } } 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); // è¿æ¥å¤±è´¥ä¿¡æ¯ä»mapç§»é¤ tureConnectMap.remove(futureListener.channel().id()); } else { log.info(host + ":" + port + "é·è¾¾TCPæå¡ç«¯è¿æ¥æå"); // è¿æ¥æåä¿¡æ¯ä»Setæé¤ falseConnectSet.remove(ardEquipRadar); // è¿æ¥æåä¿¡æ¯åå ¥map tureConnectMap.put(futureListener.channel().id(), ardEquipRadar); } }); } /** * åå§åæ¹æ³ */ @PostConstruct public void initialize() { if (!tcpClientEnable) { return; } initNettyTcp();//åå§ånettyTcp 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);//è¿æ¥æ¯ä¸ä¸ªé·è¾¾æå¡ } } } 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)); //计ç®è´è½½çcrc32å¼ byte[] NewCrc32 = ByteUtils.parseCrc32(payload); System.out.println("old:"+DatatypeConverter.printHexBinary(oldCrc32)); System.out.println("new:"+DatatypeConverter.printHexBinary(NewCrc32)); //å¤ææ°æ®çcrc32æ ¡éªå¼å计ç®å¼æ¯å¦ç¸å 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"); src/main/java/com/ard/utils/tcp/NettyTcpClient.java
@@ -16,7 +16,7 @@ import java.util.concurrent.TimeUnit; /** * @Description: * @Description: å¦ä¸ç§tcp客æ·ç«¯ ç®åå¼ç¨ * @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 { 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 + "ãportã" + port + "ãXã" + longitude + "ãYã" + lagitude + "ãZã" + altitude); //log.info("é·è¾¾ä¿¡æ¯ï¼" + host + "ãportã" + port + "ãXã" + longitude + "ãYã" + lagitude + "ãZã" + 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); //è§£æNET_TARGET_UNIT(64æ¯NET_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æ½æ²¹æºAIç¶æåé¦ 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; } //è§£æNET_TARGET_UNIT(64æ¯NET_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("é·è¾¾æ¥æè§£æå¼å¸¸:" + 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; } } src/main/java/com/ard/utils/udp/NettyUdpServer.java
@@ -18,9 +18,8 @@ /** * å¯å¨æå¡ */ @Async @Async("alarm") public void init(int port) { //表示æå¡å¨è¿æ¥çå¬çº¿ç¨ç»ï¼ä¸é¨æ¥å accept æ°ç客æ·ç«¯client è¿æ¥ 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ï¼ src/main/resources/application.yml
@@ -1,11 +1,34 @@ spring: datasource: # 使ç¨druidæ°æ®åºè¿æ¥æ± druid: #å¼å¯druidçæ§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 #è§£å³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 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>