From 8fd0194ec3fff942c6e475319e48842b27d1dda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 28 Feb 2024 13:57:47 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20dron=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20>=20drone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/palnet/kac/app/KacAppApplication.java | 2 + .../controller/InnerSocketController.java | 4 +- .../scheduled/InnerSocketScheduled.java | 24 ++++ .../socket/service/InnerSocketService.java | 114 +++++++++++++++--- .../socket/storage/ControlGpsStorage.java | 48 ++++++++ .../{DronDecoder.java => DroneDecoder.java} | 16 +-- .../{DronEncoder.java => DroneEncoder.java} | 14 +-- .../kac/socket/core/command/DronCommand.java | 8 -- .../kac/socket/core/command/DroneCommand.java | 8 ++ ...andImpl.java => AdsbDroneCommandImpl.java} | 78 ++++++------ ...ndImpl.java => AntosDroneCommandImpl.java} | 76 ++++++------ ...Impl.java => SandboxDroneCommandImpl.java} | 76 ++++++------ .../{DronHandler.java => DroneHandler.java} | 34 +++--- .../core/model/{DronRq.java => DroneRq.java} | 6 +- .../core/model/{DronRs.java => DroneRs.java} | 2 +- .../core/socket/ChannelInitializer.java | 12 +- .../socket/core/storage/ControlStorage.java | 4 +- .../{DronStorage.java => DroneStorage.java} | 60 ++++----- .../palnet/kac/socket/core/util/DronUtil.java | 10 -- .../kac/socket/service/KacAppService.java | 6 +- .../kac/socket/service/ScheduledService.java | 14 +-- .../kac/socket/service/WebSocketService.java | 10 +- .../controller/SocketReceiverController.java | 10 +- .../kac/websocket/core/codec/Encoder.java | 4 +- .../core/storage/ControlStorage.java | 14 +-- .../kac/websocket/core/util/DronUtil.java | 10 -- .../kac/websocket/service/ControlService.java | 18 +-- .../websocket/service/ScheduledService.java | 8 +- ...onControlDto.java => DroneControlDto.java} | 6 +- .../common/{DronDto.java => DroneDto.java} | 8 +- ...onHistoryDto.java => DroneHistoryDto.java} | 2 +- .../java/kr/co/palnet/kac/util/CoordUtil.java | 39 ++++++ .../java/kr/co/palnet/kac/util/DroneUtil.java | 10 ++ ...MapperUtils.java => ObjectMapperUtil.java} | 13 +- .../kac/data/ctr/model/CtrCntrlHstryArea.java | 2 +- .../repository/CtrCntrlHstryRepository.java | 3 + .../BaseAuthenticationExceptionHandler.java | 4 +- .../security/filter/JwtLoginFilter.java | 6 +- 38 files changed, 479 insertions(+), 304 deletions(-) create mode 100644 app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/scheduled/InnerSocketScheduled.java create mode 100644 app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/storage/ControlGpsStorage.java rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/{DronDecoder.java => DroneDecoder.java} (59%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/{DronEncoder.java => DroneEncoder.java} (54%) delete mode 100644 app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java create mode 100644 app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DroneCommand.java rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/{AdsbDronCommandImpl.java => AdsbDroneCommandImpl.java} (59%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/{AntosDronCommandImpl.java => AntosDroneCommandImpl.java} (61%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/{SandboxDronCommandImpl.java => SandboxDroneCommandImpl.java} (62%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/{DronHandler.java => DroneHandler.java} (72%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/{DronRq.java => DroneRq.java} (74%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/{DronRs.java => DroneRs.java} (92%) rename app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/{DronStorage.java => DroneStorage.java} (58%) delete mode 100644 app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/util/DronUtil.java delete mode 100644 app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/util/DronUtil.java rename common/model/src/main/java/kr/co/palnet/kac/common/model/common/{DronControlDto.java => DroneControlDto.java} (92%) rename common/model/src/main/java/kr/co/palnet/kac/common/model/common/{DronDto.java => DroneDto.java} (92%) rename common/model/src/main/java/kr/co/palnet/kac/common/model/common/{DronHistoryDto.java => DroneHistoryDto.java} (91%) create mode 100644 common/util/src/main/java/kr/co/palnet/kac/util/CoordUtil.java create mode 100644 common/util/src/main/java/kr/co/palnet/kac/util/DroneUtil.java rename common/util/src/main/java/kr/co/palnet/kac/util/{ObjectMapperUtils.java => ObjectMapperUtil.java} (72%) diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/KacAppApplication.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/KacAppApplication.java index 0efa020..bf380ad 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/KacAppApplication.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/KacAppApplication.java @@ -3,7 +3,9 @@ package kr.co.palnet.kac.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; +@EnableScheduling @SpringBootApplication(scanBasePackages = { "kr.co.palnet.kac.app", "kr.co.palnet.kac.data", diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java index ecc7c09..897b823 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java @@ -1,7 +1,7 @@ package kr.co.palnet.kac.app.api.v1.inner.socket.controller; import kr.co.palnet.kac.app.api.v1.inner.socket.service.InnerSocketService; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -28,7 +28,7 @@ public class InnerSocketController { } // dron 정보 저장 @PostMapping("/receiver/dron") - public ResponseEntity receiverDronData(@RequestBody DronDto dronDto) { + public ResponseEntity receiverDronData(@RequestBody DroneDto dronDto) { log.debug(">>>>> receiver <<<<<"); innerSocketService.setDronData(dronDto); return ResponseEntity.ok().build(); diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/scheduled/InnerSocketScheduled.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/scheduled/InnerSocketScheduled.java new file mode 100644 index 0000000..ad36ef2 --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/scheduled/InnerSocketScheduled.java @@ -0,0 +1,24 @@ +package kr.co.palnet.kac.app.api.v1.inner.socket.scheduled; + +import kr.co.palnet.kac.app.api.v1.inner.socket.service.InnerSocketService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Slf4j +@RequiredArgsConstructor +@Component +public class InnerSocketScheduled { + + private final InnerSocketService innerSocketService; + + /** + * 최신 수신일로 부터 특정 시간동안 데이터 수신되지 않는 경우 종료 처리 + */ + @Scheduled(fixedDelay = 10 * 1000) + public void stopDronFlight() { + log.debug("drone flight stop scheduler started."); + innerSocketService.stopDronFlight(); + } +} diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java index 487d36c..d5f46b9 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java @@ -1,21 +1,23 @@ package kr.co.palnet.kac.app.api.v1.inner.socket.service; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.app.api.v1.inner.socket.storage.ControlGpsStorage; +import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas; import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstry; +import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstryArea; import kr.co.palnet.kac.data.ctr.repository.CtrCntrlBasRepository; +import kr.co.palnet.kac.data.ctr.repository.CtrCntrlHstryAreaRepository; import kr.co.palnet.kac.data.ctr.repository.CtrCntrlHstryRepository; +import kr.co.palnet.kac.util.CoordUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.UUID; +import java.util.*; @Slf4j @RequiredArgsConstructor @@ -25,7 +27,11 @@ public class InnerSocketService { private final CtrCntrlBasRepository ctrCntrlBasRepository; private final CtrCntrlHstryRepository ctrCntrlHstryRepository; + private final CtrCntrlHstryAreaRepository ctrCntrlHstryAreaRepository; + private long STOP_UNKON = 5; + + // socket에 보내줄 control 조회 (controlId 발급용도) public SimpleControlDto getControlId(String objectId) { log.debug(">>>>> getControlId <<<<<"); log.debug(">>>>> objectId : {} <<<<<", objectId); @@ -58,28 +64,104 @@ public class InnerSocketService { simpleControlDto.setTypeCd("02"); simpleControlDto.setAreaTrnsYn("E"); } else { - simpleControlDto.setControlId(UUID.randomUUID().toString()); + String controlId = UUID.randomUUID().toString(); + simpleControlDto.setControlId(controlId); simpleControlDto.setTypeCd("01"); simpleControlDto.setAreaTrnsYn("N"); // 기체 식별번호의 관제 ID 저장 (single ton) -// shareContext.putIdntfKey(id, controlID); + ControlGpsStorage simpleControlStorage = ControlGpsStorage.getInstance(); + simpleControlStorage.put(objectId, controlId); } return simpleControlDto; } - public static void main(String[] args) { - Instant now = Instant.now(); - Instant d = now.plus(12, ChronoUnit.MINUTES); - long diffMinutes = ChronoUnit.MINUTES.between(now, d); - System.out.println(diffMinutes); - long diffMinutes2 = ChronoUnit.MINUTES.between(d, now); - System.out.println(diffMinutes2); - } - // socket으로부터 받은 dron 정보 저장 - public void setDronData(DronDto dronDto) { + public void setDronData(DroneDto dronDto) { // TODO } + + /** + * 특정 시간동안 비행하지않는 데이터 종료처리 + */ + public void stopDronFlight() { + ControlGpsStorage simpleControlStorage = ControlGpsStorage.getInstance(); + Map keys = simpleControlStorage.getAll(); + + + keys.forEach((objectId, controlId) -> { + CtrCntrlHstry history = ctrCntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(controlId).orElse(null); + + if (Objects.nonNull(history)) { + long diffMinute = ChronoUnit.MINUTES.between(history.getSrvrRcvDt(), Instant.now()); + + if (diffMinute > 5) { + CtrCntrlBas ctrCntrlBas = ctrCntrlBasRepository.findById(controlId).orElse(null); + + if (ctrCntrlBas != null) { + // 기존 + ctrCntrlBas.setEndTypeCd("01"); + ctrCntrlBas.setCntrlEndDt(Instant.now()); + ctrCntrlBas.setStatusCd("99"); + + // 총 비행거리 Update + Double distance = getDistancSum(history.getCntrlId()); + if (distance == null) log.error("No Search - CntrlId => {}", history.getCntrlId()); + + ctrCntrlBas.setTtlDstnc(distance); + ctrCntrlBas.setTtlDstncType("M"); + ctrCntrlBas.setUpdateDt(Instant.now()); + + ctrCntrlBasRepository.save(ctrCntrlBas); + } + + /* 종료지점 주소 저장 */ + CtrCntrlHstryArea area = CtrCntrlHstryArea.builder() + .cntrlId(history.getCntrlId()) + .actnType("99") + .prcsYn("N") + .lat(history.getLat()) + .lon(history.getLon()) + .hstrySno(history.getHstrySno()) + .createDt(Instant.now()) + .updateDt(Instant.now()) + .build(); + + ctrCntrlHstryAreaRepository.save(area); + + simpleControlStorage.remove(objectId); + } + } + }); + } + + private Double getDistancSum(String cntrlId) { + List result = ctrCntrlHstryRepository.findAllByCntrlIdOrderBySrvrRcvDt(cntrlId); + if (result.size() == 0) return null; + + List distanceList = new ArrayList<>(); + + for (int i = 0; i < result.size(); i++) { + if (i == 0) continue; + + CtrCntrlHstry prevNode = result.get(i - 1); + CtrCntrlHstry node = result.get(i); + + CoordUtil.Coordinates prevCoord = CoordUtil.Coordinates.builder() + .x(prevNode.getLat()) + .y(prevNode.getLon()) + .build(); + CoordUtil.Coordinates coord = CoordUtil.Coordinates.builder() + .x(node.getLat()) + .y(node.getLon()) + .build(); + + Double distance = CoordUtil.calculateDistance(prevCoord, coord); + + distanceList.add(distance); + } + + return distanceList.stream().mapToDouble(Double::doubleValue).sum(); + } } diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/storage/ControlGpsStorage.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/storage/ControlGpsStorage.java new file mode 100644 index 0000000..3004405 --- /dev/null +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/storage/ControlGpsStorage.java @@ -0,0 +1,48 @@ +package kr.co.palnet.kac.app.api.v1.inner.socket.storage; + + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ControlGpsStorage { + + private Map mappingMap; + + private ControlGpsStorage() { + mappingMap = new ConcurrentHashMap<>(); + } + + public static ControlGpsStorage getInstance() { + return LazyHolder.INSTANCE; + } + + private static class LazyHolder { + private static final ControlGpsStorage INSTANCE = new ControlGpsStorage(); + } + + public void put(String objectId, String controlId) { + mappingMap.put(objectId, controlId); + } + + public String get(String objectId) { + return mappingMap.get(objectId); + } + + public String remove(String objectId) { + return mappingMap.remove(objectId); + } + + public boolean containsKey(String objectId) { + return mappingMap.containsKey(objectId); + } + + public List getAllList() { + return (List) mappingMap.values(); + } + + public Map getAll() { + return mappingMap; + } + +} diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronDecoder.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneDecoder.java similarity index 59% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronDecoder.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneDecoder.java index 7b38f83..2b69cfa 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronDecoder.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneDecoder.java @@ -3,8 +3,8 @@ package kr.co.palnet.kac.socket.core.codec; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageDecoder; -import kr.co.palnet.kac.socket.core.model.DronRq; -import kr.co.palnet.kac.util.ObjectMapperUtils; +import kr.co.palnet.kac.socket.core.model.DroneRq; +import kr.co.palnet.kac.util.ObjectMapperUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -13,17 +13,17 @@ import java.util.List; @Slf4j @RequiredArgsConstructor -public class DronDecoder extends MessageToMessageDecoder { +public class DroneDecoder extends MessageToMessageDecoder { // private int DATA_LENGTH = 100; - private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper(); + private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(); @Override protected void decode(ChannelHandlerContext ctx, String in, List out) throws Exception { - log.info(">>>>> decode <<<<<"); + log.debug(">>>>> decode <<<<<"); try { - DronRq payload = objectMapper.readValue(in, DronRq.class); - if (payload != null) { - out.add(payload); + DroneRq droneRq = objectMapper.readValue(in, DroneRq.class); + if (droneRq != null) { + out.add(droneRq); } } catch (Exception e) { log.warn("decode parsing error : {} :: {}", e.getMessage(), in); diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronEncoder.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneEncoder.java similarity index 54% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronEncoder.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneEncoder.java index 1b4b099..17d74af 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronEncoder.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DroneEncoder.java @@ -3,7 +3,7 @@ package kr.co.palnet.kac.socket.core.codec; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageEncoder; -import kr.co.palnet.kac.util.ObjectMapperUtils; +import kr.co.palnet.kac.util.ObjectMapperUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -11,18 +11,18 @@ import java.util.List; @Slf4j @RequiredArgsConstructor -public class DronEncoder extends MessageToMessageEncoder { +public class DroneEncoder extends MessageToMessageEncoder { - private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper(); + private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(); @Override - protected void encode(ChannelHandlerContext ctx, Object msg, List out) throws Exception { - log.info(">>>>> encode <<<"); + protected void encode(ChannelHandlerContext ctx, Object in, List out) throws Exception { + log.debug(">>>>> encode <<<"); try { - String json = objectMapper.writeValueAsString(msg); + String json = objectMapper.writeValueAsString(in); out.add(json); } catch (Exception e) { - log.warn("json parsing error : {} :: {}", e.getMessage(), msg); + log.warn("json parsing error : {} :: {}", e.getMessage(), in); } } } diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java deleted file mode 100644 index 2c94d2f..0000000 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java +++ /dev/null @@ -1,8 +0,0 @@ -package kr.co.palnet.kac.socket.core.command; - -import kr.co.palnet.kac.socket.core.model.DronRq; - -public interface DronCommand { - void command(final DronRq rq); - String getCommandName(); -} diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DroneCommand.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DroneCommand.java new file mode 100644 index 0000000..f7f094a --- /dev/null +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DroneCommand.java @@ -0,0 +1,8 @@ +package kr.co.palnet.kac.socket.core.command; + +import kr.co.palnet.kac.socket.core.model.DroneRq; + +public interface DroneCommand { + void command(final DroneRq rq); + String getCommandName(); +} diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDronCommandImpl.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java similarity index 59% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDronCommandImpl.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java index 1d229ec..ff06d97 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDronCommandImpl.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java @@ -1,15 +1,15 @@ package kr.co.palnet.kac.socket.core.command.impl; import kr.co.palnet.kac.common.model.common.ControlDto; -import kr.co.palnet.kac.common.model.common.DronDto; -import kr.co.palnet.kac.common.model.common.DronHistoryDto; +import kr.co.palnet.kac.common.model.common.DroneDto; +import kr.co.palnet.kac.common.model.common.DroneHistoryDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; -import kr.co.palnet.kac.socket.core.command.DronCommand; -import kr.co.palnet.kac.socket.core.model.DronRq; +import kr.co.palnet.kac.socket.core.command.DroneCommand; +import kr.co.palnet.kac.socket.core.model.DroneRq; import kr.co.palnet.kac.socket.core.storage.ControlStorage; -import kr.co.palnet.kac.socket.core.util.DronUtil; import kr.co.palnet.kac.socket.service.KacAppService; import kr.co.palnet.kac.socket.service.WebSocketService; +import kr.co.palnet.kac.util.DroneUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -22,7 +22,7 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Component -public class AdsbDronCommandImpl implements DronCommand { +public class AdsbDroneCommandImpl implements DroneCommand { private final WebSocketService webSocketService; private final KacAppService kacAppService; @@ -37,59 +37,59 @@ public class AdsbDronCommandImpl implements DronCommand { } @Override - public void command(DronRq rq) { + public void command(DroneRq rq) { log.info(">>>> AdsbCommandServiceImpl <<<<<"); - List resultList = rq.getBody(); + List resultList = rq.getBody(); /** 전문 설정 ***/ final String messageType = "LTEM"; final String objectType = "DRON"; /** 데이터 모델링 **/ - for (DronDto dron : resultList) { + for (DroneDto drone : resultList) { // 위,경도 좌표가 0으로 들어오는 것은 무시 처리 - if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) { + if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) { - dron.setObjectType(objectType); - dron.setMessageType(messageType); - dron.setTerminalId(rq.getTerminalId()); - dron.setRegDt(Instant.now()); + drone.setObjectType(objectType); + drone.setMessageType(messageType); + drone.setTerminalId(rq.getTerminalId()); + drone.setRegDt(Instant.now()); // 서버 수신 시간 정보 - dron.setServerRcvDt(Instant.now()); + drone.setServerRcvDt(Instant.now()); // 관제 이력 정보 - List hisList; + List hisList; - DronHistoryDto history = DronHistoryDto.builder() - .objectId(dron.getObjectId()) - .lat(dron.getLat()) - .lon(dron.getLon()) + DroneHistoryDto history = DroneHistoryDto.builder() + .objectId(drone.getObjectId()) + .lat(drone.getLat()) + .lon(drone.getLon()) .build(); - if (dron.getPostionHistory() != null) { - hisList = dron.getPostionHistory(); + if (drone.getPostionHistory() != null) { + hisList = drone.getPostionHistory(); } else { hisList = new ArrayList<>(); } hisList.add(history); - dron.setPostionHistory(hisList); + drone.setPostionHistory(hisList); // STEP 1. 전에 내부 메모리에서 controlId 조회 ControlStorage controlStorage = ControlStorage.getInstance(); - ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId()); + ControlDto droneCacheDTO = controlStorage.get(drone.getObjectId()); - if (dronCacheDTO == null) { + if (droneCacheDTO == null) { // STEP 1. Control ID 발급 -> Application Server Http 통신 try { - SimpleControlDto simpleControlDto = kacAppService.getControlId(dron.getObjectId()); + SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId()); - dron.setControlId(simpleControlDto.getControlId()); - dron.setTypeCd(simpleControlDto.getTypeCd()); - dron.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); - dron.setControlStartDt(Instant.now()); + drone.setControlId(simpleControlDto.getControlId()); + drone.setTypeCd(simpleControlDto.getTypeCd()); + drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); + drone.setControlStartDt(Instant.now()); ControlDto controlDto = new ControlDto(); controlDto.setControlId(simpleControlDto.getControlId()); @@ -102,13 +102,13 @@ public class AdsbDronCommandImpl implements DronCommand { } } else { - dron.setControlId(dronCacheDTO.getControlId()); - dron.setTypeCd("02"); - dron.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn()); - dron.setControlWarnCd(dronCacheDTO.isControlWarnCd()); - dronCacheDTO.setRegTime(System.currentTimeMillis()); + drone.setControlId(droneCacheDTO.getControlId()); + drone.setTypeCd("02"); + drone.setAreaTrnsYn(droneCacheDTO.getAreaTrnsYn()); + drone.setControlWarnCd(droneCacheDTO.isControlWarnCd()); + droneCacheDTO.setRegTime(System.currentTimeMillis()); - controlStorage.put(dron.getObjectId(), dronCacheDTO); + controlStorage.put(drone.getObjectId(), droneCacheDTO); } // STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리 try { @@ -117,7 +117,7 @@ public class AdsbDronCommandImpl implements DronCommand { DronStorage dronStorage = DronStorage.getInstance(); dronStorage.add(dron); */ - kacAppService.sendData(dron); + kacAppService.sendData(drone); } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } @@ -125,8 +125,8 @@ public class AdsbDronCommandImpl implements DronCommand { // STEP 3. 화면에 표출할 정보 WebSocket 전달 try { - if ("PA".equals(dron.getObjectId().substring(0, 2))) { - webSocketService.sendData(dron); + if ("PA".equals(drone.getObjectId().substring(0, 2))) { + webSocketService.sendData(drone); } } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDronCommandImpl.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java similarity index 61% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDronCommandImpl.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java index 9fa64cc..68e0418 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDronCommandImpl.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java @@ -1,15 +1,15 @@ package kr.co.palnet.kac.socket.core.command.impl; import kr.co.palnet.kac.common.model.common.ControlDto; -import kr.co.palnet.kac.common.model.common.DronDto; -import kr.co.palnet.kac.common.model.common.DronHistoryDto; +import kr.co.palnet.kac.common.model.common.DroneDto; +import kr.co.palnet.kac.common.model.common.DroneHistoryDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; -import kr.co.palnet.kac.socket.core.command.DronCommand; -import kr.co.palnet.kac.socket.core.model.DronRq; +import kr.co.palnet.kac.socket.core.command.DroneCommand; +import kr.co.palnet.kac.socket.core.model.DroneRq; import kr.co.palnet.kac.socket.core.storage.ControlStorage; -import kr.co.palnet.kac.socket.core.util.DronUtil; import kr.co.palnet.kac.socket.service.KacAppService; import kr.co.palnet.kac.socket.service.WebSocketService; +import kr.co.palnet.kac.util.DroneUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -22,7 +22,7 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Component -public class AntosDronCommandImpl implements DronCommand { +public class AntosDroneCommandImpl implements DroneCommand { private final WebSocketService webSocketService; private final KacAppService kacAppService; @@ -36,59 +36,59 @@ public class AntosDronCommandImpl implements DronCommand { } @Override - public void command(DronRq rq) { + public void command(DroneRq rq) { log.info(">>>> AntosCommandServiceImpl <<<<<"); - List resultList = rq.getBody(); + List resultList = rq.getBody(); /** 전문 설정 ***/ final String messageType = "LTEM"; final String objectType = "DRON"; /** 데이터 모델링 **/ - for (DronDto dron : resultList) { + for (DroneDto drone : resultList) { // 위,경도 좌표가 0으로 들어오는 것은 무시 처리 - if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) { + if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) { - dron.setObjectType(objectType); - dron.setMessageType(messageType); - dron.setTerminalId(rq.getTerminalId()); - dron.setRegDt(Instant.now()); + drone.setObjectType(objectType); + drone.setMessageType(messageType); + drone.setTerminalId(rq.getTerminalId()); + drone.setRegDt(Instant.now()); // 서버 수신 시간 정보 - dron.setServerRcvDt(Instant.now()); + drone.setServerRcvDt(Instant.now()); // 관제 이력 정보 - List hisList; + List hisList; - DronHistoryDto history = DronHistoryDto.builder() - .objectId(dron.getObjectId()) - .lat(dron.getLat()) - .lon(dron.getLon()) + DroneHistoryDto history = DroneHistoryDto.builder() + .objectId(drone.getObjectId()) + .lat(drone.getLat()) + .lon(drone.getLon()) .build(); - if (dron.getPostionHistory() != null) { - hisList = dron.getPostionHistory(); + if (drone.getPostionHistory() != null) { + hisList = drone.getPostionHistory(); } else { hisList = new ArrayList<>(); } hisList.add(history); - dron.setPostionHistory(hisList); + drone.setPostionHistory(hisList); // STEP 1. 전에 내부 메모리에서 controlId 조회 ControlStorage controlStorage = ControlStorage.getInstance(); - ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId()); + ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId()); if (dronCacheDTO == null) { // STEP 1. Control ID 발급 -> Application Server Http 통신 try { - SimpleControlDto simpleControlDto = kacAppService.getControlId(dron.getObjectId()); + SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId()); - dron.setControlId(simpleControlDto.getControlId()); - dron.setTypeCd(simpleControlDto.getTypeCd()); - dron.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); - dron.setControlStartDt(Instant.now()); + drone.setControlId(simpleControlDto.getControlId()); + drone.setTypeCd(simpleControlDto.getTypeCd()); + drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); + drone.setControlStartDt(Instant.now()); ControlDto controlDto = new ControlDto(); controlDto.setControlId(simpleControlDto.getControlId()); @@ -96,20 +96,20 @@ public class AntosDronCommandImpl implements DronCommand { controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); controlDto.setRegTime(System.currentTimeMillis()); - controlStorage.put(dron.getObjectId(), controlDto); + controlStorage.put(drone.getObjectId(), controlDto); } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } } else { - dron.setControlId(dronCacheDTO.getControlId()); - dron.setTypeCd("02"); - dron.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn()); - dron.setControlWarnCd(dronCacheDTO.isControlWarnCd()); + drone.setControlId(dronCacheDTO.getControlId()); + drone.setTypeCd("02"); + drone.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn()); + drone.setControlWarnCd(dronCacheDTO.isControlWarnCd()); dronCacheDTO.setRegTime(System.currentTimeMillis()); - controlStorage.put(dron.getObjectId(), dronCacheDTO); + controlStorage.put(drone.getObjectId(), dronCacheDTO); } // STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리 try { @@ -118,7 +118,7 @@ public class AntosDronCommandImpl implements DronCommand { DronStorage dronStorage = DronStorage.getInstance(); dronStorage.add(dron); */ - kacAppService.sendData(dron); + kacAppService.sendData(drone); } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } @@ -126,8 +126,8 @@ public class AntosDronCommandImpl implements DronCommand { // STEP 3. 화면에 표출할 정보 WebSocket 전달 try { - if ("PA".equals(dron.getObjectId().substring(0, 2))) { - webSocketService.sendData(dron); + if ("PA".equals(drone.getObjectId().substring(0, 2))) { + webSocketService.sendData(drone); } } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDronCommandImpl.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java similarity index 62% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDronCommandImpl.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java index fb7ae40..e6eda14 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDronCommandImpl.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java @@ -1,15 +1,15 @@ package kr.co.palnet.kac.socket.core.command.impl; import kr.co.palnet.kac.common.model.common.ControlDto; -import kr.co.palnet.kac.common.model.common.DronDto; -import kr.co.palnet.kac.common.model.common.DronHistoryDto; +import kr.co.palnet.kac.common.model.common.DroneDto; +import kr.co.palnet.kac.common.model.common.DroneHistoryDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; -import kr.co.palnet.kac.socket.core.command.DronCommand; -import kr.co.palnet.kac.socket.core.model.DronRq; +import kr.co.palnet.kac.socket.core.command.DroneCommand; +import kr.co.palnet.kac.socket.core.model.DroneRq; import kr.co.palnet.kac.socket.core.storage.ControlStorage; -import kr.co.palnet.kac.socket.core.util.DronUtil; import kr.co.palnet.kac.socket.service.KacAppService; import kr.co.palnet.kac.socket.service.WebSocketService; +import kr.co.palnet.kac.util.DroneUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -22,7 +22,7 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Component -public class SandboxDronCommandImpl implements DronCommand { +public class SandboxDroneCommandImpl implements DroneCommand { private final WebSocketService webSocketService; private final KacAppService kacAppService; @@ -36,59 +36,59 @@ public class SandboxDronCommandImpl implements DronCommand { } @Override - public void command(DronRq rq) { + public void command(DroneRq rq) { log.info(">>>> SandboxCommandServiceImpl <<<<<"); - List resultList = rq.getBody(); + List resultList = rq.getBody(); /** 전문 설정 ***/ final String messageType = "LTEM"; final String objectType = "DRON"; /** 데이터 모델링 **/ - for (DronDto dron : resultList) { + for (DroneDto drone : resultList) { // 위,경도 좌표가 0으로 들어오는 것은 무시 처리 - if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) { + if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) { - dron.setObjectType(objectType); - dron.setMessageType(messageType); - dron.setTerminalId(rq.getTerminalId()); - dron.setRegDt(Instant.now()); + drone.setObjectType(objectType); + drone.setMessageType(messageType); + drone.setTerminalId(rq.getTerminalId()); + drone.setRegDt(Instant.now()); // 서버 수신 시간 정보 - dron.setServerRcvDt(Instant.now()); + drone.setServerRcvDt(Instant.now()); // 관제 이력 정보 - List hisList; + List hisList; - DronHistoryDto history = DronHistoryDto.builder() - .objectId(dron.getObjectId()) - .lat(dron.getLat()) - .lon(dron.getLon()) + DroneHistoryDto history = DroneHistoryDto.builder() + .objectId(drone.getObjectId()) + .lat(drone.getLat()) + .lon(drone.getLon()) .build(); - if (dron.getPostionHistory() != null) { - hisList = dron.getPostionHistory(); + if (drone.getPostionHistory() != null) { + hisList = drone.getPostionHistory(); } else { hisList = new ArrayList<>(); } hisList.add(history); - dron.setPostionHistory(hisList); + drone.setPostionHistory(hisList); Long start = System.currentTimeMillis(); // STEP 1. 전에 내부 메모리에서 controlId 조회 ControlStorage controlStorage = ControlStorage.getInstance(); - ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId()); + ControlDto dronCacheDTO = controlStorage.get(drone.getObjectId()); if (dronCacheDTO == null) { // STEP 1. Control ID 발급 -> Application Server Http 통신 try { - SimpleControlDto simpleControlDto = kacAppService.getControlId(dron.getObjectId()); + SimpleControlDto simpleControlDto = kacAppService.getControlId(drone.getObjectId()); - dron.setControlId(simpleControlDto.getControlId()); - dron.setTypeCd(simpleControlDto.getTypeCd()); - dron.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); - dron.setControlStartDt(Instant.now()); + drone.setControlId(simpleControlDto.getControlId()); + drone.setTypeCd(simpleControlDto.getTypeCd()); + drone.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); + drone.setControlStartDt(Instant.now()); ControlDto controlDto = new ControlDto(); controlDto.setControlId(simpleControlDto.getControlId()); @@ -96,20 +96,20 @@ public class SandboxDronCommandImpl implements DronCommand { controlDto.setAreaTrnsYn(simpleControlDto.getAreaTrnsYn()); controlDto.setRegTime(System.currentTimeMillis()); - controlStorage.put(dron.getObjectId(), controlDto); + controlStorage.put(drone.getObjectId(), controlDto); } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } } else { - dron.setControlId(dronCacheDTO.getControlId()); - dron.setTypeCd("02"); - dron.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn()); - dron.setControlWarnCd(dronCacheDTO.isControlWarnCd()); + drone.setControlId(dronCacheDTO.getControlId()); + drone.setTypeCd("02"); + drone.setAreaTrnsYn(dronCacheDTO.getAreaTrnsYn()); + drone.setControlWarnCd(dronCacheDTO.isControlWarnCd()); dronCacheDTO.setRegTime(System.currentTimeMillis()); - controlStorage.put(dron.getObjectId(), dronCacheDTO); + controlStorage.put(drone.getObjectId(), dronCacheDTO); } @@ -120,20 +120,20 @@ public class SandboxDronCommandImpl implements DronCommand { DronStorage dronStorage = DronStorage.getInstance(); dronStorage.add(dron); */ - kacAppService.sendData(dron); + kacAppService.sendData(drone); } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } // STEP 3. 화면에 표출할 정보 WebSocket 전달 try { - webSocketService.sendData(dron); + webSocketService.sendData(drone); } catch (Exception e) { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } Long end = System.currentTimeMillis(); - log.info(">>> during time : {} - {}", dron.getObjectId(), end - start); + log.info(">>> during time : {} - {}", drone.getObjectId(), end - start); } else { log.error("좌표 정보가 존재하지 않습니다."); diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DronHandler.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java similarity index 72% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DronHandler.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java index 294695a..c1d58bd 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DronHandler.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java @@ -3,9 +3,9 @@ package kr.co.palnet.kac.socket.core.handler; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import kr.co.palnet.kac.socket.core.command.DronCommand; -import kr.co.palnet.kac.socket.core.model.DronRq; -import kr.co.palnet.kac.socket.core.model.DronRs; +import kr.co.palnet.kac.socket.core.command.DroneCommand; +import kr.co.palnet.kac.socket.core.model.DroneRq; +import kr.co.palnet.kac.socket.core.model.DroneRs; import kr.co.palnet.kac.socket.core.storage.AuthKeyStorage; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -17,25 +17,25 @@ import java.util.Map; @Slf4j @ChannelHandler.Sharable @Component -public class DronHandler extends SimpleChannelInboundHandler { +public class DroneHandler extends SimpleChannelInboundHandler { - private final Map commandMap; + private final Map commandMap; - public DronHandler(List commandList) { + public DroneHandler(List commandList) { commandMap = new HashMap<>(); - for (DronCommand command : commandList) { + for (DroneCommand command : commandList) { commandMap.put(command.getCommandName(), command); } } // @Override - protected void channelRead0(ChannelHandlerContext ctx, DronRq rq) throws Exception { + protected void channelRead0(ChannelHandlerContext ctx, DroneRq rq) throws Exception { log.info(">>>> channelRead0 <<<<<"); // key 검사 if (rq == null) { - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("-1000") .message("data is empty.") .build()); @@ -43,7 +43,7 @@ public class DronHandler extends SimpleChannelInboundHandler { } if (rq.getCommand() == null || rq.getCommand().isEmpty()) { - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("-1001") .message("command is empty.") .build()); @@ -51,7 +51,7 @@ public class DronHandler extends SimpleChannelInboundHandler { } if (rq.getAuthKey() == null || rq.getAuthKey().isEmpty()) { - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("-2000") .message("auth key is empty.") .build()); @@ -59,7 +59,7 @@ public class DronHandler extends SimpleChannelInboundHandler { } if (AuthKeyStorage.getInstance().checkAuthKey(rq.getCommand())) { - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("-2000") .message("Invalid auth key.") .build()); @@ -68,10 +68,10 @@ public class DronHandler extends SimpleChannelInboundHandler { log.info(">>> rq : {}", rq); - DronCommand commandService = commandMap.get(rq.getCommand().trim()); + DroneCommand commandService = commandMap.get(rq.getCommand().trim()); if (commandService == null) { - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("-2100") .message("this command is not exist.") .build()); @@ -80,13 +80,13 @@ public class DronHandler extends SimpleChannelInboundHandler { try { commandService.command(rq); } catch (Exception e) { - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("-500") .message("server error - execute command") .build()); return; } - ctx.writeAndFlush(DronRs.builder() + ctx.writeAndFlush(DroneRs.builder() .code("0") .message("success") .build()); @@ -96,7 +96,7 @@ public class DronHandler extends SimpleChannelInboundHandler { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { log.info(">>>> exceptionCaught <<<<<"); - DronRs rs = DronRs.builder() + DroneRs rs = DroneRs.builder() .code("-9999") .message("error - etc") .build(); diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRq.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRq.java similarity index 74% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRq.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRq.java index 73eca4e..f6b9b33 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRq.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRq.java @@ -1,6 +1,6 @@ package kr.co.palnet.kac.socket.core.model; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,7 +12,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Builder -public class DronRq { +public class DroneRq { private String authKey; @@ -20,6 +20,6 @@ public class DronRq { private String command; - private List body; + private List body; } diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRs.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRs.java similarity index 92% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRs.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRs.java index 6780365..464c56e 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRs.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DroneRs.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Builder -public class DronRs { +public class DroneRs { private String code; private String message; } diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java index 84297f0..cf18396 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/socket/ChannelInitializer.java @@ -6,9 +6,9 @@ import io.netty.handler.codec.json.JsonObjectDecoder; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; -import kr.co.palnet.kac.socket.core.codec.DronDecoder; -import kr.co.palnet.kac.socket.core.codec.DronEncoder; -import kr.co.palnet.kac.socket.core.handler.DronHandler; +import kr.co.palnet.kac.socket.core.codec.DroneDecoder; +import kr.co.palnet.kac.socket.core.codec.DroneEncoder; +import kr.co.palnet.kac.socket.core.handler.DroneHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,7 +18,7 @@ import org.springframework.stereotype.Component; @Component public class ChannelInitializer extends io.netty.channel.ChannelInitializer { - private final DronHandler dronSocketHandler; + private final DroneHandler dronSocketHandler; // 클라이언트 소켓 채널이 생성될 때 호출 @Override @@ -31,8 +31,8 @@ public class ChannelInitializer extends io.netty.channel.ChannelInitializer REMOVE_TIME){ remove(key); } diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DronStorage.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java similarity index 58% rename from app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DronStorage.java rename to app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java index 8cb4810..fdda9d8 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DronStorage.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DroneStorage.java @@ -1,6 +1,6 @@ package kr.co.palnet.kac.socket.core.storage; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import lombok.extern.slf4j.Slf4j; import java.time.Instant; @@ -10,64 +10,64 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Slf4j -public class DronStorage { +public class DroneStorage { - private final Map> dronMap; + private final Map> droneMap; private final int REMOVE_TIME = 1000 * 10; - private DronStorage() { - dronMap = new ConcurrentHashMap<>(); + private DroneStorage() { + droneMap = new ConcurrentHashMap<>(); } - public static DronStorage getInstance() { + public static DroneStorage getInstance() { return LazyHolder.INSTANCE; } public static class LazyHolder { - private static final DronStorage INSTANCE = new DronStorage(); + private static final DroneStorage INSTANCE = new DroneStorage(); } - public Map> getAll() { - if (dronMap.keySet().isEmpty()) { + public Map> getAll() { + if (droneMap.keySet().isEmpty()) { return null; } - return dronMap; + return droneMap; } - public List get(String objectId) { + public List get(String objectId) { if (objectId == null || objectId.isEmpty()) { return null; } - if (dronMap.get(objectId) == null) { + if (droneMap.get(objectId) == null) { return null; } - return dronMap.get(objectId); + return droneMap.get(objectId); } - public void add(DronDto dron) { - if (dron == null || dron.getObjectId() == null || dron.getObjectId().isEmpty()) { + public void add(DroneDto drone) { + if (drone == null || drone.getObjectId() == null || drone.getObjectId().isEmpty()) { return; } - List list = dronMap.get(dron.getObjectId()); + List list = droneMap.get(drone.getObjectId()); if (list == null) { list = new ArrayList<>(); } - list.add(dron); - dronMap.put(dron.getObjectId(), list); + list.add(drone); + droneMap.put(drone.getObjectId(), list); } // 1분 이상된 데이터 삭제 또는 처리가 끝난 데이터 삭제 public void removeByCondition() { - for (String key : dronMap.keySet()) { - List list = dronMap.get(key); + for (String key : droneMap.keySet()) { + List list = droneMap.get(key); if (list == null) { continue; } else if (list.isEmpty()) { - dronMap.remove(key); + droneMap.remove(key); continue; } @@ -75,37 +75,37 @@ public class DronStorage { Instant compareTime = Instant.now().minusSeconds(60); // 마지막 데이터가 1분 이상된 데이터라면 삭제 - DronDto lastDronDto = list.getLast(); + DroneDto lastDronDto = list.getLast(); if ((lastDronDto.isSendHistroy() && lastDronDto.isSendUtm()) || compareTime.isAfter(lastDronDto.getRegDt())) { list.remove(lastDronDto); continue; } // 그외 데이터에서 조건에 맞는 데이터들만 삭제 - list.removeIf(dron -> (dron.isSendHistroy() && dron.isSendUtm()) || compareTime.isAfter(dron.getRegDt())); + list.removeIf(drone -> (drone.isSendHistroy() && drone.isSendUtm()) || compareTime.isAfter(drone.getRegDt())); } } - public List getAllByUtm() { + public List getAllByUtm() { // 보내지 않은 모든 데이터 추출 - return dronMap.values().stream().reduce((list, result) -> { + return droneMap.values().stream().reduce((list, result) -> { result.addAll(list); return result; }).orElse(new ArrayList<>()).stream().filter(dronDto -> !dronDto.isSendUtm()).toList(); } - public List getAllByHistory() { + public List getAllByHistory() { // 보내지 않은 모든 데이터 추출 - return dronMap.values().stream().reduce((list, result) -> { + return droneMap.values().stream().reduce((list, result) -> { result.addAll(list); return result; }).orElse(new ArrayList<>()).stream().filter(dronDto -> !dronDto.isSendHistroy()).toList(); } public static void main(String[] args) { - DronStorage dronStorage = DronStorage.getInstance(); + DroneStorage dronStorage = DroneStorage.getInstance(); - DronDto dronDto = new DronDto(); + DroneDto dronDto = new DroneDto(); dronDto.setObjectId("test"); dronDto.setSendHistroy(false); dronDto.setSendUtm(false); @@ -113,7 +113,7 @@ public class DronStorage { dronStorage.add(dronDto); - List allByUtm = dronStorage.getAllByUtm(); + List allByUtm = dronStorage.getAllByUtm(); allByUtm.forEach(c -> c.setSendUtm(true)); log.info("..."); } diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/util/DronUtil.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/util/DronUtil.java deleted file mode 100644 index 69153b1..0000000 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/util/DronUtil.java +++ /dev/null @@ -1,10 +0,0 @@ -package kr.co.palnet.kac.socket.core.util; - -public class DronUtil { - public static boolean latlonCheck(double lat, double lon) { - if (lat > 32 && lat < 44 && lon > 124 && lon < 133) { - return true; - } - return false; - } -} diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java index 34de33b..6061c71 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java @@ -1,6 +1,6 @@ package kr.co.palnet.kac.socket.service; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.common.model.common.SimpleControlDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -37,8 +37,8 @@ public class KacAppService { return resp.getBody(); } - // dron 데이터 전송 - public void sendData(DronDto dto) { + // drone 데이터 전송 + public void sendData(DroneDto dto) { RestClient client = getRestClient(); ResponseEntity resp = client.post() .uri(SEND_ALL) diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java index 2918736..d92b4d8 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ScheduledService.java @@ -1,8 +1,8 @@ package kr.co.palnet.kac.socket.service; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.socket.core.model.UtmDto; -import kr.co.palnet.kac.socket.core.storage.DronStorage; +import kr.co.palnet.kac.socket.core.storage.DroneStorage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -24,8 +24,8 @@ public class ScheduledService { @Scheduled(fixedDelay = 1000 * 2) public void sendDataToUtm() { log.info(">>>> sendDataToUtm <<<<<"); - DronStorage dronStorage = DronStorage.getInstance(); - List list = dronStorage.getAllByUtm(); + DroneStorage dronStorage = DroneStorage.getInstance(); + List list = dronStorage.getAllByUtm(); // 가공 List dronInfoList = list.stream().map(model -> { @@ -50,18 +50,18 @@ public class ScheduledService { .build(); // if (externalService.sendDataToUtm(utmDto)) { -// list.forEach(dron -> dron.setSendUtm(true)); +// list.forEach(drone -> drone.setSendUtm(true)); // } // TODO 현재 통신이 안되므로 모두 보낸다는 가정으로 진행 - list.forEach(dron -> dron.setSendUtm(true)); + list.forEach(drone -> drone.setSendUtm(true)); } @Scheduled(fixedDelay = 1000 * 30) public void removeDron() { log.info(">>>> removeDron <<<<<"); - DronStorage dronStorage = DronStorage.getInstance(); + DroneStorage dronStorage = DroneStorage.getInstance(); dronStorage.removeByCondition(); } } diff --git a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java index f69a445..3295014 100644 --- a/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java +++ b/app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java @@ -1,6 +1,6 @@ package kr.co.palnet.kac.socket.service; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -8,8 +8,6 @@ import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.client.RestClient; -import java.time.Instant; - @Slf4j @RequiredArgsConstructor @Service @@ -17,12 +15,12 @@ public class WebSocketService { @Value("${app.web-socket-web.host}") private String webSocketWebHost; - private final String SEND_DRON_DATA = "/v1/api/ws/dron"; + private final String SEND_DRONE_DATA = "/v1/api/ws/dron"; - public void sendData(DronDto dto) { + public void sendData(DroneDto dto) { RestClient client = RestClient.create(); client.post() - .uri(webSocketWebHost + SEND_DRON_DATA) + .uri(webSocketWebHost + SEND_DRONE_DATA) .contentType(MediaType.APPLICATION_JSON) .body(dto) .retrieve() diff --git a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java index e08bb9c..1c49a1a 100644 --- a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java +++ b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java @@ -1,8 +1,8 @@ package kr.co.palnet.kac.websocket.controller; -import kr.co.palnet.kac.common.model.common.DronControlDto; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneControlDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.websocket.core.storage.ControlStorage; import kr.co.palnet.kac.websocket.service.ControlService; import lombok.RequiredArgsConstructor; @@ -21,11 +21,11 @@ public class SocketReceiverController { private final ControlService controlService; - @PostMapping("/dron") - public ResponseEntity receiver(@RequestBody DronDto dronDTO) { + @PostMapping("/drone") + public ResponseEntity receiver(@RequestBody DroneDto dronDTO) { log.info("websocket message receiver : {}", dronDTO); - DronControlDto history = controlService.dronDtoToControlDtoConvert(dronDTO); + DroneControlDto history = controlService.dronDtoToControlDtoConvert(dronDTO); // DRON의 대한 식별정보만 이력 관리 ControlStorage controlCache = ControlStorage.getInstance(); diff --git a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java index 988b9e0..e49a98b 100644 --- a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java +++ b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/codec/Encoder.java @@ -3,7 +3,7 @@ package kr.co.palnet.kac.websocket.core.codec; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageEncoder; -import kr.co.palnet.kac.util.ObjectMapperUtils; +import kr.co.palnet.kac.util.ObjectMapperUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -13,7 +13,7 @@ import java.util.List; @RequiredArgsConstructor public class Encoder extends MessageToMessageEncoder { - private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper(); + private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(); @Override protected void encode(ChannelHandlerContext ctx, Object msg, List out) throws Exception { diff --git a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java index ae8b586..bbebaa7 100644 --- a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java +++ b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java @@ -1,6 +1,6 @@ package kr.co.palnet.kac.websocket.core.storage; -import kr.co.palnet.kac.common.model.common.DronControlDto; +import kr.co.palnet.kac.common.model.common.DroneControlDto; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -15,7 +15,7 @@ public class ControlStorage { private final int REMOVE_TIME_SECOND = 60; // 화면 노출 시간 - private final Map controlMap; + private final Map controlMap; private ControlStorage() { controlMap = new ConcurrentHashMap<>(); @@ -29,14 +29,14 @@ public class ControlStorage { private static final ControlStorage INSTANCE = new ControlStorage(); } - public Map getAll() { + public Map getAll() { if (controlMap.keySet().isEmpty()) { return null; } return controlMap; } - public DronControlDto get(String objectId) { + public DroneControlDto get(String objectId) { if (objectId == null || objectId.isEmpty()) { return null; } @@ -46,7 +46,7 @@ public class ControlStorage { return controlMap.get(objectId); } - public DronControlDto put(DronControlDto control) { + public DroneControlDto put(DroneControlDto control) { if (control == null || control.getObjectId() == null || control.getObjectId().isEmpty()) { return null; } @@ -54,11 +54,11 @@ public class ControlStorage { return controlMap.put(control.getObjectId(), control); } - public List getList() { + public List getList() { return new ArrayList<>(controlMap.values()); } - public DronControlDto remove(String objectId) { + public DroneControlDto remove(String objectId) { return controlMap.remove(objectId); } diff --git a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/util/DronUtil.java b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/util/DronUtil.java deleted file mode 100644 index bea3769..0000000 --- a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/util/DronUtil.java +++ /dev/null @@ -1,10 +0,0 @@ -package kr.co.palnet.kac.websocket.core.util; - -public class DronUtil { - public static boolean latlonCheck(double lat, double lon) { - if (lat > 32 && lat < 44 && lon > 124 && lon < 133) { - return true; - } - return false; - } -} diff --git a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java index 16ab975..e604465 100644 --- a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java +++ b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java @@ -1,7 +1,7 @@ package kr.co.palnet.kac.websocket.service; -import kr.co.palnet.kac.common.model.common.DronControlDto; -import kr.co.palnet.kac.common.model.common.DronDto; +import kr.co.palnet.kac.common.model.common.DroneControlDto; +import kr.co.palnet.kac.common.model.common.DroneDto; import kr.co.palnet.kac.websocket.core.storage.ControlStorage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,11 +15,11 @@ import java.util.*; public class ControlService { - public List getList() { - List list = new ArrayList<>(); + public List getList() { + List list = new ArrayList<>(); ControlStorage controlCache = ControlStorage.getInstance(); - Map allHistory = controlCache.getAll(); + Map allHistory = controlCache.getAll(); log.info(">>> getList :: {}", allHistory); @@ -53,12 +53,12 @@ public class ControlService { return list; } - public DronControlDto dronDtoToControlDtoConvert(DronDto dronDTO) { + public DroneControlDto dronDtoToControlDtoConvert(DroneDto dronDTO) { ControlStorage controlCache = ControlStorage.getInstance(); - DronControlDto prevControlDTO = controlCache.get(dronDTO.getObjectId()); + DroneControlDto prevControlDTO = controlCache.get(dronDTO.getObjectId()); - DronControlDto controlDTO = new DronControlDto(); + DroneControlDto controlDTO = new DroneControlDto(); controlDTO.setObjectId(dronDTO.getObjectId()); controlDTO.setControlId(dronDTO.getControlId()); @@ -72,7 +72,7 @@ public class ControlService { controlDTO.setSpeed(dronDTO.getSpeed()); controlDTO.setBetteryLevel(dronDTO.getBetteryLevel()); controlDTO.setBetteryVoltage(dronDTO.getBetteryVoltage()); - controlDTO.setDronStatus(dronDTO.getDronStatus()); + controlDTO.setDroneStatus(dronDTO.getDroneStatus()); controlDTO.setHeading(dronDTO.getHeading()); controlDTO.setMoveDistance(dronDTO.getMoveDistance()); controlDTO.setMoveDistanceType(dronDTO.getMoveDistanceType()); diff --git a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java index d38affd..d24a07e 100644 --- a/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java +++ b/app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.channel.group.ChannelGroup; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; -import kr.co.palnet.kac.common.model.common.DronControlDto; -import kr.co.palnet.kac.util.ObjectMapperUtils; +import kr.co.palnet.kac.common.model.common.DroneControlDto; +import kr.co.palnet.kac.util.ObjectMapperUtil; import kr.co.palnet.kac.websocket.core.storage.ChannelStorage; import kr.co.palnet.kac.websocket.core.storage.ControlStorage; import lombok.RequiredArgsConstructor; @@ -20,7 +20,7 @@ import java.util.List; @Service public class ScheduledService { - private final ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper(); + private final ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(); // 접속한 모든 채널에 데이터 전송 @@ -32,7 +32,7 @@ public class ScheduledService { ChannelGroup channelGroup = channelStorage.getGroup(); // 데이터 가져오기 ControlStorage controlStorage = ControlStorage.getInstance(); - List controlDtoList = controlStorage.getList(); + List controlDtoList = controlStorage.getList(); if (controlDtoList == null || controlDtoList.isEmpty()) return; diff --git a/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronControlDto.java b/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneControlDto.java similarity index 92% rename from common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronControlDto.java rename to common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneControlDto.java index fb79136..726f3d4 100644 --- a/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronControlDto.java +++ b/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneControlDto.java @@ -13,7 +13,7 @@ import java.util.Map; @NoArgsConstructor @AllArgsConstructor @Builder -public class DronControlDto implements Comparable { +public class DroneControlDto implements Comparable { private String messageTypeCd; @@ -43,7 +43,7 @@ public class DronControlDto implements Comparable { private String takeOffPositon; - private String dronStatus; + private String droneStatus; private Double heading; @@ -76,7 +76,7 @@ public class DronControlDto implements Comparable { private Instant regDt; @Override - public int compareTo(DronControlDto o) { + public int compareTo(DroneControlDto o) { if (o.getControlStartDt() != null && controlStartDt != null) { return o.getControlStartDt().compareTo(controlStartDt); } diff --git a/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronDto.java b/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java similarity index 92% rename from common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronDto.java rename to common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java index 4f58d68..5a40dad 100644 --- a/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronDto.java +++ b/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java @@ -12,7 +12,7 @@ import java.util.List; @NoArgsConstructor @AllArgsConstructor @Builder -public class DronDto { +public class DroneDto { private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터 private String messageType; @@ -52,7 +52,7 @@ public class DronDto { @Builder.Default private Double betteryVoltage = 0.0; - private String dronStatus; + private String droneStatus; @Builder.Default private Double heading = 0.0; @@ -80,10 +80,10 @@ public class DronDto { private Double sensorDust = 0.0; //최근 5건만 저장 - private List recentPositionHistory; + private List recentPositionHistory; // 전체 히스토리 저장 - private List postionHistory; + private List postionHistory; // 비정상 상황 식별 코드 private boolean controlWarnCd; diff --git a/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronHistoryDto.java b/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneHistoryDto.java similarity index 91% rename from common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronHistoryDto.java rename to common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneHistoryDto.java index 992e594..b444ddc 100644 --- a/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronHistoryDto.java +++ b/common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneHistoryDto.java @@ -10,7 +10,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Builder -public class DronHistoryDto { +public class DroneHistoryDto { private String objectId; @Builder.Default diff --git a/common/util/src/main/java/kr/co/palnet/kac/util/CoordUtil.java b/common/util/src/main/java/kr/co/palnet/kac/util/CoordUtil.java new file mode 100644 index 0000000..34872d7 --- /dev/null +++ b/common/util/src/main/java/kr/co/palnet/kac/util/CoordUtil.java @@ -0,0 +1,39 @@ +package kr.co.palnet.kac.util; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +public class CoordUtil { + + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Coordinates { + public double x; + public double y; + } + + public static double calculateDistance(Coordinates c1, Coordinates c2) { + double earthRadius = 6371; // 지구의 반지름 (단위: km) + + // 위도와 경도를 라디안으로 변환 + double lat1 = Math.toRadians(c1.x); + double lon1 = Math.toRadians(c1.y); + double lat2 = Math.toRadians(c2.x); + double lon2 = Math.toRadians(c2.y); + + // Haversine 공식을 사용하여 두 지점 간의 거리 계산 + double dlon = lon2 - lon1; + double dlat = lat2 - lat1; + double a = Math.sin(dlat / 2) * Math.sin(dlat / 2) + + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dlon / 2) * Math.sin(dlon / 2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + double distance = earthRadius * c; + + return distance; + } +} diff --git a/common/util/src/main/java/kr/co/palnet/kac/util/DroneUtil.java b/common/util/src/main/java/kr/co/palnet/kac/util/DroneUtil.java new file mode 100644 index 0000000..ad0208e --- /dev/null +++ b/common/util/src/main/java/kr/co/palnet/kac/util/DroneUtil.java @@ -0,0 +1,10 @@ +package kr.co.palnet.kac.util; + +public class DroneUtil { + public static boolean checkCoordinates(double lat, double lon) { + if (lat > 32 && lat < 44 && lon > 124 && lon < 133) { + return true; + } + return false; + } +} diff --git a/common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtils.java b/common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java similarity index 72% rename from common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtils.java rename to common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java index 60912cf..628cb9d 100644 --- a/common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtils.java +++ b/common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java @@ -1,21 +1,10 @@ package kr.co.palnet.kac.util; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import java.time.format.DateTimeFormatter; -import java.util.TimeZone; - -public class ObjectMapperUtils { +public class ObjectMapperUtil { public static ObjectMapper getObjectMapper() { return getObjectMapperBuilder().build(); } diff --git a/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/model/CtrCntrlHstryArea.java b/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/model/CtrCntrlHstryArea.java index 9e9013d..8948999 100644 --- a/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/model/CtrCntrlHstryArea.java +++ b/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/model/CtrCntrlHstryArea.java @@ -29,7 +29,7 @@ public class CtrCntrlHstryArea { // 이력일련번호 @Column(name = "HSTRY_SNO", nullable = false) // mysql :: "int unsigned" - private int hstrySno; + private Long hstrySno; // 관제ID @Column(name = "CNTRL_ID", length = 60, nullable = false) diff --git a/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/repository/CtrCntrlHstryRepository.java b/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/repository/CtrCntrlHstryRepository.java index ebb395b..71e90cd 100644 --- a/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/repository/CtrCntrlHstryRepository.java +++ b/data/ctr/src/main/java/kr/co/palnet/kac/data/ctr/repository/CtrCntrlHstryRepository.java @@ -3,10 +3,13 @@ package kr.co.palnet.kac.data.ctr.repository; import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstry; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; import java.util.Optional; public interface CtrCntrlHstryRepository extends JpaRepository { Optional findFirstByCntrlIdOrderBySrvrRcvDtDesc(String cntrlId); + + List findAllByCntrlIdOrderBySrvrRcvDt(String cntrlId); } diff --git a/web/security/src/main/java/kr/co/palnet/kac/config/security/exception/BaseAuthenticationExceptionHandler.java b/web/security/src/main/java/kr/co/palnet/kac/config/security/exception/BaseAuthenticationExceptionHandler.java index b8132f0..1a866f0 100644 --- a/web/security/src/main/java/kr/co/palnet/kac/config/security/exception/BaseAuthenticationExceptionHandler.java +++ b/web/security/src/main/java/kr/co/palnet/kac/config/security/exception/BaseAuthenticationExceptionHandler.java @@ -6,7 +6,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import kr.co.palnet.kac.config.security.model.BaseAuthErrorCode; import kr.co.palnet.kac.config.security.model.AuthErrorRS; -import kr.co.palnet.kac.util.ObjectMapperUtils; +import kr.co.palnet.kac.util.ObjectMapperUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; @@ -78,6 +78,6 @@ public class BaseAuthenticationExceptionHandler { response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getOutputStream().write(ObjectMapperUtils.getObjectMapper().writeValueAsBytes(rs)); + response.getOutputStream().write(ObjectMapperUtil.getObjectMapper().writeValueAsBytes(rs)); } } diff --git a/web/security/src/main/java/kr/co/palnet/kac/config/security/filter/JwtLoginFilter.java b/web/security/src/main/java/kr/co/palnet/kac/config/security/filter/JwtLoginFilter.java index 7f470bb..c03beed 100644 --- a/web/security/src/main/java/kr/co/palnet/kac/config/security/filter/JwtLoginFilter.java +++ b/web/security/src/main/java/kr/co/palnet/kac/config/security/filter/JwtLoginFilter.java @@ -11,7 +11,7 @@ import kr.co.palnet.kac.config.security.exception.BaseAuthenticationException; import kr.co.palnet.kac.config.security.model.BaseAuthErrorCode; import kr.co.palnet.kac.config.security.model.BaseUserDetails; import kr.co.palnet.kac.config.security.service.BaseUserDetailsService; -import kr.co.palnet.kac.util.ObjectMapperUtils; +import kr.co.palnet.kac.util.ObjectMapperUtil; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.security.authentication.AuthenticationManager; @@ -25,7 +25,7 @@ import java.io.IOException; public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter { private BaseUserDetailsService baseUserDetailsService; - private ObjectMapper objectMapper = ObjectMapperUtils.getObjectMapper(); + private ObjectMapper objectMapper = ObjectMapperUtil.getObjectMapper(); public JwtLoginFilter(BaseUserDetailsService baseUserDetailsService) { setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/v1/login", "POST")); @@ -61,6 +61,6 @@ public class JwtLoginFilter extends UsernamePasswordAuthenticationFilter { response.setHeader("Auth-Token", JwtUtil.makeAuthToken(user)); response.setHeader("Refresh-Token", JwtUtil.makeRefreshToken(user)); response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); - response.getOutputStream().write(ObjectMapperUtils.getObjectMapper().writeValueAsBytes(user.toMap())); + response.getOutputStream().write(ObjectMapperUtil.getObjectMapper().writeValueAsBytes(user.toMap())); } }