Browse Source

TS - 불법드론 1~2초 마다 전송

pull/16/head
지대한 10 months ago
parent
commit
96fde678d5
  1. 2
      document/dron_test/pav-warning.js
  2. 26
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java
  3. 2
      pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java
  4. 24
      pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java
  5. 43
      pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java
  6. 2
      pav-socket/src/main/java/com/palnet/comn/model/GPModel.java
  7. 38
      pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java
  8. 83
      pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java

2
document/dron_test/pav-warning.js

@ -48,7 +48,7 @@ const getCoords = coords => {
};
const getClient = () => {
const dronName = prefix + '010';
const dronName = prefix + '095';
const client = {};
client.dronName = dronName;

26
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java

@ -62,27 +62,41 @@ public class SocketReceiverService {
ComIdntfBas idntfBas = idntBasRepository.findById(model.getObjectId()).orElse(null);
// 1-1. 식별 번호의 모델 정보 조회
ComArcrftBas arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null);
// PAV-KAC에서는 기초데이터가 필수가 아니여서 idntBas가 null일 수 있음.
ComArcrftBas arcrftBas = null;
if (idntfBas != null && idntfBas.getArcrftSno() > 0) {
arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null);
}
if (idntfBas != null && arcrftBas != null) {
if(ctrCntrlBas != null) {
if (ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty())
fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId());
if (ctrCntrlBas.getIdntfNum() != null && !ctrCntrlBas.getIdntfNum().isEmpty())
fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum());
}
if (idntfBas != null && idntfBas.getCstmrSno() != null) {
fltPlanCtrCntrlRel.setIdntfCstmrSno(idntfBas.getCstmrSno());
}
if (arcrftBas != null && arcrftBas.getGroupId() != null && !arcrftBas.getGroupId().isEmpty()){
fltPlanCtrCntrlRel.setGroupId(arcrftBas.getGroupId());
}
// 2. 해당 되는 비행계획서 정보 저장.
List<FltPlanBas> planArcrft =
fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt());
List<FltPlanBas> planArcrft = null;
if (ctrCntrlBas != null && ctrCntrlBas.getCntrlId() != null && !ctrCntrlBas.getCntrlId().isEmpty()){
planArcrft = fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt());
}
if (!planArcrft.isEmpty()) {
if (planArcrft != null && !planArcrft.isEmpty()) {
for (FltPlanBas plan : planArcrft) {
fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno());
}
}
// 3. mapping 정보 주입.
if (!fltPlanCtrCntrlRel.getCntrlId().isEmpty()) {
if (fltPlanCtrCntrlRel.getCntrlId() != null && !fltPlanCtrCntrlRel.getCntrlId().isEmpty() && fltPlanCtrCntrlRel.getPlanSno() != null) {
ctrCntrlRelRepository.save(fltPlanCtrCntrlRel);
}
}

2
pav-server/src/main/java/com/palnet/biz/config/WebSecurityConfig.java

@ -41,6 +41,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
"/api/server/**",
"/api/comn/file/download",
"/api/comn/file/download/**",
// TEST
"/api/v1/utm",
/* swagger v2 */
"/v2/api-docs",
"/swagger-resources",

24
pav-server/src/main/java/com/palnet/biz/sample/controller/UtmSampleTestController.java

@ -0,0 +1,24 @@
package com.palnet.biz.sample.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletRequest;
@Slf4j
@RestController
public class UtmSampleTestController {
@PostMapping("/api/v1/utm")
public ResponseEntity<?> utmReciverTest(@RequestBody String body, ServletRequest request) {
log.info("====================================================");
log.info("====================================================");
log.info("====>> /api/v1/utm sample test : {}", body);
log.info("====================================================");
log.info("====================================================");
return ResponseEntity.ok().build();
}
}

43
pav-socket/src/main/java/com/palnet/comn/collection/GPCollection.java

@ -32,7 +32,7 @@ public class GPCollection {
}
public static Map<String, List<GPModel>> getAll() {
if (gpMap.keySet().size() < 1) {
if (gpMap.keySet().isEmpty()) {
return null;
}
return gpMap;
@ -74,7 +74,7 @@ public class GPCollection {
public static Map<String, List<GPModel>> sendAll() {
log.info("sendAll start - GPMap size : {}", gpMap.size());
if(gpMap.keySet().size() < 1) {
if(gpMap.keySet().isEmpty()) {
return null;
}
Map<String, List<GPModel>> map = gpMap;
@ -83,13 +83,50 @@ public class GPCollection {
return map;
}
public static List<GPModel> sendAllUtm() {
log.info("sendAllUtm start - GPMap size : {}", gpMap.size());
if(gpMap.keySet().isEmpty()) {
return null;
}
List<GPModel> list = new ArrayList<>();
for (String key : gpMap.keySet()) {
List<GPModel> temp = gpMap.get(key);
if (temp == null || temp.isEmpty()) {
continue;
}
GPModel model = temp.get(temp.size() - 1);
if(!model.isSendUtm()){
list.add(model);
}
}
log.info("sendAllUtm end - GPMap size : {}", gpMap.size());
return list;
}
public static void sendAllUtmSuccess(List<GPModel> successGPModel) {
if(successGPModel == null || successGPModel.isEmpty()) return;
for (GPModel model : successGPModel) {
if (model == null || model.getObjectId() == null || model.getObjectId().isEmpty()) {
continue;
}
List<GPModel> list = gpMap.get(model.getObjectId());
if (list == null) return;
list.stream().filter(gpModel -> {
if(gpModel == null || gpModel.getRegDt() == null) return false;
return gpModel.getRegDt().equals(model.getRegDt());
}).findFirst().ifPresent(gpModel -> {
gpModel.setSendUtm(true);
});
}
}
// 1분마다 데이터 삭제
@Scheduled(fixedDelay = 1000 * 60)
public void removeSchedule() {
log.info("removeSchedule start - GPMap size : {}", gpMap.size());
for (String key : gpMap.keySet()) {
List<GPModel> list = gpMap.get(key);
if (list == null || list.size() == 0) {
if (list == null || list.isEmpty()) {
continue;
}
GPModel model = list.get(list.size() - 1);

2
pav-socket/src/main/java/com/palnet/comn/model/GPModel.java

@ -72,5 +72,7 @@ public class GPModel {
// 큐가 Socket서버에 도착한 시간
private Instant regDt;
// 큐가 Socket서버에 도착한 시간
private boolean sendUtm; // 불법드론 전송 여부
}

38
pav-socket/src/main/java/com/palnet/comn/model/UtmModel.java

@ -0,0 +1,38 @@
package com.palnet.comn.model;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UtmModel {
@JsonProperty("GPSime")
private String GPSime; // 시간 yyyyMMddHHmmss
@JsonProperty("dronInfo")
private List<DronInfo> dronInfo;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class DronInfo {
@JsonProperty("Id")
private String id;
@JsonProperty("Latitude")
private String latitude;
@JsonProperty("Longitude")
private String longitude;
@JsonProperty("Height")
private String height;
}
}

83
pav-socket/src/main/java/com/palnet/server/task/server/service/TaskServerService.java

@ -2,6 +2,7 @@ package com.palnet.server.task.server.service;
import com.palnet.comn.collection.GPCollection;
import com.palnet.comn.model.GPModel;
import com.palnet.comn.model.UtmModel;
import com.palnet.comn.utils.JsonUtils;
import io.netty.channel.ChannelOption;
import lombok.RequiredArgsConstructor;
@ -19,9 +20,14 @@ import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
* packageName : com.palnet.server.task.wb.service
@ -129,4 +135,81 @@ public class TaskServerService {
.bodyToMono(Void.class).subscribe();
}
@Scheduled(fixedDelay = 1000 * 2)
public void sendDataAllUtm() {
List<GPModel> modelList = GPCollection.sendAllUtm();
if (modelList == null) {
return;
}
// 가공
List<UtmModel.DronInfo> dronInfoList = modelList.stream().map(model -> {
UtmModel.DronInfo dronInfo = UtmModel.DronInfo.builder()
.id(model.getObjectId())
.latitude(model.getLat().toString())
.longitude(model.getLng().toString())
.height(model.getElev().toString())
.build();
return dronInfo;
}).collect(Collectors.toList());
if(dronInfoList.isEmpty()) return;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
.withZone(ZoneId.of("Asia/Seoul"));
String dateStr = formatter.format(Instant.now());
UtmModel utmModel = UtmModel.builder()
.GPSime(dateStr)
.dronInfo(dronInfoList)
.build();
// 임시 하드코딩
final String UTM_HOST = "http://localhost:8080";
final String UTM_REALTIME_URI = "/api/v1/utm";
WebClient client = WebClient.builder()
.baseUrl(UTM_HOST)
.defaultHeader("Content-Type", "application/json")
.build();
client.post()
.uri(UTM_REALTIME_URI)
.body(Mono.just(utmModel), UtmModel.class)
.retrieve()
.bodyToMono(Void.class).subscribe();
// 전송 완료시 true 처리
GPCollection.sendAllUtmSuccess(modelList);
}
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss")
.withZone(ZoneId.of("Asia/Seoul"));
String dateStr = formatter.format(Instant.now());
Double lat = 37.123456;
Double lon = 127.123456;
Double elev = 100.0;
UtmModel.DronInfo dronInfo = UtmModel.DronInfo.builder()
.id("objectId")
.latitude(lat.toString())
.longitude(lon.toString())
.height(elev.toString())
.build();
List<UtmModel.DronInfo> dronInfoList = List.of(dronInfo);
UtmModel utmModel = UtmModel.builder()
.GPSime(dateStr)
.dronInfo(dronInfoList)
.build();
String json = JsonUtils.toJson(utmModel);
System.out.println(json);
}
}

Loading…
Cancel
Save