Browse Source

refactor: model 공통으로 가져오기

feature/socket
지대한 7 months ago
parent
commit
c36129450b
  1. 1
      app/kac-socket-app/build.gradle
  2. 6
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/KacSocketApplication.java
  3. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronDecoder.java
  4. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java
  5. 37
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDronCommandImpl.java
  6. 36
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDronCommandImpl.java
  7. 33
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDronCommandImpl.java
  8. 24
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DronHandler.java
  9. 97
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronDTO.java
  10. 5
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRq.java
  11. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRs.java
  12. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/ControlStorage.java
  13. 16
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DronStorage.java
  14. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java
  15. 4
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java
  16. 5
      app/kac-websocket-app/build.gradle
  17. 8
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java
  18. 20
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/model/DronHistoryDTO.java
  19. 15
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/storage/ControlStorage.java
  20. 16
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ControlService.java
  21. 5
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java
  22. 4
      common/model/build.gradle
  23. 2
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/ControlDto.java
  24. 6
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronControlDto.java
  25. 8
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronDto.java
  26. 4
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronHistoryDto.java

1
app/kac-socket-app/build.gradle

@ -3,6 +3,7 @@ dependencies {
implementation "$boot:spring-boot-starter"
implementation "io.netty:netty-all:4.1.68.Final"
implementation project(":common:util")
compileOnly project(":common:model")
}

6
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/KacSocketApplication.java

@ -1,15 +1,15 @@
package kr.co.palnet.kac.socket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@Slf4j
@EnableScheduling
@SpringBootApplication
public class KacSocketApplication {
public static void main(String[] args) {
log.info(">>>>> main <<<<<");
SpringApplication.run(KacSocketApplication.class, args);
}
}

4
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/codec/DronDecoder.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.MessageToMessageDecoder;
import kr.co.palnet.kac.socket.core.model.DronRQ;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.util.ObjectMapperUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -24,7 +24,7 @@ public class DronDecoder extends MessageToMessageDecoder<String> {
// TypeReference<DronRQ> typeRef = new TypeReference<DronRQ>() {
// };
// DronRQ payload = objectMapper.readValue(in, typeRef);
DronRQ payload = objectMapper.readValue(in, DronRQ.class);
DronRq payload = objectMapper.readValue(in, DronRq.class);
if (payload != null) {
out.add(payload);
}

4
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/DronCommand.java

@ -1,8 +1,8 @@
package kr.co.palnet.kac.socket.core.command;
import kr.co.palnet.kac.socket.core.model.DronRQ;
import kr.co.palnet.kac.socket.core.model.DronRq;
public interface DronCommand {
void command(final DronRQ rq);
void command(final DronRq rq);
String getCommandName();
}

37
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDronCommandImpl.java

@ -1,10 +1,10 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.socket.core.model.ControlDto;
import kr.co.palnet.kac.socket.core.model.DronDTO;
import kr.co.palnet.kac.socket.core.model.DronHistoryDTO;
import kr.co.palnet.kac.socket.core.model.DronRQ;
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.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.storage.DronStorage;
import kr.co.palnet.kac.socket.core.util.DronUtil;
@ -22,7 +22,10 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Instant;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor
@ -42,16 +45,16 @@ public class AdsbDronCommandImpl implements DronCommand {
}
@Override
public void command(DronRQ rq) {
public void command(DronRq rq) {
log.info(">>>> AdsbCommandServiceImpl <<<<<");
List<DronDTO> resultList = rq.getBody();
List<DronDto> resultList = rq.getBody();
/** 전문 설정 ***/
final String messageType = "LTEM";
final String objectType = "DRON";
/** 데이터 모델링 **/
for (DronDTO dron : resultList) {
for (DronDto dron : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) {
@ -64,9 +67,9 @@ public class AdsbDronCommandImpl implements DronCommand {
dron.setServerRcvDt(Instant.now());
// 관제 이력 정보
List<DronHistoryDTO> hisList;
List<DronHistoryDto> hisList;
DronHistoryDTO history = DronHistoryDTO.builder()
DronHistoryDto history = DronHistoryDto.builder()
.objectId(dron.getObjectId())
.lat(dron.getLat())
.lon(dron.getLon())
@ -83,8 +86,8 @@ public class AdsbDronCommandImpl implements DronCommand {
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlCacheUtil = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlCacheUtil.get(dron.getObjectId());
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId());
if (dronCacheDTO == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
@ -117,9 +120,7 @@ public class AdsbDronCommandImpl implements DronCommand {
controlDto.setTypeCd((String) data.get("typeCd"));
controlDto.setAreaTrnsYn((String) data.get("areaTrnsYn"));
controlDto.setRegTime(System.currentTimeMillis());
ControlDto newDronCacheDTO = ControlDto.builder().build();
controlCacheUtil.put(dron.getObjectId(), newDronCacheDTO);
controlStorage.put(dron.getObjectId(), controlDto);
} catch (IOException e) {
log.error("요청한 URL 정보가 잘못되었습니다.", e.getMessage());
@ -134,13 +135,13 @@ public class AdsbDronCommandImpl implements DronCommand {
dron.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
controlCacheUtil.put(dron.getObjectId(), dronCacheDTO);
controlStorage.put(dron.getObjectId(), dronCacheDTO);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
// 저장 해 놓았다가 한거번에 전송
DronStorage dronCacheUtil = DronStorage.getInstance();
dronCacheUtil.add(dron);
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}

36
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDronCommandImpl.java

@ -1,10 +1,10 @@
package kr.co.palnet.kac.socket.core.command.impl;
import kr.co.palnet.kac.socket.core.model.ControlDto;
import kr.co.palnet.kac.socket.core.model.DronDTO;
import kr.co.palnet.kac.socket.core.model.DronHistoryDTO;
import kr.co.palnet.kac.socket.core.model.DronRQ;
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.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.storage.DronStorage;
import kr.co.palnet.kac.socket.core.util.DronUtil;
@ -22,7 +22,10 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Instant;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor
@ -41,16 +44,16 @@ public class AntosDronCommandImpl implements DronCommand {
}
@Override
public void command(DronRQ rq) {
public void command(DronRq rq) {
log.info(">>>> AntosCommandServiceImpl <<<<<");
List<DronDTO> resultList = rq.getBody();
List<DronDto> resultList = rq.getBody();
/** 전문 설정 ***/
final String messageType = "LTEM";
final String objectType = "DRON";
/** 데이터 모델링 **/
for (DronDTO dron : resultList) {
for (DronDto dron : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) {
@ -63,9 +66,9 @@ public class AntosDronCommandImpl implements DronCommand {
dron.setServerRcvDt(Instant.now());
// 관제 이력 정보
List<DronHistoryDTO> hisList;
List<DronHistoryDto> hisList;
DronHistoryDTO history = DronHistoryDTO.builder()
DronHistoryDto history = DronHistoryDto.builder()
.objectId(dron.getObjectId())
.lat(dron.getLat())
.lon(dron.getLon())
@ -82,8 +85,8 @@ public class AntosDronCommandImpl implements DronCommand {
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlCacheUtil = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlCacheUtil.get(dron.getObjectId());
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId());
if (dronCacheDTO == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
@ -117,7 +120,7 @@ public class AntosDronCommandImpl implements DronCommand {
controlDto.setRegTime(System.currentTimeMillis());
ControlDto newDronCacheDTO = ControlDto.builder().build();
controlCacheUtil.put(dron.getObjectId(), newDronCacheDTO);
controlStorage.put(dron.getObjectId(), newDronCacheDTO);
} catch (IOException e) {
log.error("요청한 URL 정보가 잘못되었습니다.", e.getMessage());
@ -132,19 +135,18 @@ public class AntosDronCommandImpl implements DronCommand {
dron.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
controlCacheUtil.put(dron.getObjectId(), dronCacheDTO);
controlStorage.put(dron.getObjectId(), dronCacheDTO);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
// 저장 해 놓았다가 한거번에 전송
DronStorage dronCacheUtil = DronStorage.getInstance();
dronCacheUtil.add(dron);
DronStorage dronStorage = DronStorage.getInstance();
dronStorage.add(dron);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
// STEP 3. 화면에 표출할 정보 WebSocket 전달
if ("PA".equals(dron.getObjectId().substring(0, 2))) {
webSocketService.sendData(dron);

33
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDronCommandImpl.java

@ -1,10 +1,10 @@
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.socket.core.command.DronCommand;
import kr.co.palnet.kac.socket.core.model.ControlDto;
import kr.co.palnet.kac.socket.core.model.DronDTO;
import kr.co.palnet.kac.socket.core.model.DronHistoryDTO;
import kr.co.palnet.kac.socket.core.model.DronRQ;
import kr.co.palnet.kac.socket.core.model.DronRq;
import kr.co.palnet.kac.socket.core.storage.ControlStorage;
import kr.co.palnet.kac.socket.core.storage.DronStorage;
import kr.co.palnet.kac.socket.core.util.DronUtil;
@ -44,15 +44,15 @@ public class SandboxDronCommandImpl implements DronCommand {
}
@Override
public void command(DronRQ rq) {
public void command(DronRq rq) {
log.info(">>>> SandboxCommandServiceImpl <<<<<");
List<DronDTO> resultList = rq.getBody();
List<DronDto> resultList = rq.getBody();
/** 전문 설정 ***/
final String messageType = "LTEM";
final String objectType = "DRON";
/** 데이터 모델링 **/
for (DronDTO dron : resultList) {
for (DronDto dron : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DronUtil.latlonCheck(dron.getLat(), dron.getLon())) {
@ -65,9 +65,9 @@ public class SandboxDronCommandImpl implements DronCommand {
dron.setServerRcvDt(Instant.now());
// 관제 이력 정보
List<DronHistoryDTO> hisList;
List<DronHistoryDto> hisList;
DronHistoryDTO history = DronHistoryDTO.builder()
DronHistoryDto history = DronHistoryDto.builder()
.objectId(dron.getObjectId())
.lat(dron.getLat())
.lon(dron.getLon())
@ -85,8 +85,8 @@ public class SandboxDronCommandImpl implements DronCommand {
Long start = System.currentTimeMillis();
// STEP 1. 전에 내부 메모리에서 controlId 조회
ControlStorage controlCacheUtil = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlCacheUtil.get(dron.getObjectId());
ControlStorage controlStorage = ControlStorage.getInstance();
ControlDto dronCacheDTO = controlStorage.get(dron.getObjectId());
if (dronCacheDTO == null) {
// STEP 1. Control ID 발급 -> Application Server Http 통신
@ -121,7 +121,7 @@ public class SandboxDronCommandImpl implements DronCommand {
controlDto.setRegTime(System.currentTimeMillis());
ControlDto newDronCacheDTO = ControlDto.builder().build();
controlCacheUtil.put(dron.getObjectId(), newDronCacheDTO);
controlStorage.put(dron.getObjectId(), newDronCacheDTO);
} catch (IOException e) {
log.error("요청한 URL 정보가 잘못되었습니다.", e.getMessage());
@ -136,16 +136,15 @@ public class SandboxDronCommandImpl implements DronCommand {
dron.setControlWarnCd(dronCacheDTO.isControlWarnCd());
dronCacheDTO.setRegTime(System.currentTimeMillis());
controlCacheUtil.put(dron.getObjectId(), dronCacheDTO);
controlStorage.put(dron.getObjectId(), dronCacheDTO);
}
// STEP 2. 이력 생성할 전문 전달 -> DRON의 대한 식별정보만 이력 관리
try {
// 저장 해 놓았다가 한거번에 전송
DronStorage dronCacheUtil = DronStorage.getInstance();
// dronCacheUtil.set(dron);
DronStorage dronStorage = DronStorage.getInstance();
// dronStorage.set(dron);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
}
@ -154,7 +153,7 @@ public class SandboxDronCommandImpl implements DronCommand {
// webSocketService.sendData(dron);
Long end = System.currentTimeMillis();
log.info(">>> during time : {}::{}", dron.getObjectId(),end - start);
log.info(">>> during time : {}::{}", dron.getObjectId(), end - start);
} else {
log.error("좌표 정보가 존재하지 않습니다.");

24
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DronHandler.java

@ -4,8 +4,8 @@ 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.model.DronRq;
import kr.co.palnet.kac.socket.core.model.DronRs;
import kr.co.palnet.kac.socket.core.storage.AuthKeyStorage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -17,7 +17,7 @@ import java.util.Map;
@Slf4j
@ChannelHandler.Sharable
@Component
public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
public class DronHandler extends SimpleChannelInboundHandler<DronRq> {
private final Map<String, DronCommand> commandMap;
@ -31,11 +31,11 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
//
@Override
protected void channelRead0(ChannelHandlerContext ctx, DronRQ rq) throws Exception {
protected void channelRead0(ChannelHandlerContext ctx, DronRq rq) throws Exception {
log.info(">>>> channelRead0 <<<<<");
// key 검사
if (rq == null) {
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("-1000")
.message("data is empty.")
.build());
@ -43,7 +43,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
}
if (rq.getCommand() == null || rq.getCommand().isEmpty()) {
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("-1001")
.message("command is empty.")
.build());
@ -51,7 +51,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
}
if (rq.getAuthKey() == null || rq.getAuthKey().isEmpty()) {
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("-2000")
.message("auth key is empty.")
.build());
@ -59,7 +59,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
}
if (AuthKeyStorage.getInstance().checkAuthKey(rq.getCommand())) {
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("-2000")
.message("Invalid auth key.")
.build());
@ -69,7 +69,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
log.info(">>> rq : {}", rq);
DronCommand commandService = commandMap.get(rq.getCommand().trim());
if (commandService == null) {
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("-2100")
.message("this command is not exist.")
.build());
@ -78,13 +78,13 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
try {
commandService.command(rq);
} catch (Exception e) {
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("-500")
.message("server error - execute command")
.build());
return;
}
ctx.writeAndFlush(DronRS.builder()
ctx.writeAndFlush(DronRs.builder()
.code("0")
.message("success")
.build());
@ -94,7 +94,7 @@ public class DronHandler extends SimpleChannelInboundHandler<DronRQ> {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
log.info(">>>> exceptionCaught <<<<<");
DronRS rs = DronRS.builder()
DronRs rs = DronRs.builder()
.code("-9999")
.message("error - etc")
.build();

97
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronDTO.java

@ -1,97 +0,0 @@
package kr.co.palnet.kac.socket.core.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronDTO {
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
private String messageType;
private String terminalId;
@Builder.Default
private Double moveDistance = 0.0;
private String moveDistanceType;
private String controlId; // 처음 위치 데이터가 들어 왔을때 생성 함
private String objectType;
private String objectId;
@Builder.Default
private Double lat = 0.0;
@Builder.Default
private Double lon = 0.0;
private String elevType;
@Builder.Default
private Double elev = 0.0;
private String speedType;
@Builder.Default
private Double speed = 0.0;
@Builder.Default
private Double betteryLevel = 0.0;
@Builder.Default
private Double betteryVoltage = 0.0;
private String dronStatus;
@Builder.Default
private Double heading = 0.0;
private String terminalRcvDt;
private Instant serverRcvDt;
private Instant controlStartDt;
private Instant controlEndDt;
private String areaTrnsYn;
// 환경센서 필드
@Builder.Default
private Double sensorCo = 0.0;
@Builder.Default
private Double sensorSo2 = 0.0;
@Builder.Default
private Double sensorNo2 = 0.0;
@Builder.Default
private Double sensorO3 = 0.0;
@Builder.Default
private Double sensorDust = 0.0;
//최근 5건만 저장
private List<DronHistoryDTO> recentPositionHistory;
// 전체 히스토리 저장
private List<DronHistoryDTO> postionHistory;
// 비정상 상황 식별 코드
private boolean controlWarnCd;
// 큐가 Socket서버에 도착한 시간
private Instant regDt;
// 큐가 Socket서버에 도착한 시간
private boolean sendUtm; // 불법드론 전송 여부
}

5
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRQ.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRq.java

@ -1,5 +1,6 @@
package kr.co.palnet.kac.socket.core.model;
import kr.co.palnet.kac.common.model.common.DronDto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -11,7 +12,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronRQ {
public class DronRq {
private String authKey;
@ -19,6 +20,6 @@ public class DronRQ {
private String command;
private List<DronDTO> body;
private List<DronDto> body;
}

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRS.java → app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronRs.java

@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronRS {
public class DronRs {
private String code;
private String message;
}

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/ControlStorage.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.socket.core.storage;
import kr.co.palnet.kac.socket.core.model.ControlDto;
import kr.co.palnet.kac.common.model.common.ControlDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;

16
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/storage/DronStorage.java

@ -1,6 +1,6 @@
package kr.co.palnet.kac.socket.core.storage;
import kr.co.palnet.kac.socket.core.model.DronDTO;
import kr.co.palnet.kac.common.model.common.DronDto;
import lombok.extern.slf4j.Slf4j;
import java.time.Instant;
@ -12,7 +12,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class DronStorage {
private final Map<String, List<DronDTO>> dronMap;
private final Map<String, List<DronDto>> dronMap;
private final int REMOVE_TIME = 1000 * 10;
@ -28,14 +28,14 @@ public class DronStorage {
private static final DronStorage INSTANCE = new DronStorage();
}
public Map<String, List<DronDTO>> getAll() {
public Map<String, List<DronDto>> getAll() {
if (dronMap.keySet().isEmpty()) {
return null;
}
return dronMap;
}
public List<DronDTO> get(String objectId) {
public List<DronDto> get(String objectId) {
if (objectId == null || objectId.isEmpty()) {
return null;
}
@ -45,12 +45,12 @@ public class DronStorage {
return dronMap.get(objectId);
}
public void add(DronDTO dron) {
public void add(DronDto dron) {
if (dron == null || dron.getObjectId() == null || dron.getObjectId().isEmpty()) {
return;
}
List<DronDTO> list = dronMap.get(dron.getObjectId());
List<DronDto> list = dronMap.get(dron.getObjectId());
if (list == null) {
list = new ArrayList<>();
@ -63,11 +63,11 @@ public class DronStorage {
public void removeScheduled() {
log.info("removeScheduled start - dronMap size : {}", dronMap.size());
for (String key : dronMap.keySet()) {
List<DronDTO> list = dronMap.get(key);
List<DronDto> list = dronMap.get(key);
if (list == null || list.isEmpty()) {
continue;
}
DronDTO dron = list.get(list.size() - 1);
DronDto dron = list.get(list.size() - 1);
// 1분 이상된 데이터 삭제
Instant compareTime = Instant.now().minusSeconds(60);
if (compareTime.isAfter(dron.getRegDt())) {

4
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.socket.core.model.DronDTO;
import kr.co.palnet.kac.common.model.common.DronDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -9,7 +9,7 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Service
public class KacAppService {
public void sendData(DronDTO dto) {
public void sendData(DronDto dto) {
}
}

4
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.socket.core.model.DronDTO;
import kr.co.palnet.kac.common.model.common.DronDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -10,7 +10,7 @@ import org.springframework.stereotype.Service;
@Service
public class WebSocketService {
public void sendData(DronDTO dto) {
public void sendData(DronDto dto) {
}

5
app/kac-websocket-app/build.gradle

@ -1,8 +1,9 @@
dependencies {
implementation "$boot:spring-boot-starter-web"
implementation "io.netty:netty-all:4.1.68.Final"
implementation project(":common:util")
compileOnly project(":common:model")
}

8
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.websocket.core.model.ControlDTO;
import kr.co.palnet.kac.websocket.core.model.DronDTO;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
import kr.co.palnet.kac.websocket.core.storage.ControlStorage;
import kr.co.palnet.kac.websocket.service.ControlService;
import lombok.RequiredArgsConstructor;
@ -22,10 +22,10 @@ public class SocketReceiverController {
private final ControlService controlService;
@PostMapping("/dron")
public ResponseEntity<Void> receiver(@RequestBody DronDTO dronDTO) {
public ResponseEntity<Void> receiver(@RequestBody DronDto dronDTO) {
log.info("websocket message receiver : {}", dronDTO);
ControlDTO history = controlService.dronDtoToControlDtoConvert(dronDTO);
DronControlDto history = controlService.dronDtoToControlDtoConvert(dronDTO);
// DRON의 대한 식별정보만 이력 관리
ControlStorage controlCache = ControlStorage.getInstance();

20
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/model/DronHistoryDTO.java

@ -1,20 +0,0 @@
package kr.co.palnet.kac.websocket.core.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronHistoryDTO {
private String objectId;
@Builder.Default
private Double lat = 0.0;
@Builder.Default
private Double lon = 0.0;
}

15
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.websocket.core.model.ControlDTO;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@ -8,7 +8,6 @@ import org.springframework.stereotype.Component;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Slf4j
@Component
@ -16,7 +15,7 @@ public class ControlStorage {
private final int REMOVE_TIME_SECOND = 60; // 화면 노출 시간
private final Map<String, ControlDTO> controlMap;
private final Map<String, DronControlDto> controlMap;
private ControlStorage() {
controlMap = new ConcurrentHashMap<>();
@ -30,14 +29,14 @@ public class ControlStorage {
private static final ControlStorage INSTANCE = new ControlStorage();
}
public Map<String, ControlDTO> getAll() {
public Map<String, DronControlDto> getAll() {
if (controlMap.keySet().isEmpty()) {
return null;
}
return controlMap;
}
public ControlDTO get(String objectId) {
public DronControlDto get(String objectId) {
if (objectId == null || objectId.isEmpty()) {
return null;
}
@ -47,7 +46,7 @@ public class ControlStorage {
return controlMap.get(objectId);
}
public ControlDTO put(ControlDTO control) {
public DronControlDto put(DronControlDto control) {
if (control == null || control.getObjectId() == null || control.getObjectId().isEmpty()) {
return null;
}
@ -55,11 +54,11 @@ public class ControlStorage {
return controlMap.put(control.getObjectId(), control);
}
public List<ControlDTO> getList() {
public List<DronControlDto> getList() {
return new ArrayList<>(controlMap.values());
}
public ControlDTO remove(String objectId) {
public DronControlDto remove(String objectId) {
return controlMap.remove(objectId);
}

16
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.websocket.core.model.ControlDTO;
import kr.co.palnet.kac.websocket.core.model.DronDTO;
import kr.co.palnet.kac.common.model.common.DronControlDto;
import kr.co.palnet.kac.common.model.common.DronDto;
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<ControlDTO> getList() {
List<ControlDTO> list = new ArrayList<>();
public List<DronControlDto> getList() {
List<DronControlDto> list = new ArrayList<>();
ControlStorage controlCache = ControlStorage.getInstance();
Map<String, ControlDTO> allHistory = controlCache.getAll();
Map<String, DronControlDto> allHistory = controlCache.getAll();
log.info(">>> getList :: {}", allHistory);
@ -53,12 +53,12 @@ public class ControlService {
return list;
}
public ControlDTO dronDtoToControlDtoConvert(DronDTO dronDTO) {
public DronControlDto dronDtoToControlDtoConvert(DronDto dronDTO) {
ControlStorage controlCache = ControlStorage.getInstance();
ControlDTO prevControlDTO = controlCache.get(dronDTO.getObjectId());
DronControlDto prevControlDTO = controlCache.get(dronDTO.getObjectId());
ControlDTO controlDTO = new ControlDTO();
DronControlDto controlDTO = new DronControlDto();
controlDTO.setObjectId(dronDTO.getObjectId());
controlDTO.setControlId(dronDTO.getControlId());

5
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.websocket.core.model.ControlDTO;
import kr.co.palnet.kac.websocket.core.storage.ChannelStorage;
import kr.co.palnet.kac.websocket.core.storage.ControlStorage;
import lombok.RequiredArgsConstructor;
@ -24,6 +24,7 @@ public class ScheduledService {
private int count = 0;
private int count2 = 0;
@Scheduled(fixedDelay = 1000)
public void test() {
log.info("test.... : {}", count++);
@ -38,7 +39,7 @@ public class ScheduledService {
ChannelGroup channelGroup = channelStorage.getAll();
// 데이터 가져오기
ControlStorage controlStorage = ControlStorage.getInstance();
List<ControlDTO> controlDtoList = controlStorage.getList();
List<DronControlDto> controlDtoList = controlStorage.getList();
if (controlDtoList == null || controlDtoList.isEmpty()) return;

4
common/model/build.gradle

@ -0,0 +1,4 @@
dependencies {
}

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/ControlDto.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/ControlDto.java

@ -1,4 +1,4 @@
package kr.co.palnet.kac.socket.core.model;
package kr.co.palnet.kac.common.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;

6
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/model/ControlDTO.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronControlDto.java

@ -1,4 +1,4 @@
package kr.co.palnet.kac.websocket.core.model;
package kr.co.palnet.kac.common.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -13,7 +13,7 @@ import java.util.Map;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ControlDTO implements Comparable<ControlDTO> {
public class DronControlDto implements Comparable<DronControlDto> {
private String messageTypeCd;
@ -76,7 +76,7 @@ public class ControlDTO implements Comparable<ControlDTO> {
private Instant regDt;
@Override
public int compareTo(ControlDTO o) {
public int compareTo(DronControlDto o) {
if (o.getControlStartDt() != null && controlStartDt != null) {
return o.getControlStartDt().compareTo(controlStartDt);
}

8
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/model/DronDTO.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronDto.java

@ -1,4 +1,4 @@
package kr.co.palnet.kac.websocket.core.model;
package kr.co.palnet.kac.common.model.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -12,7 +12,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronDTO {
public class DronDto {
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
private String messageType;
@ -80,10 +80,10 @@ public class DronDTO {
private Double sensorDust = 0.0;
//최근 5건만 저장
private List<DronHistoryDTO> recentPositionHistory;
private List<DronHistoryDto> recentPositionHistory;
// 전체 히스토리 저장
private List<DronHistoryDTO> postionHistory;
private List<DronHistoryDto> postionHistory;
// 비정상 상황 식별 코드
private boolean controlWarnCd;

4
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/model/DronHistoryDTO.java → common/model/src/main/java/kr/co/palnet/kac/common/model/common/DronHistoryDto.java

@ -1,4 +1,4 @@
package kr.co.palnet.kac.socket.core.model;
package kr.co.palnet.kac.common.model.common;
import lombok.AllArgsConstructor;
@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DronHistoryDTO {
public class DronHistoryDto {
private String objectId;
@Builder.Default
Loading…
Cancel
Save