From 606d7388589829e6a7108a48898d4e4126312d73 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期三, 01 十一月 2023 16:38:11 +0800
Subject: [PATCH] 增加雷达角度引导信息反馈

---
 src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java |    4 +
 src/main/java/com/ard/utils/tcp/ClientHandler.java                           |    2 
 src/main/java/com/ard/utils/other/GisUtils.java                              |   33 +++++++++++
 src/main/java/com/ard/alarm/radar/controller/RadarController.java            |   79 ++++++++++++++++++++++++++
 src/main/java/com/ard/utils/other/ByteUtils.java                             |   31 ++++++++++
 src/main/java/com/ard/utils/tcp/ClientInitialize.java                        |    6 +
 src/main/java/com/ard/utils/mqtt/MqttProducer.java                           |    1 
 src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java         |    2 
 src/main/java/com/ard/alarm/radar/domain/GuideInfo.java                      |   15 +++++
 9 files changed, 169 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/ard/alarm/radar/controller/RadarController.java b/src/main/java/com/ard/alarm/radar/controller/RadarController.java
new file mode 100644
index 0000000..e4dfbad
--- /dev/null
+++ b/src/main/java/com/ard/alarm/radar/controller/RadarController.java
@@ -0,0 +1,79 @@
+package com.ard.alarm.radar.controller;
+
+import com.ard.alarm.radar.domain.ArdEquipRadar;
+import com.ard.alarm.radar.domain.GuideInfo;
+import com.ard.alarm.radar.service.IArdEquipRadarService;
+import com.ard.utils.http.AjaxResult;
+import com.ard.utils.other.ByteUtils;
+import com.ard.utils.other.GisUtils;
+import com.ard.utils.tcp.ClientInitialize;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.Channel;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 闆疯揪鎺ュ彛
+ * @ClassName: RadarController
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�11鏈�01鏃�14:12:31
+ **/
+@RestController
+@RequestMapping("/radar")
+public class RadarController {
+
+    @Resource
+    IArdEquipRadarService ardEquipRadarService;
+
+    /**
+     * 瑙掑害寮曞淇℃伅鍙嶉
+     */
+    @PostMapping("/guideInfoBack")
+    public AjaxResult guideInfoBack(@RequestBody GuideInfo guideInfo) {
+        double[] targetPosition = guideInfo.getTargetPosition();
+        ArdEquipRadar ardEquipRadar = ardEquipRadarService.selectArdEquipRadarById(guideInfo.getRadarId());
+        if (ardEquipRadar == null) {
+            return AjaxResult.error("闆疯揪涓嶅瓨鍦�");
+        }
+        Channel channel = (Channel)ClientInitialize.SuccessConnectMap.get(ardEquipRadar.getId());
+        if (channel==null)
+        {
+            return AjaxResult.error("闆疯揪鏈繛鎺�");
+        }
+        Double longitude = ardEquipRadar.getLongitude();//闆疯揪缁忓害
+        Double latitude = ardEquipRadar.getLatitude();//闆疯揪绾害
+        Double altitude = ardEquipRadar.getAltitude();//闆疯揪楂樺害
+        //璁$畻姘村钩瑙掑害
+        float p = (float)GisUtils.getNorthAngle(longitude, latitude, targetPosition[0], targetPosition[1]);
+        //璁$畻鍨傜洿瑙掑害
+        double[] radarPosition = new double[2];
+        radarPosition[0] = longitude;
+        radarPosition[1] = latitude;
+        double distance = GisUtils.getDistance(radarPosition, targetPosition);
+        float angleInRadians = (float)Math.atan(distance / altitude);
+        float t = 90-(float)Math.toDegrees(angleInRadians);
+
+        //鍙戦�佸憡璀﹀墠绔殑瑙掑害鎻愮ず
+        byte[] header = {0x01, 0x02, 0x01};//鍖呭ご
+        byte[] payloadHeader = {0x10, 0x03, 0x40, 0x00};//璐熻浇澶�
+        byte[] distanceBytes = ByteUtils.decimalToBytes((int)distance);
+        byte[] pBytes = ByteUtils.floatToBytes(p);
+        byte[] tBytes = ByteUtils.floatToBytes(t);
+        byte[] resBytes=new byte[20];
+        byte[] payloadBody = ByteUtils.appendArrays(distanceBytes,pBytes,tBytes,resBytes);//璐熻浇
+
+        byte[] payload = ByteUtils.appendArrays(payloadHeader,payloadBody);//璐熻浇澶�+璐熻浇
+        byte[] payloadCrc32 = ByteUtils.parseCrc32(payload);//璐熻浇澶�+璐熻浇鐨刢rc32鏍¢獙
+        byte[] footer = {0x01, 0x02, 0x00};//鍖呭熬
+        byte[] data = ByteUtils.appendArrays(header, payload, payloadCrc32, footer);
+        System.out.println(ByteUtils.printHexBinary(data));
+        ByteBuf message = channel.alloc().buffer();
+        message.writeBytes(data);
+        channel.writeAndFlush(message);
+        return AjaxResult.success();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ard/alarm/radar/domain/GuideInfo.java b/src/main/java/com/ard/alarm/radar/domain/GuideInfo.java
new file mode 100644
index 0000000..1ea7bbf
--- /dev/null
+++ b/src/main/java/com/ard/alarm/radar/domain/GuideInfo.java
@@ -0,0 +1,15 @@
+package com.ard.alarm.radar.domain;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @ClassName: GuideInfo
+ * @Author: 鍒樿嫃涔�
+ * @Date: 2023骞�11鏈�01鏃�15:45:10
+ **/
+@Data
+public class GuideInfo {
+    String radarId;
+    double[] targetPosition;
+}
diff --git a/src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java b/src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java
index c999aa5..97c6b45 100644
--- a/src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java
+++ b/src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java
@@ -18,5 +18,5 @@
      * @return radar闆嗗悎
      */
     public List<ArdEquipRadar> selectArdEquipRadarList(ArdEquipRadar ardEquipRadar);
-
+    public ArdEquipRadar selectArdEquipRadarById(String radarId);
 }
\ No newline at end of file
diff --git a/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java b/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java
index 5b141dc..1cb657a 100644
--- a/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java
+++ b/src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java
@@ -34,4 +34,8 @@
         return ardEquipRadarMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public ArdEquipRadar selectArdEquipRadarById(String radarId) {
+        return ardEquipRadarMapper.selectById(radarId);
+    }
 }
diff --git a/src/main/java/com/ard/utils/mqtt/MqttProducer.java b/src/main/java/com/ard/utils/mqtt/MqttProducer.java
index aef7240..901dc64 100644
--- a/src/main/java/com/ard/utils/mqtt/MqttProducer.java
+++ b/src/main/java/com/ard/utils/mqtt/MqttProducer.java
@@ -56,6 +56,7 @@
             getClient();
             // 2 璁剧疆閰嶇疆
             MqttConnectOptions options = getOptions();
+            options.setMaxInflight(1000);
             // 3 鏈�鍚庤缃�
             create(options);
         } catch (Exception e) {
diff --git a/src/main/java/com/ard/utils/other/ByteUtils.java b/src/main/java/com/ard/utils/other/ByteUtils.java
index b82cd85..f89e0e9 100644
--- a/src/main/java/com/ard/utils/other/ByteUtils.java
+++ b/src/main/java/com/ard/utils/other/ByteUtils.java
@@ -1,5 +1,6 @@
 package com.ard.utils.other;
 
+import javax.xml.bind.DatatypeConverter;
 import java.io.ByteArrayOutputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
@@ -14,6 +15,14 @@
  * @Version: 1.0
  **/
 public class ByteUtils {
+
+    /**
+     * 鎵撳嵃鍗佸叚杩涘埗浜岃繘鍒�
+     */
+    public static String printHexBinary(byte[] bytes) {
+        return DatatypeConverter.printHexBinary(bytes);
+    }
+
     /**
      * byte鏁扮粍杞腑鏂囧瓧绗︿覆
      */
@@ -116,6 +125,28 @@
     }
 
     /**
+     * double杞琤yte鏁扮粍
+     */
+    public static byte[] doubleToBytes(double d) {
+        long value = Double.doubleToRawLongBits(d);
+        byte[] byteRet = new byte[8];
+        for (int i = 0; i < 8; i++) {
+            byteRet[i] = (byte) ((value >> 8 * i) & 0xff);
+        }
+        return byteRet;
+    }
+    /**
+     * float杞琤yte鏁扮粍
+     */
+    public static byte[] floatToBytes(float f) {
+        // 鍒涘缓涓�涓� ByteBuffer锛屽垎閰嶈冻澶熺殑绌洪棿鏉ュ瓨鍌ㄤ竴涓� float 鍊�
+        ByteBuffer buffer = ByteBuffer.allocate(Float.BYTES);
+        // 灏� float 鍊煎啓鍏� ByteBuffer
+        buffer.putFloat(f);
+        // 鑾峰彇瀛楄妭鏁扮粍
+        return buffer.array();
+    }
+    /**
      * byte鏁扮粍鎷兼帴
      */
     public static byte[] appendArrays(byte[]... arrays) {
diff --git a/src/main/java/com/ard/utils/other/GisUtils.java b/src/main/java/com/ard/utils/other/GisUtils.java
index e58ca17..29b96c6 100644
--- a/src/main/java/com/ard/utils/other/GisUtils.java
+++ b/src/main/java/com/ard/utils/other/GisUtils.java
@@ -3,6 +3,7 @@
 import org.gavaghan.geodesy.Ellipsoid;
 import org.gavaghan.geodesy.GeodeticCalculator;
 import org.gavaghan.geodesy.GlobalCoordinates;
+import org.gavaghan.geodesy.GlobalPosition;
 
 /**
  * @Description: gis宸ュ叿绫�
@@ -12,6 +13,23 @@
  * @Version: 1.0
  **/
 public class GisUtils {
+    public static GeodeticCalculator geodeticCalculator = new GeodeticCalculator();
+    /**
+     * 鏍规嵁缁忕含搴︼紝璁$畻涓ょ偣闂寸殑璺濈
+     *
+     * @param From 绗竴涓偣鐨勭粡绾害
+     * @param To  绗簩涓偣鐨勭粡绾害
+     * @return 杩斿洖璺濈 鍗曚綅绫�
+     */
+    public static double getDistance(double[] From, double[] To) {
+        double longitudeFrom = From[0];
+        double latitudeFrom = From[1];
+        double longitudeTo = To[0];
+        double latitudeTo = To[1];
+        GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom);
+        GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
+        return geodeticCalculator.calculateGeodeticCurve(Ellipsoid.WGS84, source, target).getEllipsoidalDistance();
+    }
     /**
      * 閫氳繃A鐐瑰潗鏍囷紝闀垮害鍜孻杞磋搴﹁绠桞鐐瑰潗鏍�
      */
@@ -26,4 +44,19 @@
         GlobalCoordinates globalCoordinates1 = calculator.calculateEndingGlobalCoordinates(Ellipsoid.WGS84, globalCoordinates, angleWithYAxisDegrees, AB);
         return new Double[]{globalCoordinates1.getLongitude(), globalCoordinates1.getLatitude()};
     }
+    /**
+     * 璁$畻浠巉rom鍒皌o鏂瑰悜鐨勭洿绾夸笌姝e寳鏂瑰悜澶硅
+     *
+     * @param longitudeFrom 绗竴涓偣鐨勭粡搴�
+     * @param latitudeFrom  绗竴涓偣鐨勭含搴�
+     * @param longitudeTo   绗簩涓偣鐨勭粡搴�
+     * @param latitudeTo    绗簩涓偣鐨勭含搴�
+     * @return 杩斿洖瑙掑害
+     */
+    public static double getNorthAngle(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo) {
+        GlobalPosition source = new GlobalPosition(latitudeFrom, longitudeFrom, 0);
+        GlobalPosition target = new GlobalPosition(latitudeTo, longitudeTo, 0);
+        return geodeticCalculator.calculateGeodeticMeasurement(Ellipsoid.WGS84, source, target).getAzimuth();
+    }
+
 }
diff --git a/src/main/java/com/ard/utils/tcp/ClientHandler.java b/src/main/java/com/ard/utils/tcp/ClientHandler.java
index 6df4b26..2693e76 100644
--- a/src/main/java/com/ard/utils/tcp/ClientHandler.java
+++ b/src/main/java/com/ard/utils/tcp/ClientHandler.java
@@ -43,7 +43,7 @@
      * @throws Exception
      */
     @Override
-    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+    public void channelActive(ChannelHandlerContext ctx) {
         context = ctx;
         startHeartbeatTask();//寮�濮嬪彂閫佸績璺�
     }
diff --git a/src/main/java/com/ard/utils/tcp/ClientInitialize.java b/src/main/java/com/ard/utils/tcp/ClientInitialize.java
index 15023cf..dfc0ca8 100644
--- a/src/main/java/com/ard/utils/tcp/ClientInitialize.java
+++ b/src/main/java/com/ard/utils/tcp/ClientInitialize.java
@@ -49,7 +49,7 @@
     private Bootstrap bootstrap;
     public static CopyOnWriteArraySet<ArdEquipRadar> falseConnectSet = new CopyOnWriteArraySet();
     public static ConcurrentHashMap<ChannelId, ArdEquipRadar> tureConnectMap = new ConcurrentHashMap();
-
+    public static ConcurrentHashMap<String, Object> SuccessConnectMap = new ConcurrentHashMap();
     /**
      * Netty鍒濆鍖栭厤缃�
      */
@@ -110,12 +110,14 @@
                 falseConnectSet.add(ardEquipRadar);
                 // 杩炴帴澶辫触淇℃伅浠巑ap绉婚櫎
                 tureConnectMap.remove(futureListener.channel().id());
+                SuccessConnectMap.remove(ardEquipRadar.getId());
             } else {
                 log.debug("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ユ垚鍔�");
                 // 杩炴帴鎴愬姛淇℃伅浠嶴et鎷旈櫎
                 falseConnectSet.remove(ardEquipRadar);
                 // 杩炴帴鎴愬姛淇℃伅鍐欏叆map
                 tureConnectMap.put(futureListener.channel().id(), ardEquipRadar);
+                SuccessConnectMap.put(ardEquipRadar.getId(),futureListener.channel());
             }
         });
     }
@@ -124,7 +126,7 @@
      * 鍒濆鍖栨柟娉�
      */
     @Override
-    public void run(ApplicationArguments args) throws Exception {
+    public void run(ApplicationArguments args) {
         if (!tcpClientEnable) {
             return;
         }

--
Gitblit v1.9.3