‘liusuyi’
2023-11-01 606d7388589829e6a7108a48898d4e4126312d73
增加雷达角度引导信息反馈
已添加2个文件
已修改7个文件
173 ■■■■■ 文件已修改
src/main/java/com/ard/alarm/radar/controller/RadarController.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/radar/domain/GuideInfo.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/radar/service/IArdEquipRadarService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/alarm/radar/service/impl/ArdEquipRadarServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/mqtt/MqttProducer.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/other/ByteUtils.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/other/GisUtils.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/tcp/ClientHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ard/utils/tcp/ClientInitialize.java 6 ●●●●● 补丁 | 查看 | 原始文档 | 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;
        }