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