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