Browse Source

feat: kac-app <-> socket <-> websocket

feature/socket
지대한 7 months ago
parent
commit
264d26d133
  1. 7
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java
  2. 51
      app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java
  3. 22
      app/kac-app/src/main/java/kr/co/palnet/kac/app/config/JsonConfig.java
  4. 10
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/exception/ServerExceptionHandler.java
  5. 1
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java
  6. 11
      app/kac-app/src/main/java/kr/co/palnet/kac/app/ping/controller/TestErrorContoller.java
  7. 6
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java
  8. 6
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java
  9. 7
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java
  10. 30
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/config/JsonConfig.java
  11. 2
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java
  12. 10
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ExternalService.java
  13. 11
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java
  14. 15
      app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java
  15. 35
      app/kac-socket-app/src/main/resources/application.yml
  16. 6
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java
  17. 30
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/config/JsonConfig.java
  18. 4
      app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java
  19. 22
      app/kac-websocket-app/src/main/resources/application.yml
  20. 7
      common/config-db/src/main/java/kr/co/palnet/kac/config/db/KacJpaConfig.java
  21. 18
      common/config-db/src/main/resources/application-db.yml
  22. 2
      common/model/build.gradle
  23. 5
      common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java
  24. 66
      common/model/src/main/java/kr/co/palnet/kac/common/model/core/convert/InstantConvert.java
  25. 25
      common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java
  26. 6
      data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntBasRepository.java
  27. 8
      data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntfBasRepository.java
  28. 7
      socket-test/pav-100-dron.js
  29. 9
      socket-test/pav-warning.js

7
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/controller/InnerSocketController.java

@ -24,11 +24,12 @@ public class InnerSocketController {
SimpleControlDto simpleControlDto = innerSocketService.getControlId(objectId);
return ResponseEntity.ok(simpleControlDto);
}
// dron 정보 저장
@PostMapping("/receiver/dron")
public ResponseEntity<Void> receiverDronData(@RequestBody DroneDto dronDto) {
@PostMapping("/receiver/drone")
public ResponseEntity<Void> receiverDronData(@RequestBody DroneDto droneDto) {
log.debug(">>>>> receiver <<<<<");
innerSocketService.setDronData(dronDto);
innerSocketService.setDronData(droneDto);
return ResponseEntity.ok().build();
}

51
app/kac-app/src/main/java/kr/co/palnet/kac/app/api/v1/inner/socket/service/InnerSocketService.java

@ -123,7 +123,7 @@ public class InnerSocketService {
FltPlanCtrCntrlRel fltPlanCtrCntrlRel = new FltPlanCtrCntrlRel();
// 1. 식별 번호의 소유자 정보 저장.
ComIdntfBas comIdntfBas = comIdntBasRepository.findById(droneDto.getObjectId()).orElse(null);
ComIdntfBas comIdntfBas = comIdntBasRepository.findFirstByIdntfNumOrderByCreateDtAsc(droneDto.getObjectId()).orElse(null);
// 1-1. 식별 번호의 모델 정보 조회
// PAV-KAC에서는 기초데이터가 필수가 아니여서 idntBas가 null일 수 있음.
@ -162,6 +162,55 @@ public class InnerSocketService {
if (fltPlanCtrCntrlRel.getCntrlId() != null && !fltPlanCtrCntrlRel.getCntrlId().isEmpty() && fltPlanCtrCntrlRel.getPlanSno() != null) {
fltPlanCtrCntrlRelRepository.save(fltPlanCtrCntrlRel);
}
}
// history 생성
CtrCntrlHstry ctrCntrlHstry = CtrCntrlHstry.builder()
.cntrlId(droneDto.getControlId())
.trmnlId(droneDto.getTerminalId())
.mvDstnc(droneDto.getMoveDistance())
.mvDstncType(droneDto.getMoveDistanceType())
.mssgTypeCd(droneDto.getMessageType())
.statusCd(droneDto.getDroneStatus())
.lat(droneDto.getLat())
.lon(droneDto.getLon())
.speed(droneDto.getSpeed())
.speedType(droneDto.getSpeedType())
.heading(droneDto.getHeading())
.elev(droneDto.getElev())
.elevType(droneDto.getElevType())
.bttrLvl(droneDto.getBetteryLevel())
.bttrVltg(droneDto.getBetteryVoltage())
.trmnlRcvDt(droneDto.getTerminalRcvDt())
.srvrRcvDt(droneDto.getServerRcvDt())
.sensorCo(droneDto.getSensorCo())
.sensorSo2(droneDto.getSensorSo2())
.sensorNo2(droneDto.getSensorNo2())
.sensorO3(droneDto.getSensorO3())
.sensorDust(droneDto.getSensorDust())
.build();
ctrCntrlHstry = ctrCntrlHstryRepository.save(ctrCntrlHstry);
if ("01".equals(droneDto.getTypeCd()) || "99".equals(droneDto.getTypeCd())) {
CtrCntrlHstryArea ctrCntrlHstryArea = CtrCntrlHstryArea.builder()
.cntrlId(droneDto.getControlId())
.actnType(droneDto.getTypeCd())
.prcsYn("N")
.lat(droneDto.getLat())
.lon(droneDto.getLon())
.hstrySno(ctrCntrlHstry.getHstrySno())
.createDt(Instant.now())
.updateDt(Instant.now())
.build();
ctrCntrlHstryAreaRepository.save(ctrCntrlHstryArea);
}
}

22
app/kac-app/src/main/java/kr/co/palnet/kac/app/config/JsonConfig.java

@ -0,0 +1,22 @@
package kr.co.palnet.kac.app.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
@Configuration
public class JsonConfig {
@Bean
public ObjectMapper objectMapper() {
return ObjectMapperUtil.getObjectMapper();
}
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return ObjectMapperUtil.getObjectMapperBuilder();
}
}

10
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/exception/ServerExceptionHandler.java

@ -103,23 +103,23 @@ public class ServerExceptionHandler {
switch (level) {
case TRACE:
log.trace("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace());
log.trace("message: {}, params: {}, trace: ", message, paramArray, e);
log.trace("", e);
break;
case DEBUG:
log.debug("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace());
log.debug("message: {}, params: {}, trace: ", message, paramArray, e);
log.debug("", e);
break;
case INFO:
log.info("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace());
log.info("message: {}, params: {}, trace: ", message, paramArray, e);
log.info("", e);
break;
case WARN:
log.warn("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace());
log.warn("message: {}, params: {}, trace: ", message, paramArray, e);
log.warn("", e);
break;
case ERROR:
log.trace("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace());
log.trace("message: {}, params: {}, trace: ", message, paramArray, e);
log.error("", e);
break;
default:

1
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java

@ -26,6 +26,7 @@ public class AppSecurityConfig extends SecurityConfig {
// 시큐리티 적용 안하는 URL 목록
private final String[] IGNORE_URL = {
"/test/**",
"/v1/inner/socket/**",
"/v1/com/code/**",
};

11
app/kac-app/src/main/java/kr/co/palnet/kac/app/ping/controller/TestErrorContoller.java

@ -1,5 +1,6 @@
package kr.co.palnet.kac.app.ping.controller;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.core.exception.BaseErrorCode;
import kr.co.palnet.kac.core.exception.BaseException;
import kr.co.palnet.kac.util.EncryptUtil;
@ -10,10 +11,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Locale;
@ -31,6 +29,11 @@ public class TestErrorContoller {
@Qualifier("errorMessageSourceAccessor")
private final MessageSourceAccessor errorMessageSourceAccessor;
@PostMapping("/json/parse")
public DroneDto jsonTest(@RequestBody DroneDto dto){
return dto;
}
@GetMapping("/encrypt/{plainText}")
public String ecrypt(@PathVariable String plainText) {
String encrypt = KisaEncryptUtil.CbcEncrypt.encrypt(plainText);

6
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AdsbDroneCommandImpl.java

@ -98,7 +98,7 @@ public class AdsbDroneCommandImpl implements DroneCommand {
controlDto.setRegTime(System.currentTimeMillis());
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
} else {
@ -119,7 +119,7 @@ public class AdsbDroneCommandImpl implements DroneCommand {
*/
kacAppService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
// STEP 3. 화면에 표출할 정보 WebSocket 전달
@ -129,7 +129,7 @@ public class AdsbDroneCommandImpl implements DroneCommand {
webSocketService.sendData(drone);
}
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
} else {

6
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/AntosDroneCommandImpl.java

@ -99,7 +99,7 @@ public class AntosDroneCommandImpl implements DroneCommand {
controlStorage.put(drone.getObjectId(), controlDto);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
} else {
@ -120,7 +120,7 @@ public class AntosDroneCommandImpl implements DroneCommand {
*/
kacAppService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
@ -130,7 +130,7 @@ public class AntosDroneCommandImpl implements DroneCommand {
webSocketService.sendData(drone);
}
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
} else {

7
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/command/impl/SandboxDroneCommandImpl.java

@ -47,7 +47,6 @@ public class SandboxDroneCommandImpl implements DroneCommand {
for (DroneDto drone : resultList) {
// 위,경도 좌표가 0으로 들어오는 것은 무시 처리
if (DroneUtil.checkCoordinates(drone.getLat(), drone.getLon())) {
drone.setObjectType(objectType);
drone.setMessageType(messageType);
drone.setTerminalId(rq.getTerminalId());
@ -99,7 +98,7 @@ public class SandboxDroneCommandImpl implements DroneCommand {
controlStorage.put(drone.getObjectId(), controlDto);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
} else {
@ -122,14 +121,14 @@ public class SandboxDroneCommandImpl implements DroneCommand {
*/
kacAppService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
// STEP 3. 화면에 표출할 정보 WebSocket 전달
try {
webSocketService.sendData(drone);
} catch (Exception e) {
log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace());
log.error("ERROR : {}", e.getMessage(), e);
}
Long end = System.currentTimeMillis();

30
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/config/JsonConfig.java

@ -0,0 +1,30 @@
package kr.co.palnet.kac.socket.core.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@Configuration
public class JsonConfig {
@Bean
public ObjectMapper objectMapper() {
return ObjectMapperUtil.getObjectMapper();
}
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return ObjectMapperUtil.getObjectMapperBuilder();
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter(objectMapper());
}
}

2
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/core/handler/DroneHandler.java

@ -104,7 +104,7 @@ public class DroneHandler extends SimpleChannelInboundHandler<DroneRq> {
ctx.writeAndFlush(rs);
// Close the connection when an exception is raised.
ctx.close();
log.error("ERROR: {}\n{}", cause.getMessage(), cause.getStackTrace());
log.error("ERROR: {}", cause.getMessage(), cause);
}

10
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/ExternalService.java

@ -1,10 +1,14 @@
package kr.co.palnet.kac.socket.service;
import kr.co.palnet.kac.socket.core.model.UtmDto;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@ -21,13 +25,17 @@ public class ExternalService {
RestClient client = RestClient.builder()
.baseUrl(UTM_HOST)
.defaultHeader("Content-Type", "application/json")
.messageConverters(converts -> {
converts.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
converts.add(new MappingJackson2HttpMessageConverter(ObjectMapperUtil.getObjectMapper()));
})
.build();
try {
ResponseEntity<Void> res = client.post()
.uri(UTM_REALTIME_URI)
.contentType(MediaType.APPLICATION_JSON)
.body(utmDto)
.retrieve()
.toEntity(Void.class);

11
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/KacAppService.java

@ -2,14 +2,15 @@ package kr.co.palnet.kac.socket.service;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.common.model.common.SimpleControlDto;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import org.springframework.web.util.UriComponentsBuilder;
@Slf4j
@RequiredArgsConstructor
@ -19,7 +20,7 @@ public class KacAppService {
private String kacAppHost;
private final String GET_CONTROL_ID = "/v1/inner/socket/control";
private final String SEND_ALL = "/v1/inner/socket/receiver/dron";
private final String SEND_ALL = "/v1/inner/socket/receiver/drone";
// control id 가져오기
public SimpleControlDto getControlId(String objectId) {
@ -36,7 +37,7 @@ public class KacAppService {
// drone 데이터 전송
public void sendData(DroneDto dto) {
RestClient client = getRestClient();
ResponseEntity<Void> resp = client.post()
client.post()
.uri(SEND_ALL)
.contentType(MediaType.APPLICATION_JSON)
.body(dto)
@ -47,6 +48,10 @@ public class KacAppService {
private RestClient getRestClient() {
return RestClient.builder()
.baseUrl(kacAppHost)
.messageConverters(converts -> {
converts.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
converts.add(new MappingJackson2HttpMessageConverter(ObjectMapperUtil.getObjectMapper()));
})
.build();
}

15
app/kac-socket-app/src/main/java/kr/co/palnet/kac/socket/service/WebSocketService.java

@ -1,10 +1,13 @@
package kr.co.palnet.kac.socket.service;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
@ -15,12 +18,18 @@ public class WebSocketService {
@Value("${app.web-socket-web.host}")
private String webSocketWebHost;
private final String SEND_DRONE_DATA = "/v1/api/ws/dron";
private final String SEND_DRONE_DATA = "/v1/api/ws/drone";
public void sendData(DroneDto dto) {
RestClient client = RestClient.create();
RestClient client = RestClient.builder()
.baseUrl(webSocketWebHost)
.messageConverters(converts -> {
converts.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
converts.add(new MappingJackson2HttpMessageConverter(ObjectMapperUtil.getObjectMapper()));
})
.build();
client.post()
.uri(webSocketWebHost + SEND_DRONE_DATA)
.uri(SEND_DRONE_DATA)
.contentType(MediaType.APPLICATION_JSON)
.body(dto)
.retrieve()

35
app/kac-socket-app/src/main/resources/application.yml

@ -22,6 +22,10 @@ spring:
virtual:
enabled: true
logging:
level:
kr.co.palnet: debug
---
spring:
@ -30,4 +34,35 @@ spring:
on-profile: local
---
spring:
config:
activate:
on-profile: docker
threads:
virtual:
enabled: true
netty:
socket:
tcp-port: 8003
boss-count: 1
keep-alive: false
tcp-nodelay: false
backlog: 3000
app:
kac-app:
host: http://kac-app:8000
web-socket:
host: http://kac-websocket-app:8001
web-socket-web:
host: http://kac-websocket-app:8002
server:
port: 8004

6
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/controller/SocketReceiverController.java

@ -22,10 +22,10 @@ public class SocketReceiverController {
private final ControlService controlService;
@PostMapping("/drone")
public ResponseEntity<Void> receiver(@RequestBody DroneDto dronDTO) {
log.info("websocket message receiver : {}", dronDTO);
public ResponseEntity<Void> receiver(@RequestBody DroneDto droneDto) {
log.info("websocket message receiver : {}", droneDto);
DroneControlDto history = controlService.dronDtoToControlDtoConvert(dronDTO);
DroneControlDto history = controlService.dronDtoToControlDtoConvert(droneDto);
// DRON의 대한 식별정보만 이력 관리
ControlStorage controlCache = ControlStorage.getInstance();

30
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/core/config/JsonConfig.java

@ -0,0 +1,30 @@
package kr.co.palnet.kac.websocket.core.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@Configuration
public class JsonConfig {
@Bean
public ObjectMapper objectMapper() {
return ObjectMapperUtil.getObjectMapper();
}
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return ObjectMapperUtil.getObjectMapperBuilder();
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter(objectMapper());
}
}

4
app/kac-websocket-app/src/main/java/kr/co/palnet/kac/websocket/service/ScheduledService.java

@ -42,9 +42,9 @@ public class ScheduledService {
channel.writeAndFlush(new TextWebSocketFrame(json));
});
} catch (JsonProcessingException e) {
log.warn("send fail to all channel. : json parsing error : {}\n{}", e.getMessage(), e.getStackTrace());
log.warn("send fail to all channel. : json parsing error : {}", e.getMessage(), e);
} catch (Exception e) {
log.warn("send fail to all channel. : {}\n{}", e.getMessage(), e.getStackTrace());
log.warn("send fail to all channel. : {}", e.getMessage(), e);
}
log.info("done send to all channel");
}

22
app/kac-websocket-app/src/main/resources/application.yml

@ -9,7 +9,7 @@ netty:
app:
kac-app:
host: http://127.0.0.1:8080
host: http://127.0.0.1:8000
spring:
threads:
@ -24,7 +24,25 @@ server:
spring:
config:
activate:
on-profile: local
on-profile: docker
threads:
virtual:
enabled: true
netty:
socket:
tcp-port: 8001
boss-count: 1
keep-alive: true
tcp-nodelay: true
backlog: 3000
app:
kac-app:
host: http://kac-app:8000
server:
port: 8002

7
common/config-db/src/main/java/kr/co/palnet/kac/config/db/KacJpaConfig.java

@ -1,5 +1,6 @@
package kr.co.palnet.kac.config.db;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
@ -34,10 +35,16 @@ public class KacJpaConfig {
this.hibernateProperties = hibernateProperties;
}
@Value("${spring.datasource.pav-kac.jdbc-url}")
private String test;
@Bean(name = "kacDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.pav-kac")
public DataSource kacDataSource() {
System.out.println("===========================");
System.out.println(test);
System.out.println("===========================");
return DataSourceBuilder.create().build();
}

18
common/config-db/src/main/resources/application-db.yml

@ -10,3 +10,21 @@ spring:
jdbc-url: jdbc:log4jdbc:mysql://localhost:13306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
username: kac
password: palnet!234
---
spring:
config:
activate:
on-profile: docker
jpa:
hibernate:
ddl-auto: none
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
datasource:
pav-kac:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
jdbc-url: jdbc:log4jdbc:mysql://database:3306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
username: kac
password: palnet!234

2
common/model/build.gradle

@ -1,4 +1,4 @@
dependencies {
implementation project(":common:util")
}

5
common/model/src/main/java/kr/co/palnet/kac/common/model/common/DroneDto.java

@ -1,5 +1,7 @@
package kr.co.palnet.kac.common.model.common;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import kr.co.palnet.kac.common.model.core.convert.InstantConvert;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -57,7 +59,8 @@ public class DroneDto {
@Builder.Default
private Double heading = 0.0;
private String terminalRcvDt;
@JsonDeserialize(using = InstantConvert.Deserializer.class)
private Instant terminalRcvDt;
private Instant serverRcvDt;

66
common/model/src/main/java/kr/co/palnet/kac/common/model/core/convert/InstantConvert.java

@ -0,0 +1,66 @@
package kr.co.palnet.kac.common.model.core.convert;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import kr.co.palnet.kac.common.model.common.DroneDto;
import kr.co.palnet.kac.util.ObjectMapperUtil;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
@Slf4j
public class InstantConvert {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
public static class Serializer extends JsonSerializer<Instant> {
@Override
public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(formatter.format(LocalDateTime.ofInstant(value, ZoneId.systemDefault())));
}
}
public static class Deserializer extends JsonDeserializer<Instant> {
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
try {
JsonToken currentToken = p.getCurrentToken();
if (currentToken.equals(JsonToken.VALUE_NUMBER_INT)) {
long timestamp = p.getLongValue();
return Instant.ofEpochMilli(timestamp);
} else if (currentToken.equals(JsonToken.VALUE_NUMBER_FLOAT)) {
String[] parts = p.getText().split("\\.");
long integerPart = Long.parseLong(parts[0]);
long decimalPart = Long.parseLong(parts[1]);
return Instant.ofEpochSecond(integerPart, decimalPart);
} else {
String str = p.getText();
try {
return Instant.parse(str);
} catch (DateTimeParseException pe) {
return LocalDateTime.parse(str, formatter).atZone(ZoneId.systemDefault()).toInstant();
}
}
} catch (Exception e) {
log.warn("WARN : fail parsing instant type : {}", e.getMessage());
return null;
}
}
}
}

25
common/util/src/main/java/kr/co/palnet/kac/util/ObjectMapperUtil.java

@ -1,7 +1,9 @@
package kr.co.palnet.kac.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
public class ObjectMapperUtil {
@ -11,19 +13,14 @@ public class ObjectMapperUtil {
public static Jackson2ObjectMapperBuilder getObjectMapperBuilder() {
Jackson2ObjectMapperBuilder jacksonBuilder = new Jackson2ObjectMapperBuilder();
jacksonBuilder.serializationInclusion(JsonInclude.Include.NON_NULL);
jacksonBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
// jacksonBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// jacksonBuilder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// jacksonBuilder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
// jacksonBuilder.featuresToDisable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
// jacksonBuilder.modulesToInstall(new JavaTimeModule());
// jacksonBuilder.timeZone(TimeZone.getTimeZone("UTC"));
// jacksonBuilder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
// jacksonBuilder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// jacksonBuilder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// jacksonBuilder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// jacksonBuilder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
jacksonBuilder.modulesToInstall(new JavaTimeModule()); // java 8의 새로운 api 지원
// jacksonBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); // null 제외
// jacksonBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY); // 빈 속성 무시
jacksonBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 날짜 타임스탬프x > ISO-8601 형식o
jacksonBuilder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //알수없는 속성 무시
// jacksonBuilder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); // 컨텍스트의 시간대로 조정하지 않도록 방지
// jacksonBuilder.featuresToDisable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES); // 대소문자 무시
// jacksonBuilder.timeZone(TimeZone.getTimeZone("UTC")); // 기본 시간대 설정
return jacksonBuilder;
}

6
data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntBasRepository.java

@ -3,6 +3,10 @@ package kr.co.palnet.kac.data.com.repository;
import kr.co.palnet.kac.data.com.domain.ComIdntfBas;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ComIdntBasRepository extends JpaRepository<ComIdntfBas, String> {
import java.util.Optional;
public interface ComIdntBasRepository extends JpaRepository<ComIdntfBas, ComIdntfBas.ComIdntfBasId> {
Optional<ComIdntfBas> findFirstByIdntfNumOrderByCreateDtAsc(String idntfNum);
}

8
data/com/src/main/java/kr/co/palnet/kac/data/com/repository/ComIdntfBasRepository.java

@ -1,8 +0,0 @@
package kr.co.palnet.kac.data.com.repository;
import kr.co.palnet.kac.data.com.domain.ComIdntfBas;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ComIdntfBasRepository extends JpaRepository<ComIdntfBas, ComIdntfBas.ComIdntfBasId> {
}

7
socket-test/pav-100-dron.js

@ -1,13 +1,10 @@
const { getConnection, writeData } = require('./pav-client');
const { dumyData } = require('./pav-utils');
// const host = "192.168.0.24"
const host = "localhost"
// const host = '211.253.38.218';
// const port = 8082;
const port = 8888;
const port = 8003;
const prefix = 'TEST-DRON-';
const prefix = 'PA-DRON-';
const severalDrones = cnt => {
// 클라이언트 정보 저장공간
const clients = [];

9
socket-test/pav-warning.js

@ -1,16 +1,11 @@
const {getConnection, writeData} = require('./pav-client');
const {getCoordsFormBetweenCoord, dumyData} = require('./pav-utils');
// const host = "192.168.0.24"
const host = 'localhost';
// const host = '192.168.0.34';
const port = 8003;
// const port = 8082;
// const host = '121.190.193.50';
// const port = 6083;
// 기본정보
const prefix = 'PA0001';
const prefix = 'PA';
const terminalId = '';
const pathSampleCoord = [
@ -47,7 +42,7 @@ const getCoords = coords => {
};
const getClient = () => {
const dronName = prefix + 'trmnlId';
const dronName = prefix + '001';
const client = {};
client.dronName = dronName;

Loading…
Cancel
Save