From 6474b923d8f6d8ea5e5b63277f18335136c7e33c Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期一, 04 十二月 2023 11:24:16 +0800
Subject: [PATCH] 增加动态客户端备用代码 优化雷达追踪引导 优化打印日志

---
 src/main/java/com/ard/utils/tcp/ClientHandler.java            |   25 +
 src/main/java/com/ard/alarm/radar/domain/RadarAlarmData.java  |    2 
 src/main/java/com/ard/utils/tcp/DynamicClient.java            |  150 +++++++++++++
 src/main/java/com/ard/utils/other/ByteUtils.java              |    7 
 src/main/java/com/ard/utils/tcp/DynamicClientHandler.java     |  437 +++++++++++++++++++++++++++++++++++++++
 src/main/java/com/ard/utils/tcp/DynamicClientInitializer.java |   25 ++
 src/main/java/com/ard/utils/tcp/ClientInitialize.java         |    2 
 7 files changed, 635 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/ard/alarm/radar/domain/RadarAlarmData.java b/src/main/java/com/ard/alarm/radar/domain/RadarAlarmData.java
index e6269d5..8cf17ec 100644
--- a/src/main/java/com/ard/alarm/radar/domain/RadarAlarmData.java
+++ b/src/main/java/com/ard/alarm/radar/domain/RadarAlarmData.java
@@ -17,5 +17,5 @@
     String radarName;
     String alarmTime;
     List<ArdAlarmRadar> ardAlarmRadars;
-    ArdAlarmRadar ardFollowRadar;
+    List<ArdAlarmRadar> ardFollowRadars;
 }
diff --git a/src/main/java/com/ard/utils/other/ByteUtils.java b/src/main/java/com/ard/utils/other/ByteUtils.java
index 0c11f68..fe2ab19 100644
--- a/src/main/java/com/ard/utils/other/ByteUtils.java
+++ b/src/main/java/com/ard/utils/other/ByteUtils.java
@@ -189,7 +189,12 @@
         // System.out.print("鏍¢獙:"+DatatypeConverter.printHexBinary(bytes));//鎵撳嵃crc32鐨勬牎楠屽��
         return bytes;
     }
-
+    /**
+     * byte杞簩杩涘埗瀛楃涓�
+     */
+    public static String byteToBitString(byte b) {
+        return String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
+    }
     /**
      * 鍘婚櫎鍖呭ご鍖呭熬
      * 鍒樿嫃涔�
diff --git a/src/main/java/com/ard/utils/tcp/ClientHandler.java b/src/main/java/com/ard/utils/tcp/ClientHandler.java
index 2f62a5f..a032d57 100644
--- a/src/main/java/com/ard/utils/tcp/ClientHandler.java
+++ b/src/main/java/com/ard/utils/tcp/ClientHandler.java
@@ -188,7 +188,8 @@
             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));
+            String cmdIdStr=DatatypeConverter.printHexBinary(cmdId);
+            //log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId));
             byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬
             payloadSize = toLittleEndian(payloadSize);
             //log.info("payloadSize:" + DatatypeConverter.printHexBinary(payloadSize));
@@ -196,11 +197,12 @@
             // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal);
             //endregion
             List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>();
-            ArdAlarmRadar radarFollowInfo = null;
+            List<ArdAlarmRadar> radarFollowInfos = new ArrayList<>();
             //鎶芥补鏈虹姸鎬侀浄杈炬帹閫侀泦鍚�
             List<ArdAlarmRadar> well = new ArrayList<>();
             String alarmTime = "";
             Integer targetNum = 0;
+            log.debug("澶勭悊闆疯揪"+radarName+"鏁版嵁-->鍛戒护ID:"+cmdIdStr);
             //闆疯揪绉诲姩闃茬伀鎶ヨ
             if (Arrays.equals(cmdId, new byte[]{0x01})) {
                 //region 鍛婅淇℃伅鍙嶉
@@ -309,11 +311,15 @@
                     double thetaRadians = Math.toRadians(fTy + 90);
                     // 浣跨敤姝e鸡鍑芥暟璁$畻瀵硅竟闀垮害
                     Distance = Math.sin(thetaRadians) * Distance;
+                    if(Distance<0)
+                    {
+                        continue;//杩囨护璺濈灏忎簬0鐨勮剰鏁版嵁
+                    }
                     //log.debug("鐩爣鎶曞奖璺濈(m):" + Distance);
 
                     Double[] radarXY = {radarLongitude, radarLagitude};
                     Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx);
-                    log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarId銆�" + radarId+ "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恉istance銆�" + Distance + "銆怭銆�" + fTx + "銆怲銆�" + fTy + "銆怷銆�" + alarmXY[0] + "銆怸銆�" + alarmXY[1]);
+                    log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�"+ targetId  + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName+"銆怐istance銆�"+Distance);
                     ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
                     ardAlarmRadar.setTargetId(targetId);
                     ardAlarmRadar.setName(alarmPointName);
@@ -324,9 +330,7 @@
                     int bit1 = (cStat[0] >> 1) & 0x1;
                     //鐩爣鐨凚1=1 閿佸畾
                     if (bit1 == 1) {
-                        radarFollowInfo = ardAlarmRadar;
-                        //灏嗚拷韪攣瀹氱殑鎶ヨ瀵硅薄灞炴�у鍒剁粰radarFollowInfo瀵硅薄
-                        //BeanUtils.copyProperties(ardAlarmRadar, radarFollowInfo);
+                        radarFollowInfos.add(ardAlarmRadar);
                     }
                 }
                 //endregion
@@ -342,9 +346,10 @@
                 radarAlarmData.setAlarmTime(alarmTime);
                 radarAlarmData.setArdAlarmRadars(radarAlarmInfos);
                 MqttProducer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData));
-                if (radarFollowInfo != null) {
+                if (radarFollowInfos.size() >0) {
+                    radarAlarmData.setArdFollowRadars(radarFollowInfos);
                     //褰撳墠闆疯揪鎵弿瀛樺湪寮曞璺熻釜鏁版嵁锛屽彧淇濈暀鏈�鍚庝竴娆¢攣瀹氱殑鏁版嵁
-                    MqttProducer.publish(2, false, "radarFollowGuide", JSON.toJSONString(radarFollowInfo));
+                    MqttProducer.publish(2, false, "radarFollowGuide", JSON.toJSONString(radarAlarmData));
                 }
                 //鎶芥补鏈虹姸鎬丮QTT闃熷垪
                 radarAlarmData.setArdAlarmRadars(well);
@@ -428,7 +433,7 @@
                         //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName));
                         String alarmPointName = ByteUtils.bytesToStringZh(szName);
                         // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
-                        log.debug("鎶ヨ淇℃伅锛�"+ "銆恟adarId銆�" + radarId + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime);
+                        log.debug("鎶ヨ淇℃伅锛�"+ "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime);
                         ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
                         ardAlarmRadar.setTargetId(targetId);
                         ardAlarmRadar.setName(alarmPointName);
@@ -441,7 +446,7 @@
                     //鎶芥补鏈虹姸鎬侀泦鍚堜腑瑁呭叆鏁版嵁
                     byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
                     String alarmPointName = ByteUtils.bytesToStringZh(szName);
-                    log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarId銆�" + radarId + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆戞娊娌规満鐘舵�佹姤璀︺�恆larmState銆�" + wellType + "銆恆larmTime銆�" + alarmTime);
+                    //log.debug("鐘舵�佷俊鎭細" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId  + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName + "銆恆larmState銆�" + wellType);
                     ArdAlarmRadar wellAlarm = new ArdAlarmRadar();
                     wellAlarm.setTargetId(targetId);
                     wellAlarm.setName(alarmPointName);
diff --git a/src/main/java/com/ard/utils/tcp/ClientInitialize.java b/src/main/java/com/ard/utils/tcp/ClientInitialize.java
index dfc0ca8..89a5cf7 100644
--- a/src/main/java/com/ard/utils/tcp/ClientInitialize.java
+++ b/src/main/java/com/ard/utils/tcp/ClientInitialize.java
@@ -135,7 +135,7 @@
         for (ArdEquipRadar ardEquipRadar : ardEquipRadars) {
             String host = ardEquipRadar.getIp();
             Integer port = Integer.valueOf(ardEquipRadar.getPort());
-            log.debug("TCP瀹㈡埛绔皾璇曡繛鎺ワ細" + host + ":" + port);
+            log.debug("TCP client try to connect radar銆愶細" + host + ":" + port+"銆�");
             connectServer(ardEquipRadar);//杩炴帴姣忎竴涓浄杈炬湇鍔�
         }
     }
diff --git a/src/main/java/com/ard/utils/tcp/DynamicClient.java b/src/main/java/com/ard/utils/tcp/DynamicClient.java
new file mode 100644
index 0000000..e22cb3f
--- /dev/null
+++ b/src/main/java/com/ard/utils/tcp/DynamicClient.java
@@ -0,0 +1,150 @@
+package com.ard.utils.tcp;
+
+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.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.stereotype.Component;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * @Description: 闆疯揪鍔ㄦ�乼cp瀹㈡埛绔紙澶囩敤锛�
+ * @ClassName: DynamicClient
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�11鏈�30鏃�9:25:48
+ **/
+@Slf4j(topic = "netty")
+@Component
+public class DynamicClient {
+    @Resource
+    IArdEquipRadarService ardEquipRadarService;
+
+    @Value("${spring.netty.tcp.enabled}")
+    private Boolean tcpClientEnable;
+
+    private static List<Channel> serverChannels = new ArrayList<>();
+    public static ConcurrentHashMap<Channel, ArdEquipRadar> ConnectMap = new ConcurrentHashMap();
+
+    public static void main(String[] args) throws InterruptedException {
+        EventLoopGroup group = new NioEventLoopGroup();
+        Bootstrap bootstrap = new Bootstrap();
+        bootstrap.group(group)
+                .channel(NioSocketChannel.class)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .handler(new DynamicClientInitializer());
+
+        DynamicClient dynamicClient = new DynamicClient();
+        ArdEquipRadar radar1 = new ArdEquipRadar();
+        radar1.setName("511");
+        radar1.setIp("112.98.126.2");
+        radar1.setPort(1200);
+        dynamicClient.connect(bootstrap, radar1);
+
+        Thread.sleep(2000); // 绛夊緟杩炴帴寤虹珛
+
+        // 妯℃嫙鍔ㄦ�佸鍔犱竴涓湇鍔$
+        ArdEquipRadar radar2 = new ArdEquipRadar();
+        radar2.setName("140");
+        radar2.setIp("112.98.126.2");
+        radar2.setPort(1201);
+        dynamicClient.connect(bootstrap, radar2);
+
+    }
+
+    public void connectToServer(ArdEquipRadar radar) {
+        EventLoopGroup group = new NioEventLoopGroup();
+        try {
+            Bootstrap bootstrap = new Bootstrap();
+            bootstrap.group(group)
+                    .channel(NioSocketChannel.class)
+                    .option(ChannelOption.TCP_NODELAY, true)
+                    .option(ChannelOption.SO_KEEPALIVE, true)
+                    .handler(new DynamicClientInitializer());
+            // 杩炴帴鏈嶅姟绔�
+            ChannelFuture channelFuture = bootstrap.connect(radar.getIp(), radar.getPort()).sync();
+            Channel serverChannel = channelFuture.channel();
+            // 灏嗚繛鎺ョ殑鏈嶅姟绔� Channel 娣诲姞鍒扮鐞嗗垪琛�
+            serverChannels.add(serverChannel);
+            ConnectMap.put(serverChannel, radar);
+            log.debug("闆疯揪銆�" + radar.getIp() + ":" + radar.getPort() + "銆戣繛鎺ユ垚鍔�");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public Channel connect(Bootstrap bootstrap, ArdEquipRadar radar) {
+        ChannelFuture future = bootstrap.connect(radar.getIp(), radar.getPort());
+        future.addListener((ChannelFutureListener) futureListener -> {
+            if (futureListener.isSuccess()) {
+                log.info("Connected to radar device: " + radar.getName() + "銆�" + radar.getIp() + ":" + radar.getPort() + "銆�" + " successful");
+                // 鍦ㄨ繛鎺ュ缓绔嬪悗锛屼綘鍙互鍦ㄨ繖閲屾坊鍔犱笟鍔¢�昏緫鎴栧叾浠栧鐞�
+                serverChannels.add(future.channel());
+                ConnectMap.put(future.channel(), radar);
+            } else {
+                log.error("Connection to radar device " + radar.getName() + "銆�" + radar.getIp() + ":" + radar.getPort() + "銆�" + " failed. Retrying...");
+                // 杩炴帴澶辫触鏃讹紝瀹氭椂杩涜閲嶈繛
+                futureListener.channel().eventLoop().schedule(
+                        () -> connect(bootstrap, radar),
+                        1L, TimeUnit.SECONDS
+                );
+            }
+        });
+
+        return future.channel();
+    }
+
+    // 鍦ㄨ繛鎺ュ缓绔嬪悗鍙互閫氳繃璋冪敤杩欎釜鏂规硶鍚戞寚瀹氱殑鏈嶅姟绔彂閫佹暟鎹�
+    public void sendDataToServer(Channel serverChannel, Object data) {
+        serverChannel.writeAndFlush(data);
+    }
+
+    // 鍏抽棴鎸囧畾鐨勬湇鍔$杩炴帴
+    public void closeServerConnection(Channel serverChannel) {
+        serverChannel.close();
+        serverChannels.remove(serverChannel);
+    }
+
+    // 鍏抽棴鎵�鏈夋湇鍔$杩炴帴
+    public void closeAllServerConnections() {
+        for (Channel serverChannel : serverChannels) {
+            serverChannel.close();
+        }
+        serverChannels.clear();
+    }
+
+    /**
+     * 鍒濆鍖栨柟娉�
+     */
+    //@Override
+    public void run(ApplicationArguments args) {
+        if (!tcpClientEnable) {
+            return;
+        }
+        EventLoopGroup group = new NioEventLoopGroup();
+        Bootstrap bootstrap = new Bootstrap();
+        bootstrap.group(group)
+                .channel(NioSocketChannel.class)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .handler(new DynamicClientInitializer());
+        List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
+        for (ArdEquipRadar ardEquipRadar : ardEquipRadars) {
+            String host = ardEquipRadar.getIp();
+            Integer port = Integer.valueOf(ardEquipRadar.getPort());
+            log.debug("TCP client try to connect radar銆愶細" + host + ":" + port+"銆�");
+            // connectServer(ardEquipRadar);//杩炴帴姣忎竴涓浄杈炬湇鍔�
+            connect(bootstrap, ardEquipRadar);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/tcp/DynamicClientHandler.java b/src/main/java/com/ard/utils/tcp/DynamicClientHandler.java
new file mode 100644
index 0000000..ac8483d
--- /dev/null
+++ b/src/main/java/com/ard/utils/tcp/DynamicClientHandler.java
@@ -0,0 +1,437 @@
+package com.ard.utils.tcp;
+
+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.mqtt.MqttProducer;
+import com.ard.utils.other.ByteUtils;
+import com.ard.utils.other.GisUtils;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.Channel;
+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;
+import static com.ard.utils.other.ByteUtils.byteToBitString;
+import static com.ard.utils.other.ByteUtils.toLittleEndian;
+
+/**
+ * @Description: 瀹㈡埛绔暟鎹鐞嗗櫒锛堝鐢級
+ * @ClassName: DynamicClientHandler
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�11鏈�30鏃�9:27:55
+ **/
+@Slf4j(topic = "netty")
+class DynamicClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
+    /**
+     * 杩炴帴寤虹珛
+     *
+     * @param ctx
+     * @throws Exception
+     */
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) {
+        context = ctx;
+        startHeartbeatTask();//寮�濮嬪彂閫佸績璺�
+    }
+
+    @Override
+    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {
+        // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁
+        // ...
+        Channel channel = ctx.channel();
+        ArdEquipRadar ardEquipRadar = DynamicClient.ConnectMap.get(channel);
+        // 澶勭悊鎺ユ敹鍒扮殑娑堟伅
+        byte[] byteArray = new byte[msg.readableBytes()];
+        msg.getBytes(msg.readerIndex(), byteArray);
+        byte[] bytes = MessageParsing.receiveCompletePacket(byteArray);
+        if (bytes != null) {
+            processData(ardEquipRadar, bytes);
+        }
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
+        // 澶勭悊寮傚父
+        // ...
+        log.error("澶勭悊寮傚父");
+    }
+
+    private ScheduledFuture<?> heartbeatTask;
+    private ChannelHandlerContext context;
+
+    /**
+     * 寮�濮嬪績璺充换鍔�
+     */
+    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.debug("鍙戦�佸績璺�:" + 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();
+            Double radarAltitude = ardEquipRadarbyte.getAltitude();
+            //region crc鏍¢獙-鐩墠浠呯敤浜庢樉绀烘牎楠岀粨鏋�
+            Boolean crc32Check = MessageParsing.CRC32Check(data);
+            if (!crc32Check) {
+                log.debug("CRC32鏍¢獙涓嶉�氳繃");
+            } else {
+                //log.debug("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
+            String cmdIdStr = DatatypeConverter.printHexBinary(cmdId);
+            //log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId));
+            byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬
+            payloadSize = toLittleEndian(payloadSize);
+            //log.info("payloadSize:" + DatatypeConverter.printHexBinary(payloadSize));
+            int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize);
+            // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal);
+            //endregion
+            List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>();
+            ArdAlarmRadar radarFollowInfo = null;
+            //鎶芥补鏈虹姸鎬侀浄杈炬帹閫侀泦鍚�
+            List<ArdAlarmRadar> well = new ArrayList<>();
+            String alarmTime = "";
+            Integer targetNum = 0;
+            log.debug("Processing radar data 銆�" + radarName + "銆戞暟鎹�-->鍛戒护ID:"  + cmdIdStr + "浜岃繘鍒�:" + byteToBitString(cmdId[0]));
+            //闆疯揪绉诲姩闃茬伀鎶ヨ
+            if (Arrays.equals(cmdId, new byte[]{0x01})) {
+                //region 鍛婅淇℃伅鍙嶉
+                byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
+                dwTim = 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 = toLittleEndian(wTargetNum);
+                targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                if (targetNum == 0) {
+                    return;
+                }
+                //log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + 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 = toLittleEndian(dwID);
+                    int targetId = ByteUtils.bytesToDecimal(dwID);
+                    // log.info("鐩爣ID鍙凤細" + targetId);
+
+                    byte[] iDistance = Arrays.copyOfRange(data, index + 8, index + 12);
+                    iDistance = toLittleEndian(iDistance);
+                    double Distance = ByteUtils.bytesToDecimal(iDistance);
+                    //log.debug("鐩爣褰撳墠鐩寸嚎璺濈(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);
+                    log.info("鍘熷鐘舵��:" + byteToBitString(cStat[0]));
+                    // cStat = toLittleEndian(cStat);
+                    // 鎻愬彇绗�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);
+                    String alarmPointName = ByteUtils.bytesToStringZh(szName);
+                    // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
+                    byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100);
+                    afTx = toLittleEndian(afTx);
+                    float fTx = ByteUtils.bytesToFloat(afTx);
+                    //  log.info("姘村钩瑙掑害:" + fTx);
+                    byte[] afTy = Arrays.copyOfRange(data, index + 112, index + 116);
+                    afTy = toLittleEndian(afTy);
+                    float fTy = ByteUtils.bytesToFloat(afTy);
+                    //log.debug("鍨傜洿瑙掑害:" + fTy);
+                    // 灏嗚搴﹁浆鎹负寮у害
+                    double thetaRadians = Math.toRadians(fTy + 90);
+                    // 浣跨敤姝e鸡鍑芥暟璁$畻瀵硅竟闀垮害
+                    Distance = Math.sin(thetaRadians) * Distance;
+                    //log.debug("鐩爣鎶曞奖璺濈(m):" + Distance);
+
+                    Double[] radarXY = {radarLongitude, radarLagitude};
+                    Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx);
+                    log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName);
+                    ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
+                    ardAlarmRadar.setTargetId(targetId);
+                    ardAlarmRadar.setName(alarmPointName);
+                    ardAlarmRadar.setLongitude(alarmXY[0]);
+                    ardAlarmRadar.setLatitude(alarmXY[1]);
+                    ardAlarmRadar.setAlarmType(alarmType);
+                    radarAlarmInfos.add(ardAlarmRadar);
+
+                    int bit1 = (cStat[0] >> 1) & 0x1;
+                    //鐩爣鐨凚1=1 閿佸畾
+                    if (bit1 == 1) {
+                        radarFollowInfo = ardAlarmRadar;
+                        //灏嗚拷韪攣瀹氱殑鎶ヨ瀵硅薄灞炴�у鍒剁粰radarFollowInfo瀵硅薄
+                        //BeanUtils.copyProperties(ardAlarmRadar, radarFollowInfo);
+                    }
+                }
+                //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);
+                MqttProducer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData));
+                if (radarFollowInfo != null) {
+                    //褰撳墠闆疯揪鎵弿瀛樺湪寮曞璺熻釜鏁版嵁锛屽彧淇濈暀鏈�鍚庝竴娆¢攣瀹氱殑鏁版嵁
+                    MqttProducer.publish(2, false, "radarFollowGuide", JSON.toJSONString(radarFollowInfo));
+                }
+                //鎶芥补鏈虹姸鎬丮QTT闃熷垪
+                radarAlarmData.setArdAlarmRadars(well);
+                MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData));
+
+            }
+            //鎶芥补鏈篈I鐘舵�佸弽棣�
+            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 = 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 = toLittleEndian(wTargetNum);
+                targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                //log.debug("鐩爣鎬荤偣鏁�(杞暣鍨�):" + 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 = toLittleEndian(dwID);
+                    int targetId = ByteUtils.bytesToDecimal(dwID);
+                    //log.info("鐩爣ID鍙凤細" + targetId);
+                    //region 涓嶉渶瑕佺殑瀛楁
+                    byte[] iTw = Arrays.copyOfRange(data, index + 4, index + 8);
+                    iTw = toLittleEndian(iTw);
+                    int Tw = ByteUtils.bytesToDecimal(iTw);
+                    // log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw);
+
+                    byte[] iTh = Arrays.copyOfRange(data, index + 8, index + 12);
+                    iTh = toLittleEndian(iTh);
+                    int Th = ByteUtils.bytesToDecimal(iTh);
+                    //log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th);
+
+                    byte[] fTx = Arrays.copyOfRange(data, index + 12, index + 16);
+                    fTx = toLittleEndian(fTx);
+                    float fTxAngle = ByteUtils.bytesToFloat(fTx);
+                    //log.debug("p瑙掑害:" + fTxAngle);
+                    byte[] fTy = Arrays.copyOfRange(data, index + 16, index + 20);
+                    fTy = toLittleEndian(fTy);
+                    float fTyAngle = ByteUtils.bytesToFloat(fTy);
+                    //log.debug("t瑙掑害:" + fTyAngle);
+
+                    byte[] sAreaNo = Arrays.copyOfRange(data, index + 20, index + 22);
+                    sAreaNo = toLittleEndian(sAreaNo);
+                    int AreaNo = ByteUtils.bytesToDecimal(sAreaNo);
+                    //log.debug("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo);
+
+                    byte[] cGrp = Arrays.copyOfRange(data, index + 22, index + 23);
+                    cGrp = toLittleEndian(cGrp);
+                    int Grp = ByteUtils.bytesToDecimal(cGrp);
+                    //log.info("鎵�灞炵粍:" + Grp);
+                    //endregion
+                    String alarmType;
+                    //鎶芥补鏈虹姸鎬佸彉閲�
+                    String wellType;
+                    byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24);
+                    cStat = 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 = "闆疯揪鎶芥补鏈哄仠鏈�";
+                        byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
+                        //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName));
+                        String alarmPointName = ByteUtils.bytesToStringZh(szName);
+                        // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
+                        //log.debug("鎶ヨ淇℃伅锛�"+ "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime);
+                        ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
+                        ardAlarmRadar.setTargetId(targetId);
+                        ardAlarmRadar.setName(alarmPointName);
+                        ardAlarmRadar.setAlarmType(alarmType);
+                        radarAlarmInfos.add(ardAlarmRadar);
+                        wellType = "鍋滄満";
+                    } else {
+                        wellType = "杩愯";
+                    }
+                    //鎶芥补鏈虹姸鎬侀泦鍚堜腑瑁呭叆鏁版嵁
+                    byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
+                    String alarmPointName = ByteUtils.bytesToStringZh(szName);
+                    log.debug("鎶ヨ淇℃伅锛�" + "銆恟adarName銆�" + radarName + "銆恡argetId銆�" + targetId + "銆恆larmType銆戞娊娌规満鐘舵�佹姤璀�" + "銆恆larmTime銆�" + alarmTime + "銆恘ame銆�" + alarmPointName + "銆恆larmState銆�" + wellType);
+                    ArdAlarmRadar wellAlarm = new ArdAlarmRadar();
+                    wellAlarm.setTargetId(targetId);
+                    wellAlarm.setName(alarmPointName);
+                    wellAlarm.setAlarmType(wellType);
+                    well.add(wellAlarm);
+                }
+                //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);
+                MqttProducer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData));
+                //鎶芥补鏈虹姸鎬丮QTT闃熷垪
+                radarAlarmData.setArdAlarmRadars(well);
+                MqttProducer.publish(2, false, "radarWellData", JSON.toJSONString(radarAlarmData));
+            }
+            //寮哄埗寮曞
+            if (Arrays.equals(cmdId, new byte[]{0x02})) {
+                //region 鍛婅鍓嶇鍙戦�佺殑寮哄埗寮曞淇℃伅
+                byte[] iDistance = Arrays.copyOfRange(data, 4, 8);
+                iDistance = toLittleEndian(iDistance);
+                long distance = ByteUtils.bytesToDecimal(iDistance);
+                log.info("鐩爣褰撳墠璺濈(m):" + distance);
+                byte[] fTx = Arrays.copyOfRange(data, 8, 12);
+                fTx = toLittleEndian(fTx);
+                float tx = ByteUtils.bytesToFloat(fTx);
+                log.debug("鏂逛綅:" + tx);
+                byte[] fTy = Arrays.copyOfRange(data, 12, 16);
+                fTy = toLittleEndian(fTy);
+                float ty = ByteUtils.bytesToFloat(fTy);
+                if (ty < 0) {
+                    ty += 360;
+                }
+                log.debug("淇话:" + ty);
+                Map<String, Object> forceGuideMap = new HashMap<>();
+                forceGuideMap.put("distance", distance);
+                forceGuideMap.put("p", tx);
+                forceGuideMap.put("t", ty);
+                forceGuideMap.put("radarId", radarId);
+                log.debug("寮哄埗寮曞淇℃伅" + forceGuideMap);
+                //endregion
+                MqttProducer.publish(2, false, "radarForceGuide", JSON.toJSONString(forceGuideMap));
+            }
+        } catch (Exception ex) {
+            log.error("闆疯揪鎶ユ枃瑙f瀽寮傚父:" + ex.getMessage());
+        }
+    }
+}
diff --git a/src/main/java/com/ard/utils/tcp/DynamicClientInitializer.java b/src/main/java/com/ard/utils/tcp/DynamicClientInitializer.java
new file mode 100644
index 0000000..0a84573
--- /dev/null
+++ b/src/main/java/com/ard/utils/tcp/DynamicClientInitializer.java
@@ -0,0 +1,25 @@
+package com.ard.utils.tcp;
+
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelPipeline;
+import io.netty.channel.socket.SocketChannel;
+
+/**
+ * @Description: 鍒濆鍖栧鎴风鐨勯�氶亾锛堝鐢級
+ * @ClassName: DynamicClientInitializer
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�11鏈�30鏃�9:27:03
+ **/
+public class DynamicClientInitializer extends ChannelInitializer<SocketChannel> {
+    @Override
+    protected void initChannel(SocketChannel ch){
+        try {
+            ChannelPipeline pipeline = ch.pipeline();
+            // 娣诲姞浣犻渶瑕佺殑澶勭悊鍣�
+            pipeline.addLast(new DynamicClientHandler());
+        }catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+}

--
Gitblit v1.9.3