From eae9c75f70004dfe128718c63fe04c1a5cc35b01 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期四, 28 十二月 2023 13:08:47 +0800
Subject: [PATCH] 更改雷达tcp客户端

---
 src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java           |   29 ++
 src/main/java/com/ard/utils/netty/tcp/DynamicClient.java                         |   22 +
 src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java |  447 +++++++++++++++++++++++++++++++++++++
 src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java           |   25 ++
 src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java                 |   20 +
 src/main/java/com/ard/utils/netty/tcp/ClientHelper.java                          |   41 +++
 src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java                |   16 +
 src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java                       |  104 ++++++++
 src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java                  |    3 
 9 files changed, 695 insertions(+), 12 deletions(-)

diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java
new file mode 100644
index 0000000..8d42a2d
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInboundHandlerAdapter.java
@@ -0,0 +1,447 @@
+package com.ard.utils.netty.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.util.ByteUtils;
+import com.ard.utils.util.GisUtils;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelId;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.xml.bind.DatatypeConverter;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import static com.ard.utils.util.ByteUtils.byteToBitString;
+import static com.ard.utils.util.ByteUtils.toLittleEndian;
+
+@Slf4j(topic = "netty")
+@ChannelHandler.Sharable
+public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandlerAdapter {
+    
+    /**
+     * 浠庢湇鍔$鏀跺埌鏂扮殑鏁版嵁鏃讹紝杩欎釜鏂规硶浼氬湪鏀跺埌娑堟伅鏃惰璋冪敤
+     */
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg1) throws Exception, IOException {
+        if(msg1 == null){
+            return;
+        }
+
+        //System.out.println("channelRead:read msg:"+msg1.toString());
+        //BootNettyClientChannel bootNettyClientChannel = BootNettyClientChannelCache.get("clientId:"+ctx.channel().id().toString());
+        //if(bootNettyClientChannel != null){
+        //    System.out.println("to do");
+        //    bootNettyClientChannel.setLast_data(msg1.toString());
+        //}
+        InetSocketAddress inSocket = (InetSocketAddress) ctx.channel().remoteAddress();
+        String host = inSocket.getAddress().getHostAddress();
+        int port = inSocket.getPort();
+        ArdEquipRadar ardEquipRadar = ClientInitialize.tureConnectMap.get(host+":"+port);
+        // 澶勭悊鎺ユ敹鍒扮殑娑堟伅
+        ByteBuf msg= (ByteBuf)msg1;
+        byte[] byteArray = new byte[msg.readableBytes()];
+        msg.getBytes(msg.readerIndex(), byteArray);
+        byte[] bytes = MessageParsing.receiveCompletePacket(byteArray);
+        if (bytes != null) {
+            processData(ardEquipRadar, bytes);
+        }
+        //鍥炲簲鏈嶅姟绔�
+        //ctx.write("I got server message thanks server!");
+    }
+ 
+    /**
+     * 浠庢湇鍔$鏀跺埌鏂扮殑鏁版嵁銆佽鍙栧畬鎴愭椂璋冪敤
+     */
+    @Override
+    public void channelReadComplete(ChannelHandlerContext ctx) throws IOException {
+        System.out.println("channelReadComplete");
+        ctx.flush();
+    }
+ 
+    /**
+     * 褰撳嚭鐜� Throwable 瀵硅薄鎵嶄細琚皟鐢紝鍗冲綋 Netty 鐢变簬 IO 閿欒鎴栬�呭鐞嗗櫒鍦ㄥ鐞嗕簨浠舵椂鎶涘嚭鐨勫紓甯告椂
+     */
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws IOException {
+//        System.out.println("exceptionCaught");
+        cause.printStackTrace();
+        ctx.close();//鎶涘嚭寮傚父锛屾柇寮�涓庡鎴风鐨勮繛鎺�
+    }
+ 
+    /**
+     * 瀹㈡埛绔笌鏈嶅姟绔涓�娆″缓绔嬭繛鎺ユ椂 鎵ц
+     */
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        super.channelActive(ctx);
+        // 瀹㈡埛绔笌鏈嶅姟绔� 寤虹珛杩炴帴
+        InetSocketAddress inSocket = (InetSocketAddress) ctx.channel().remoteAddress();
+        String clientIp = inSocket.getAddress().getHostAddress();
+        int port = inSocket.getPort();
+        log.debug("杩炴帴鎴愬姛锛氥��"+clientIp+":"+port+"銆�");
+    }
+ 
+    /**
+     * 瀹㈡埛绔笌鏈嶅姟绔� 鏂繛鏃� 鎵ц
+     */
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception{
+        super.channelInactive(ctx);
+        InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress();
+        int port = ipSocket.getPort();
+        String host = ipSocket.getHostString();
+        log.error("涓庤澶�" + host + ":" + port + "杩炴帴鏂紑!");
+        // 閲嶈繛
+        BootNettyClientThread thread = new BootNettyClientThread(host,port);
+        thread.start();
+    }
+    /**
+     * 瑙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());
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java
new file mode 100644
index 0000000..0965015
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/BootNettyChannelInitializer.java
@@ -0,0 +1,25 @@
+package com.ard.utils.netty.tcp;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelInitializer;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
+
+@ChannelHandler.Sharable
+public class BootNettyChannelInitializer<SocketChannel> extends ChannelInitializer<Channel> {
+ 
+    @Override
+    protected void initChannel(Channel ch) throws Exception {
+ 
+        ch.pipeline().addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));
+        ch.pipeline().addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
+        /**
+         * 鑷畾涔塁hannelInboundHandlerAdapter
+         */
+        ch.pipeline().addLast(new BootNettyChannelInboundHandlerAdapter());
+        
+    }
+ 
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java
new file mode 100644
index 0000000..6006f7c
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/BootNettyClient.java
@@ -0,0 +1,104 @@
+package com.ard.utils.netty.tcp;
+
+import com.ard.alarm.radar.domain.ArdEquipRadar;
+import com.ard.alarm.radar.service.IArdEquipRadarService;
+import com.ard.utils.netty.config.NettyTcpConfiguration;
+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.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.channels.SocketChannel;
+import java.util.List;
+
+@Slf4j(topic = "netty")
+@Component
+public class BootNettyClient implements ApplicationRunner {
+    @Resource
+    IArdEquipRadarService ardEquipRadarService;
+    @Resource
+    NettyTcpConfiguration nettyTcpConfig;
+    static Integer waitTimes = 1;
+    static EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+    /**
+     * 鍒濆鍖朆ootstrap
+     */
+    public static final Bootstrap getBootstrap(EventLoopGroup group) {
+        if (null == group) {
+            group = eventLoopGroup;
+        }
+        Bootstrap bootstrap = new Bootstrap();
+        bootstrap.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.SO_KEEPALIVE, true).handler(new BootNettyChannelInitializer<SocketChannel>());
+        return bootstrap;
+    }
+ 
+    public void connect( String host,int port) throws Exception {
+        log.debug("姝e湪杩涜杩炴帴锛氥��" + host+":"+port+"銆�");
+        eventLoopGroup.shutdownGracefully();
+        eventLoopGroup = new NioEventLoopGroup();
+        Bootstrap bootstrap = getBootstrap(null);
+ 
+        try {
+            bootstrap.remoteAddress(host, port);
+            // 寮傛杩炴帴tcp鏈嶅姟绔�
+            ChannelFuture future = bootstrap.connect().addListener((ChannelFuture futureListener) -> {
+                final EventLoop eventLoop = futureListener.channel().eventLoop();
+                if (futureListener.isSuccess()) {
+                    BootNettyClientChannel bootNettyClientChannel = new BootNettyClientChannel();
+                    Channel channel = futureListener.channel();
+                    String id = futureListener.channel().id().toString();
+//                    String id = host;
+                    bootNettyClientChannel.setChannel(channel);
+                    bootNettyClientChannel.setCode("clientId:" + id);
+                    BootNettyClientChannelCache.save("clientId:" + id, bootNettyClientChannel);
+                    log.debug("netty client start success=" + id);
+                } else {
+//                    System.err.println("杩炴帴澶辫触锛�" + waitTimes.toString() + "绉掑悗閲嶆柊杩炴帴:" + host);
+                    try {
+                        Thread.sleep(waitTimes * 1000);
+                    } finally {
+                        connect(host,port);
+                    }
+                }
+            });
+            future.channel().closeFuture().sync();
+        } catch (Exception e) {
+            System.err.println("杩炴帴寮傚父锛�" + waitTimes.toString() + "绉掑悗閲嶆柊杩炴帴:" + host);
+            try {
+                Thread.sleep(waitTimes * 1000);
+            } finally {
+                connect(host,port);
+            }
+            e.printStackTrace();
+        } finally {
+            /**
+             * 閫�鍑猴紝閲婃斁璧勬簮
+             */
+            eventLoopGroup.shutdownGracefully().sync();
+        }
+ 
+    }
+    /**
+     * 鍒濆鍖栨柟娉�
+     */
+    @Override
+    public void run(ApplicationArguments args) {
+        if (!nettyTcpConfig.getEnabled()) {
+            return;
+        }
+        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+"銆�");
+            BootNettyClientThread thread = new BootNettyClientThread(host,port);
+            thread.start();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java
new file mode 100644
index 0000000..f8c9dba
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannel.java
@@ -0,0 +1,16 @@
+package com.ard.utils.netty.tcp;
+
+import io.netty.channel.Channel;
+import lombok.Data;
+
+@Data
+public class BootNettyClientChannel {
+
+    //    杩炴帴瀹㈡埛绔敮涓�鐨刢ode
+    private String code;
+
+    //    瀹㈡埛绔渶鏂板彂閫佺殑娑堟伅鍐呭
+    private String last_data;
+
+    private transient volatile Channel channel;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java
new file mode 100644
index 0000000..9cfb87b
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientChannelCache.java
@@ -0,0 +1,29 @@
+package com.ard.utils.netty.tcp;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class BootNettyClientChannelCache {
+ 
+    public static volatile Map<String, BootNettyClientChannel> channelMapCache = new ConcurrentHashMap<String, BootNettyClientChannel>();
+ 
+    public static void add(String code, BootNettyClientChannel channel){
+        channelMapCache.put(code,channel);
+    }
+ 
+    public static BootNettyClientChannel get(String code){
+        return channelMapCache.get(code);
+    }
+ 
+    public static void remove(String code){
+        channelMapCache.remove(code);
+    }
+ 
+    public static void save(String code, BootNettyClientChannel channel) {
+        if(channelMapCache.get(code) == null) {
+            add(code,channel);
+        }
+    }
+ 
+ 
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java
new file mode 100644
index 0000000..f08733f
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/BootNettyClientThread.java
@@ -0,0 +1,20 @@
+package com.ard.utils.netty.tcp;
+
+public class BootNettyClientThread extends Thread {
+ 
+    private final int port;
+    private final String host;
+
+    public BootNettyClientThread(String host,int port){
+        this.port = port;
+        this.host = host;
+    }
+ 
+    public void run() {
+        try {
+            new BootNettyClient().connect(host,port);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/ClientHelper.java b/src/main/java/com/ard/utils/netty/tcp/ClientHelper.java
new file mode 100644
index 0000000..cbad3c0
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/ClientHelper.java
@@ -0,0 +1,41 @@
+package com.ard.utils.netty.tcp;
+
+import com.ard.utils.util.ByteUtils;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.xml.bind.DatatypeConverter;
+import java.util.Map;
+
+@Component
+@EnableScheduling
+public class ClientHelper {
+
+    //  浣跨敤瀹氭椂鍣ㄥ彂閫佸績璺�
+    @Scheduled(cron = "0/3 * * * * ?")
+    public void heart_timer() {
+        //System.err.println("BootNettyClientChannelCache.channelMapCache.size():" + BootNettyClientChannelCache.channelMapCache.size());
+        if (BootNettyClientChannelCache.channelMapCache.size() > 0) {
+            for (Map.Entry<String, BootNettyClientChannel> entry : BootNettyClientChannelCache.channelMapCache.entrySet()) {
+                BootNettyClientChannel bootNettyChannel = entry.getValue();
+                //System.out.println(bootNettyChannel.getCode());
+                try {
+                    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);
+                    // log.debug("鍙戦�佸績璺�:" + hexString);
+                    //message.writeBytes(heart);
+                    bootNettyChannel.getChannel().writeAndFlush(Unpooled.buffer().writeBytes(heart));
+                } catch (Exception e) {
+                    continue;
+                }
+            }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java b/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java
index 3f082b7..94277ff 100644
--- a/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java
+++ b/src/main/java/com/ard/utils/netty/tcp/DynamicClient.java
@@ -26,7 +26,7 @@
  **/
 @Slf4j(topic = "netty")
 @Component
-public class DynamicClient implements ApplicationRunner {
+public class DynamicClient {
     @Resource
     IArdEquipRadarService ardEquipRadarService;
     @Resource
@@ -126,25 +126,27 @@
     /**
      * 鍒濆鍖栨柟娉�
      */
-    @Override
+
     public void run(ApplicationArguments args) {
         if (!nettyTcpConfig.getEnabled()) {
             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());
+        //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);
+           // connect(bootstrap, ardEquipRadar);
+            BootNettyClientThread thread = new BootNettyClientThread(host,port);
+            thread.start();
         }
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java b/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java
index f3d5717..5eb32a1 100644
--- a/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java
+++ b/src/main/java/com/ard/utils/netty/tcp/DynamicClientHandler.java
@@ -44,7 +44,6 @@
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {
         // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁
-        // ...
         Channel channel = ctx.channel();
         ArdEquipRadar ardEquipRadar = DynamicClient.ConnectMap.get(channel);
         // 澶勭悊鎺ユ敹鍒扮殑娑堟伅
@@ -60,7 +59,7 @@
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
         // 澶勭悊寮傚父
         // ...
-        log.error("澶勭悊寮傚父");
+        log.error("澶勭悊寮傚父"+cause.getMessage());
     }
 
     private ScheduledFuture<?> heartbeatTask;

--
Gitblit v1.9.3