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.RadarNettyTcpClient;
|
import io.netty.buffer.ByteBuf;
|
import io.netty.channel.Channel;
|
import io.netty.channel.ChannelFuture;
|
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= RadarNettyTcpClient.SERVER_MAP.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);
|
}
|
}
|