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 map = new HashMap<>(); map.put("distance",distance); map.put("p",p); map.put("t",t); return AjaxResult.success(map); } }