‘liusuyi’
2024-03-11 98d58d2b1e29432457213e4a9874fef537f68e6c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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.util.ByteUtils;
import com.ard.utils.util.GisUtils;
import com.ard.utils.netty.tcp.ClientInitialize;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j;
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;
import java.util.HashMap;
import java.util.Map;
 
/**
 * @Description: 雷达接口
 * @ClassName: RadarController
 * @Author: 刘苏义
 * @Date: 2023年11月01日14:12:31
 **/
@RestController
@RequestMapping("/radar")
@Slf4j(topic = "netty")
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 = ClientInitialize.SucChannelMap.get(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort());
        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)) * -1;
        log.debug("distance:" + distance);
        log.debug("p:" + p);
        log.debug("t:" + t);
        //发送告警前端的角度提示
        byte[] header = {0x01, 0x02, 0x01};//包头
        byte[] payloadHeader = {0x10, 0x03, 0x20, 0x00};//负载头
        byte[] distanceBytes = ByteUtils.decimalToBytes((int) distance);
        distanceBytes = ByteUtils.toLittleEndian(distanceBytes);
        byte[] pBytes = ByteUtils.floatToBytes(p);
        pBytes = ByteUtils.toLittleEndian(pBytes);
        byte[] tBytes = ByteUtils.floatToBytes(t);
        tBytes = ByteUtils.toLittleEndian(tBytes);
        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);
 
        ByteBuf message = channel.alloc().buffer();
        message.writeBytes(data);
        channel.writeAndFlush(message);
        Map<String,Object> map = new HashMap<>();
        map.put("distance",distance);
        map.put("p",p);
        map.put("t",t);
        return AjaxResult.success(map);
    }
}