src/main/java/com/ard/alarm/radar/controller/RadarController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/radar/domain/GuideInfo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/mqtt/MqttProducer.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/other/ByteUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/other/GisUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/tcp/ClientHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/tcp/ClientInitialize.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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);//è´è½½å¤´+è´è½½çcrc32æ ¡éª 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(); } } 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; } 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); } 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); } } 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) { 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转byteæ°ç» */ 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转byteæ°ç» */ 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) { 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ç¹åæ ï¼é¿åº¦åYè½´è§åº¦è®¡ç®Bç¹åæ */ @@ -26,4 +44,19 @@ GlobalCoordinates globalCoordinates1 = calculator.calculateEndingGlobalCoordinates(Ellipsoid.WGS84, globalCoordinates, angleWithYAxisDegrees, AB); return new Double[]{globalCoordinates1.getLongitude(), globalCoordinates1.getLatitude()}; } /** * 计ç®ä»fromå°toæ¹åçç´çº¿ä¸æ£åæ¹åå¤¹è§ * * @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(); } } 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();//å¼å§åéå¿è·³ } 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); // è¿æ¥å¤±è´¥ä¿¡æ¯ä»mapç§»é¤ tureConnectMap.remove(futureListener.channel().id()); SuccessConnectMap.remove(ardEquipRadar.getId()); } else { log.debug("é·è¾¾ã" + host + ":" + port + "ãè¿æ¥æå"); // è¿æ¥æåä¿¡æ¯ä»Setæé¤ 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; }