From fbb9b4374821b43d0b85aa569977415fd8d77cd9 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期一, 03 七月 2023 16:01:39 +0800
Subject: [PATCH] 增加雷达抽油机停机推送mqtt

---
 src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java |  282 ++++++++++++++++++++++++--------------------------------
 1 files changed, 120 insertions(+), 162 deletions(-)

diff --git a/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java b/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
index bb05e68..fa6016c 100644
--- a/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
+++ b/src/main/java/com/ard/utils/tcp/NettyTcpClientHandler.java
@@ -4,18 +4,14 @@
 import com.ard.alarm.radar.domain.ArdEquipRadar;
 import com.ard.alarm.radar.domain.RadarAlarmData;
 import com.ard.alarm.radar.domain.ArdAlarmRadar;
-import com.ard.utils.LonlatConver;
+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.SimpleChannelInboundHandler;
 import lombok.extern.slf4j.Slf4j;
-import org.gavaghan.geodesy.Ellipsoid;
-import org.gavaghan.geodesy.GeodeticCalculator;
-import org.gavaghan.geodesy.GlobalCoordinates;
-
 import javax.xml.bind.DatatypeConverter;
-import java.nio.ByteBuffer;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.ScheduledFuture;
@@ -35,6 +31,7 @@
     private Integer port;
     private Double longitude;
     private Double lagitude;
+    private Double altitude;
     private String name;
     private String id;
 
@@ -45,6 +42,7 @@
         this.lagitude = ardEquipRadar.getLatitude();
         this.name = ardEquipRadar.getName();
         this.id = ardEquipRadar.getId();
+        this.altitude = ardEquipRadar.getAltitude();
     }
 
     private ChannelHandlerContext context;
@@ -55,10 +53,8 @@
         // 澶勭悊鎺ユ敹鍒扮殑娑堟伅
         byte[] byteArray = new byte[msg.readableBytes()];
         msg.getBytes(msg.readerIndex(), byteArray);
-        byte[] bytes = receiveCompletePacket(byteArray);
+        byte[] bytes = MessageParsing.receiveCompletePacket(byteArray);
         if (bytes != null) {
-            //  String hexString = DatatypeConverter.printHexBinary(bytes);
-            //  log.info(hexString);
             processData(bytes);
         }
     }
@@ -109,7 +105,9 @@
      */
     public void processData(byte[] data) {
         try {
-            data = transferData(data);//鍘绘帀鍖呭ご鍜屽寘灏俱�佹牎楠屽強杞箟
+            //log.info("鍘熷鏁版嵁:" + DatatypeConverter.printHexBinary(data));
+            log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude + "銆怹銆�" + altitude);
+            data = MessageParsing.transferData(data);//鍘绘帀鍖呭ご鍜屽寘灏俱�佹牎楠屽強杞箟
 
             byte[] type = Arrays.copyOfRange(data, 0, 1);//鍛戒护绫诲瀷
             //  log.info("鍛戒护绫诲瀷:" + DatatypeConverter.printHexBinary(type));
@@ -118,40 +116,41 @@
             //  log.info("鍛戒护ID:" + DatatypeConverter.printHexBinary(cmdId));
 
             byte[] payloadSize = Arrays.copyOfRange(data, 2, 4);//鏈夋晥璐熻浇澶у皬
-            payloadSize = toLittleEndian(payloadSize);
-            int payloadSizeToDecimal = byteArrayToDecimal(payloadSize);
+            payloadSize = ByteUtils.toLittleEndian(payloadSize);
+            int payloadSizeToDecimal = ByteUtils.bytesToDecimal(payloadSize);
             // log.info("鏈夋晥璐熻浇澶у皬(杞暣鍨�):" + payloadSizeToDecimal);
-
+            List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>();
+            String alarmTime="";
             if (Arrays.equals(cmdId, new byte[]{0x01})) {
                 byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
-                dwTim = toLittleEndian(dwTim);
+                dwTim = ByteUtils.toLittleEndian(dwTim);
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-                long l = byteArrayToDecimal(dwTim);
-                String alarmTime = sdf.format(l * 1000);
+                long l = ByteUtils.bytesToDecimal(dwTim);
+                alarmTime = sdf.format(l * 1000);
                 // log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime);
 
                 byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10);
-                wTargetNum = toLittleEndian(wTargetNum);
-                int targetNum = byteArrayToDecimal(wTargetNum);
+                wTargetNum = ByteUtils.toLittleEndian(wTargetNum);
+                int targetNum = ByteUtils.bytesToDecimal(wTargetNum);
                 //log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
 
                 //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟)
                 int uintSize = (payloadSizeToDecimal - 64) / targetNum;
                 // log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize);
-                List<ArdAlarmRadar> radarAlarmInfos = new ArrayList<>();
+
                 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 id = byteArrayToDecimal(dwID);
+                    dwID = ByteUtils.toLittleEndian(dwID);
+                    int id = ByteUtils.bytesToDecimal(dwID);
 
                     // log.info("鐩爣ID鍙凤細" + id);
 
                     byte[] iDistance = Arrays.copyOfRange(data, index + 8, index + 12);
-                    iDistance = toLittleEndian(iDistance);
-                    int Distance = byteArrayToDecimal(iDistance);
+                    iDistance = ByteUtils.toLittleEndian(iDistance);
+                    Double Distance = ByteUtils.bytesToDouble(iDistance);
                     // log.info("鐩爣褰撳墠璺濈(m):" + Distance);
                     //region 涓嶉渶瑕佺殑瀛楁
 //                    byte[] dwGSum = Arrays.copyOfRange(data, index + 4, index + 8);
@@ -200,7 +199,7 @@
                     //endregion
                     String alarmType = "";
                     byte[] cStat = Arrays.copyOfRange(data, index + 23, index + 24);
-                    cStat = toLittleEndian(cStat);
+                    cStat = ByteUtils.toLittleEndian(cStat);
                     String binaryString = String.format("%8s", Integer.toBinaryString(cStat[0] & 0xFF)).replace(' ', '0');
                     // log.info("鐩爣褰撳墠鐘舵��:" + binaryString);
                     // 鎻愬彇绗�4浣嶈嚦绗�6浣嶇殑鍊�
@@ -215,7 +214,7 @@
 
                     byte[] szName = Arrays.copyOfRange(data, index + 64, index + 96);
                     int position = findIndexOfDoubleZero(szName);
-                    String alarmPointName = "";
+                    String alarmPointName;
                     if (position != -1) {
                         byte[] result = new byte[position];
                         System.arraycopy(szName, 0, result, 0, position);
@@ -225,16 +224,15 @@
                     }
                     // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
                     byte[] afTx = Arrays.copyOfRange(data, index + 96, index + 100);
-                    afTx = toLittleEndian(afTx);
-                    float fTx = bytesToFloat(afTx);
+                    afTx = ByteUtils.toLittleEndian(afTx);
+                    float fTx = ByteUtils.bytesToFloat(afTx);
                     //  log.info("姘村钩瑙掑害:" + fTx);
                     byte[] afTy = Arrays.copyOfRange(data, index + 112, index + 116);
-                    afTy = toLittleEndian(afTy);
-                    float fTy = bytesToFloat(afTy);
+                    afTy = ByteUtils.toLittleEndian(afTy);
+                    float fTy = ByteUtils.bytesToFloat(afTy);
                     //  log.info("鍨傜洿瑙掑害:" + fTy);
-                    //  log.info("闆疯揪淇℃伅锛�" + host + "銆恜ort銆�" + port + "銆怷銆�" + longitude + "銆怸銆�" + lagitude);
                     Double[] radarXY = {longitude, lagitude};
-                    Double[] alarmXY = CalculateCoordinates(radarXY, Distance, (double) fTx);
+                    Double[] alarmXY = GisUtils.CalculateCoordinates(radarXY, Distance, (double) fTx);
                     //  log.info("鎶ヨ淇℃伅锛�" + "銆恑d銆�" + id + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime + "銆恉istance銆�" + Distance + "銆怭銆�" + fTx + "銆怲銆�" + fTy + "銆怷銆�" + alarmXY[0] + "銆怸銆�" + alarmXY[1]);
                     ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
                     ardAlarmRadar.setTargetId(id);
@@ -244,134 +242,109 @@
                     ardAlarmRadar.setAlarmType(alarmType);
                     radarAlarmInfos.add(ardAlarmRadar);
                 }
-                RadarAlarmData radarAlarmData = new RadarAlarmData();
-                radarAlarmData.setRadarId(id);
-                radarAlarmData.setRadarName(name);
-                radarAlarmData.setAlarmTime(alarmTime);
-                radarAlarmData.setArdAlarmRadars(radarAlarmInfos);
-                MqttConsumer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData));
+
             }
-        } catch (Exception ex) {
-            log.error(ex.getMessage());
-        }
-    }
+            if (Arrays.equals(cmdId, new byte[]{0x04})) {
+                //String hexString = DatatypeConverter.printHexBinary(data);
+                //log.info(hexString);
 
-    /**
-     * byte鏁扮粍杞琭loat
-     */
-    private float bytesToFloat(byte[] bytes) {
-        ByteBuffer buffer = ByteBuffer.wrap(bytes);
-        return buffer.getFloat();
-    }
+                byte[] dwTim = Arrays.copyOfRange(data, 4, 8);
+                dwTim = ByteUtils.toLittleEndian(dwTim);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                long l = ByteUtils.bytesToDecimal(dwTim);
+                alarmTime = sdf.format(l * 1000);
+                //log.info("鍛ㄨ鍥惧儚鐨勫嚭鐜版椂闂�(杞琩ate):" + alarmTime);
 
+                byte[] wTargetNum = Arrays.copyOfRange(data, 8, 10);
+                wTargetNum = ByteUtils.toLittleEndian(wTargetNum);
+                int targetNum = ByteUtils.bytesToDecimal(wTargetNum);
+                //log.info("鐩爣鎬荤偣鏁�(杞暣鍨�):" + targetNum);
 
-    /**
-     * byte鏁扮粍杞暣鍨�
-     */
-    public int byteArrayToDecimal(byte[] byteArray) {
-        int decimalValue = 0;
+                //瑙f瀽NET_TARGET_UNIT(64鏄疦ET_TARGET_HEAD鐨勫瓧鑺傛暟)
+                int uintSize = (payloadSizeToDecimal - 64) / targetNum;
+                //log.info("鍗曟潯鎶ヨ澶у皬:" + uintSize);
+                for (int i = 0; i < targetNum; i++) {
+                    Integer index = 68 + uintSize * i;
+                    byte[] dwID = Arrays.copyOfRange(data, index, index + 4);
+                    //log.info("鐩爣ID:" + DatatypeConverter.printHexBinary(dwID));
+                    dwID = ByteUtils.toLittleEndian(dwID);
+                    int id = ByteUtils.bytesToDecimal(dwID);
+                    //log.info("鐩爣ID鍙凤細" + id);
+                    //region 涓嶉渶瑕佺殑瀛楁
+                    byte[] iTw = Arrays.copyOfRange(data, index + 4, index + 8);
+                    iTw = ByteUtils.toLittleEndian(iTw);
+                    int Tw = ByteUtils.bytesToDecimal(iTw);
+                    // log.info("鐩爣褰撳墠鐨勫儚绱犲搴�:" + Tw);
 
-        for (int i = 0; i < byteArray.length; i++) {
-            decimalValue = (decimalValue << 8) | (byteArray[i] & 0xFF);
-        }
+                    byte[] iTh = Arrays.copyOfRange(data, index + 8, index + 12);
+                    iTh = ByteUtils.toLittleEndian(iTh);
+                    int Th = ByteUtils.bytesToDecimal(iTh);
+                    //log.info("鐩爣褰撳墠鐨勫儚绱犻珮搴�:" + Th);
 
-        return decimalValue;
-    }
+                    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);
 
-    /**
-     * 澶х杞皬绔�
-     */
-    public byte[] toLittleEndian(byte[] bigEndianBytes) {
-        byte[] littleEndianBytes = new byte[bigEndianBytes.length];
+                    byte[] sAreaNo = Arrays.copyOfRange(data, index + 20, index + 22);
+                    sAreaNo = ByteUtils.toLittleEndian(sAreaNo);
+                    int AreaNo = ByteUtils.bytesToDecimal(sAreaNo);
+                    //log.info("鐩爣褰掑睘鐨勫憡璀﹀尯鍩熷彿:" + AreaNo);
 
-        for (int i = 0; i < bigEndianBytes.length; i++) {
-            int j = bigEndianBytes.length - i - 1;
-            littleEndianBytes[i] = bigEndianBytes[j];
-        }
+                    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 isBitSet = (cStat[0] & 0x01) == 0x00;
+                    // 鍒ゆ柇鎻愬彇鐨勫��
+                    if (isBitSet) {
+                        alarmType = "闆疯揪鎶芥补鏈哄仠鏈�";
+                    } else {
+                        continue;
+                    }
+                    //log.info("鎶ヨ绫诲瀷:" + alarmType);
 
-        return littleEndianBytes;
-    }
-
-
-    // 鍒涘缓缂撳啿鍖哄垪琛�
-    List<Byte> buffer = new ArrayList<>();
-
-    /**
-     * 鎺ユ敹瀹屾暣鍖�
-     */
-    public byte[] receiveCompletePacket(byte[] receivedData) {
-        // 瀹氫箟鍖呭熬瀛楄妭搴忓垪
-        byte[] packetEnd = {0x01, 0x02, 0x00};
-        // 娣诲姞宸叉帴鏀剁殑鏁版嵁鍒扮紦鍐插尯
-        for (byte data : receivedData) {
-            buffer.add(data);
-        }
-        // 妫�鏌ョ紦鍐插尯涓殑鏁版嵁鏄惁鍖呭惈瀹屾暣鐨勫寘
-        while (buffer.size() >= packetEnd.length) {
-            int endIndex = findPacketEndIndex(buffer, packetEnd);
-            if (endIndex != -1) {
-                // 鎵惧埌瀹屾暣鐨勫寘
-                byte[] packet = extractPacketFromBuffer(buffer, endIndex + packetEnd.length);
-                return packet;
-            } else {
-                // 鏈壘鍒板寘灏撅紝缁х画鎺ユ敹鏁版嵁
-                break;
-            }
-        }
-
-        // 鏈壘鍒板畬鏁寸殑鍖�
-        return null;
-    }
-
-    /**
-     * 鑾峰彇鍖呯粨鏉熺储寮�
-     */
-    public int findPacketEndIndex(List<Byte> buffer, byte[] packetEnd) {
-        for (int i = 0; i <= buffer.size() - packetEnd.length; i++) {
-            boolean isMatch = true;
-            for (int j = 0; j < packetEnd.length; j++) {
-                if (buffer.get(i + j) != packetEnd[j]) {
-                    isMatch = false;
-                    break;
+                    byte[] szName = Arrays.copyOfRange(data, index + 32, index + 64);
+                    //log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + DatatypeConverter.printHexBinary(szName));
+                    int position = findIndexOfDoubleZero(szName);
+                    String alarmPointName;
+                    if (position != -1) {
+                        byte[] result = new byte[position];
+                        System.arraycopy(szName, 0, result, 0, position);
+                        alarmPointName = new String(result, "GBK");
+                    } else {
+                        alarmPointName = new String(szName, "GBK");
+                    }
+                    // log.info("鎵�灞炲憡璀﹀尯鍩熷悕绉�:" + alarmPointName);
+                    //log.info("鎶ヨ淇℃伅锛�" + "銆恑d銆�" + id + "銆恘ame銆�" + alarmPointName + "銆恆larmType銆�" + alarmType + "銆恆larmTime銆�" + alarmTime);
+                    ArdAlarmRadar ardAlarmRadar = new ArdAlarmRadar();
+                    ardAlarmRadar.setTargetId(id);
+                    ardAlarmRadar.setName(alarmPointName);
+                    ardAlarmRadar.setAlarmType(alarmType);
+                    radarAlarmInfos.add(ardAlarmRadar);
                 }
             }
-            if (isMatch) {
-                return i;
-            }
+            RadarAlarmData radarAlarmData = new RadarAlarmData();
+            radarAlarmData.setRadarId(id);
+            radarAlarmData.setRadarName(name);
+            radarAlarmData.setAlarmTime(alarmTime);
+            radarAlarmData.setArdAlarmRadars(radarAlarmInfos);
+            MqttConsumer.publish(2, false, "radar", JSON.toJSONString(radarAlarmData));
+        } catch (Exception ex) {
+            log.error("闆疯揪鎶ユ枃瑙f瀽寮傚父:" + ex.getMessage());
         }
-        return -1;
-    }
-
-    /**
-     * 浠庣紦鍐插尯鎻愬彇鏁版嵁鍖�
-     */
-    public byte[] extractPacketFromBuffer(List<Byte> buffer, int endIndex) {
-        byte[] packet = new byte[endIndex];
-        for (int i = 0; i < endIndex; i++) {
-            packet[i] = buffer.get(i);
-        }
-        buffer.subList(0, endIndex).clear();
-        return packet;
-    }
-
-    /**
-     * 鍘绘帀鍖呭ご鍜屽寘灏炬牎楠屽強杞箟
-     */
-    public byte[] transferData(byte[] data) {
-        data = Arrays.copyOfRange(data, 3, data.length);
-        data = Arrays.copyOfRange(data, 0, data.length - 7);
-        String dataStr = DatatypeConverter.printHexBinary(data);
-        if (dataStr.contains("01020201")) {//杞箟01020201
-            dataStr = dataStr.replaceAll("01020201", "010201");
-        }
-        if (dataStr.contains("01020200")) {//杞箟01020200
-            dataStr = dataStr.replaceAll("01020200", "010200");
-        }
-        if (dataStr.contains("01020202")) {//杞箟01020202
-            dataStr = dataStr.replaceAll("01020202", "010202");
-        }
-        data = DatatypeConverter.parseHexBinary(dataStr);
-        return data;
     }
 
     /**
@@ -384,21 +357,6 @@
             }
         }
         return -1;
-    }
-
-    /**
-     * 閫氳繃A鐐瑰潗鏍囷紝闀垮害鍜孻杞磋搴﹁绠桞鐐瑰潗鏍�
-     */
-    public Double[] CalculateCoordinates(Double[] radarCoordinates, Integer distance, Double angle) {
-        double[] to_wgs84 = LonlatConver.gcj02_To_Wgs84(radarCoordinates[0], radarCoordinates[1]);
-        double Ax = to_wgs84[0]; // A 鐐圭殑 X 鍧愭爣
-        double Ay = to_wgs84[1]; // A 鐐圭殑 Y 鍧愭爣
-        double AB = distance; // AB 鐨勯暱搴�
-        double angleWithYAxisDegrees = angle; // AB 涓� Y 杞寸殑瑙掑害锛堜互搴︽暟琛ㄧず锛�
-        GeodeticCalculator calculator = new GeodeticCalculator();
-        GlobalCoordinates globalCoordinates = new GlobalCoordinates(Ay, Ax);
-        GlobalCoordinates globalCoordinates1 = calculator.calculateEndingGlobalCoordinates(Ellipsoid.WGS84, globalCoordinates, angleWithYAxisDegrees, AB);
-        return new Double[]{globalCoordinates1.getLongitude(), globalCoordinates1.getLatitude()};
     }
 
 }

--
Gitblit v1.9.3