Browse Source

second commit

shjung 3 năm trước cách đây
mục cha
commit
7a8ab90511
61 tập tin đã thay đổi với 1609 bổ sung307 xóa
  1. 1 0
      pom.xml
  2. 17 37
      src/main/java/com/its/pis/PisCommServerApplication.java
  3. 9 5
      src/main/java/com/its/pis/webapp/config/WebSecurityConfig.java
  4. 12 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CLinkStatusInfo.java
  5. 19 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CLinkStatusInfoRequest.java
  6. 24 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CLinkStatusInfoResponse.java
  7. 12 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2COprRequest.java
  8. 18 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CRequest.java
  9. 8 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CRequestData.java
  10. 19 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CRequestPayload.java
  11. 12 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CReservationRequest.java
  12. 12 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CRlTimeRequest.java
  13. 12 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CSttusRequest.java
  14. 29 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CVehicleLocationRequestInfo.java
  15. 22 0
      src/main/java/com/its/pis/websocket/C2C/ParkingC2CVehicleLocationRequestPayload.java
  16. 15 0
      src/main/java/com/its/pis/websocket/C2F/C2FMessage.java
  17. 14 0
      src/main/java/com/its/pis/websocket/C2F/C2FMessageData.java
  18. 19 0
      src/main/java/com/its/pis/websocket/C2F/C2FMessagePayload.java
  19. 30 0
      src/main/java/com/its/pis/websocket/C2F/ParkingC2FMessage.java
  20. 104 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceOprInfo.java
  21. 55 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceReservationRequestInfo.java
  22. 55 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceReservationResponseInfo.java
  23. 22 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceRlTimeRequestInfo.java
  24. 79 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceRlTimeResponseInfo.java
  25. 127 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceSttusInfo.java
  26. 39 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceVhclLocationRequestInfo.java
  27. 50 0
      src/main/java/com/its/pis/websocket/C2F/PrkPlceVhclLocationResponseInfo.java
  28. 24 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/OperationInfo.java
  29. 33 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/OpertnSchedule.java
  30. 25 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/OpertnTime.java
  31. 25 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeBasic.java
  32. 27 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeDetail.java
  33. 49 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeDscnt.java
  34. 22 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeFxamt.java
  35. 23 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargePrmium.java
  36. 21 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_reservation/ResveTime.java
  37. 36 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_reservation/RsvCtmInfo.java
  38. 49 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/PrkColctDeviceInfo.java
  39. 23 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/RtArInfr.java
  40. 24 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/RtFlrInfr.java
  41. 31 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/RtPrvusePrkarInfo.java
  42. 24 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/ArInfr.java
  43. 21 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/ContCo.java
  44. 24 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/CrmPrvCctvInstl.java
  45. 20 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/FlrInfr.java
  46. 31 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkCmprtCoInfo.java
  47. 27 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkPlaceImage.java
  48. 23 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkPlceEntrcLc.java
  49. 40 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkUcmprtColctDeviceInfo.java
  50. 28 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrvusePrkarInfo.java
  51. 29 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/TypedPrkColctDeviceQty.java
  52. 21 0
      src/main/java/com/its/pis/websocket/C2F/prk_plce_vhcl_location/LocationInfo.java
  53. 4 2
      src/main/java/com/its/pis/websocket/ItsWebSocketConfig.java
  54. 49 4
      src/main/java/com/its/pis/websocket/ItsWebSocketHandler.java
  55. 9 10
      src/main/resources/application.yml
  56. 1 1
      src/main/resources/logback-spring.xml
  57. 1 1
      src/main/resources/mybatis/mapper/UnitSystMapper.xml
  58. 1 1
      src/main/resources/mybatis/mapper/VdsCtlrMapper.xml
  59. 1 1
      src/main/resources/mybatis/mapper/VdsDtctMapper.xml
  60. 1 1
      src/main/resources/mybatis/mapper/VdsStatMapper.xml
  61. 7 244
      src/test/java/com/its/app/PisCommServerApplicationTests.java

+ 1 - 0
pom.xml

@@ -26,6 +26,7 @@
 
     <properties>
         <java.version>1.8</java.version>
+        <jackson.version>2.13.1</jackson.version>
         <!-- jar 배포용 -->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

+ 17 - 37
src/main/java/com/its/pis/PisCommServerApplication.java

@@ -10,7 +10,6 @@ import com.its.pis.ui.JTextAreaOutputStream;
 import com.its.pis.ui.MainUI;
 import com.its.pis.xnettcp.center.CenterTcpServerService;
 import com.its.pis.xnettcp.vds.VdsTcpClientCommService;
-import com.its.pis.xnettcp.vds.process.VdsDataProcess;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.catalina.connector.Connector;
 import org.springframework.beans.factory.DisposableBean;
@@ -26,6 +25,7 @@ import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.ContextClosedEvent;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.web.bind.annotation.CrossOrigin;
 
 import javax.swing.*;
 import java.awt.*;
@@ -39,18 +39,13 @@ import java.io.PrintStream;
 @Configuration
 @SpringBootApplication
 @ComponentScan(basePackages = {"com.its.pis.config", "com.its.pis.dao.mapper", "com.its"})
+@CrossOrigin("*")
 public class PisCommServerApplication implements CommandLineRunner, ApplicationListener<ContextClosedEvent>, InitializingBean, DisposableBean {
-//public class VdsCommServerApplication implements ApplicationListener<ContextClosedEvent>, InitializingBean, DisposableBean {
+//public class PisCommServerApplication implements ApplicationListener<ContextClosedEvent>, InitializingBean, DisposableBean {
 
     private Connector connector;
 
     public static void main(String[] args) {
-        //System.out.println(System.getProperty("program.name"));
-        // java -jar -Dlogback-config=xxx.xml ....
-        // logback config file setting
-        /*String userDir = System.getProperty("user.dir");
-        String logbackConfigFileName = userDir + "/conf/app-comm-server-log.xml";
-        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, logbackConfigFileName);*/
         File file1 = new File("./conf/pis-comm-server.pid");
         if (file1.exists()) {
             System.out.println(System.getProperty("Program Already Running....."));
@@ -66,10 +61,8 @@ public class PisCommServerApplication implements CommandLineRunner, ApplicationL
                 .run(args);
 
 //        SpringApplication application = new SpringApplicationBuilder()
-//                .sources(VdsCommServerApplication.class)
-//                .listeners(new ApplicationPidFileWriter("./conf/vds-comm-server.pid"))
-//                //.headless(false)
-//                //.web(WebApplicationType.NONE)
+//                .sources(PisCommServerApplication.class)
+//                .listeners(new ApplicationPidFileWriter("./conf/pis-comm-server.pid"))
 //                .build();
 //        application.run(args);
     }
@@ -105,12 +98,6 @@ public class PisCommServerApplication implements CommandLineRunner, ApplicationL
             logArea.setText(null);
             JTextAreaOutputStream out = new JTextAreaOutputStream(logArea);
             System.setOut(new PrintStream(out));
-//            try {
-//                PrintStream outStream = new PrintStream(out, true, "euc-kr");
-//                System.setOut(outStream);
-//            } catch (UnsupportedEncodingException e) {
-//                //throw new RuntimeException(e);
-//            }
         });
 
         ProcessConfig processConfig = (ProcessConfig) AppUtils.getBean(ProcessConfig.class);
@@ -131,23 +118,24 @@ public class PisCommServerApplication implements CommandLineRunner, ApplicationL
         DbmsJobProcess dbmsJobProcess = (DbmsJobProcess)AppUtils.getBean(DbmsJobProcess.class);
         dbmsJobProcess.run();
 
-        VdsDataProcess tcpServerDataProcess = (VdsDataProcess)AppUtils.getBean(VdsDataProcess.class);
-        tcpServerDataProcess.run();
+//        VdsDataProcess tcpServerDataProcess = (VdsDataProcess)AppUtils.getBean(VdsDataProcess.class);
+//        tcpServerDataProcess.run();
 
         UnitSystService unitSystService = (UnitSystService)AppUtils.getBean(UnitSystService.class);
         unitSystService.loadMaster();
         unitSystService.updateUnitSystStts(true);
 
-        VdsCtlrService ctlrService = (VdsCtlrService)AppUtils.getBean(VdsCtlrService.class);
-        ctlrService.loadDb();
-        ctlrService.updateCtlrStts(true);
-        MainUI mainUI = MainUI.getInstance();
-        if (mainUI != null) {
-            mainUI.LoadControllerInfo(ctlrService);
-        }
+//        VdsCtlrService ctlrService = (VdsCtlrService)AppUtils.getBean(VdsCtlrService.class);
+//        ctlrService.loadDb();
+//        ctlrService.updateCtlrStts(true);
 
-        VdsTcpClientCommService vdsCommClientService = (VdsTcpClientCommService)AppUtils.getBean(VdsTcpClientCommService.class);
-        vdsCommClientService.run();
+//        MainUI mainUI = MainUI.getInstance();
+//        if (mainUI != null) {
+//            mainUI.LoadControllerInfo(ctlrService);
+//        }
+
+//        VdsTcpClientCommService vdsCommClientService = (VdsTcpClientCommService)AppUtils.getBean(VdsTcpClientCommService.class);
+//        vdsCommClientService.run();
 
         CenterTcpServerService centerService = (CenterTcpServerService)AppUtils.getBean(CenterTcpServerService.class);
         centerService.run();
@@ -157,14 +145,6 @@ public class PisCommServerApplication implements CommandLineRunner, ApplicationL
 
         // schedule enable
         processConfig.setStartSchedule(true);
-
-        /*byte val1 = 35;
-        byte val2 = -35;
-        int nval1 = (int)val1;
-        int nval2 = (int)val2;
-        short sval1 = (short)nval1;
-        short sval2 = (short)nval2;
-        log.error("val1: {}, val2: {}, nval1: {}, nval2: {}, sval1: {}, sval2: {}", val1, val2, nval1, nval2, sval1, sval2);*/
     }
 
     public void terminateApplication() {

+ 9 - 5
src/main/java/com/its/pis/webapp/config/WebSecurityConfig.java

@@ -31,7 +31,15 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
     protected void configure(HttpSecurity http) throws Exception {
 
-        http.authorizeRequests()
+        http.csrf().disable();
+
+        http
+                .authorizeRequests()
+                // SWAGGER 권한 설정
+                .antMatchers("/swagger-ui.html", "/swagger/**", "/swagger-resources/**", "/webjars/**", "/v2/api-docs").permitAll()
+                // 웹소켓 권한 설정하지
+                .antMatchers("/ws/**").permitAll()
+
                 .antMatchers(new String[]{"/index"})
                 .hasRole("ADMIN")
                 .antMatchers(new String[]{"/**"})
@@ -51,10 +59,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .exceptionHandling()
                 .accessDeniedPage("/denied");
 
-        http
-                .csrf()
-                .disable();
-
         http
                 .sessionManagement()
                 .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)

+ 12 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CLinkStatusInfo.java

@@ -0,0 +1,12 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 주차장 연결상태 정보
+ */
+public class ParkingC2CLinkStatusInfo {
+
+    private String prk_plce_manage_no;      // 주차장관리 ID 또는 확장ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기) 주차장 관리ID 체계 또는 확장ID 체계 참고
+    private Integer ParkingStationStatus;   // 주차장 연결 상태
+                                            // 0 : offline
+                                            // 1 : online
+}

+ 19 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CLinkStatusInfoRequest.java

@@ -0,0 +1,19 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 관리주차장 연결 상태 정보 요청
+ * message
+ * ParkingC2CLinkStatusInfo_request
+ * 관리주차장 연결 상태 정보 요청
+ * Single, Event-Driven, Periodic
+ * 1.2.410.200053.2.00090.0.2.1.6.0.1
+ */
+public class ParkingC2CLinkStatusInfoRequest {
+
+    private String ParkingCenterId;     // "12345-6-7890", (통합주차정보시스템 ID)
+    private String prk_tkn;             // "h80gATvT7Ge1PIb1QFxbHW17i9J6vNb21ZfSB“, (지역-광역통신토큰정보)
+    // TODO
+    private String event_name;          // "ParkingC2CLink_StatusInfo_request", "ParkingC2CLinkStatusInfo_request", (이벤트명)
+    private String event_type;          // "request" (이벤트형식)
+
+}

+ 24 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CLinkStatusInfoResponse.java

@@ -0,0 +1,24 @@
+package com.its.pis.websocket.C2C;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 관리주차장 연결 상태 정보 응답/갱신
+ * message
+ * ParkingC2CLinkStatusInfo_response
+ * 관리주차장 연결 상태 정보 응답/갱신
+ * Single, Event-Driven, Periodic
+ * 1.2.410.200053.2.00090.0.2.1.6.0.1
+ */
+public class ParkingC2CLinkStatusInfoResponse {
+
+    private String ParkingCenterId;     // "12345-6-7890", (통합주차정보시스템 ID)
+    private String prk_tkn;             // "h80gATvT7Ge1PIb1QFxbHW17i9J6vNb21ZfSB“, (지역-광역통신토큰정보)
+    private String event_name;          // "ParkingC2CLinkStatusInfo_response", (이벤트명)
+    private String event_type;          // "request" (이벤트형식)
+
+    // 주차장 연결상태 정보 목록
+    private List<ParkingC2CLinkStatusInfo> ParkingStatusInfoList = new ArrayList<>();
+
+}

+ 12 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2COprRequest.java

@@ -0,0 +1,12 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 관리주차장 운영정보 요청
+ * message
+ * prk_plce_opr_request_info
+ * 관리주차장 운영 정보 요청
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.1.2.0.1
+ */
+public class ParkingC2COprRequest {
+}

+ 18 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CRequest.java

@@ -0,0 +1,18 @@
+package com.its.pis.websocket.C2C;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class ParkingC2CRequest<T> {
+
+    // command
+    private String command;
+    // data
+    private ParkingC2CRequestData<T> data;
+
+    public void ParkingC2CRequest(String command) {
+
+    }
+}

+ 8 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CRequestData.java

@@ -0,0 +1,8 @@
+package com.its.pis.websocket.C2C;
+
+public class ParkingC2CRequestData<T> {
+
+    // payload
+    private T payload;
+
+}

+ 19 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CRequestPayload.java

@@ -0,0 +1,19 @@
+package com.its.pis.websocket.C2C;
+
+import lombok.Data;
+
+@Data
+public abstract class ParkingC2CRequestPayload {
+
+    private String ParkingCenterId;
+    private String prk_tkn;
+    private String event_name;
+    private String event_type;
+
+    public void initialize(String parkingCenterId, String prk_tkn, String event_name) {
+        this.ParkingCenterId = parkingCenterId;
+        this.prk_tkn = prk_tkn;
+        this.event_name = event_name;
+        this.event_type = "request";
+    }
+}

+ 12 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CReservationRequest.java

@@ -0,0 +1,12 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 주차장 예약 요청
+ * message
+ * prk_plce_reservation_request_info
+ * 관리주차장 예약 정보 요청
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.1.4.0.1
+ */
+public class ParkingC2CReservationRequest {
+}

+ 12 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CRlTimeRequest.java

@@ -0,0 +1,12 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 관리주차장 실시간정보 요청
+ * message
+ * prk_plce_rl_time_request_info
+ * 관리주차장 실시간 정보 요청
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.1.3.2.1
+ */
+public class ParkingC2CRlTimeRequest {
+}

+ 12 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CSttusRequest.java

@@ -0,0 +1,12 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 관리주차장 시설정보 요청
+ * message
+ * prk_plce_sttus_request_info
+ * 관리주차장 시설 정보 요청
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.1.1.0.1
+ */
+public class ParkingC2CSttusRequest {
+}

+ 29 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CVehicleLocationRequestInfo.java

@@ -0,0 +1,29 @@
+package com.its.pis.websocket.C2C;
+
+/**
+ * 관리주차장 이용자 차량 위치 정보
+ */
+public class ParkingC2CVehicleLocationRequestInfo {
+
+    // 주차장 토큰정보
+    private String prk_tkn;
+
+    // 이벤트명
+    private String event_name;          // prk_plce_vhcl_location_request_info
+
+    // 이벤트형식
+    private String event_type;          // request
+
+    // 정보생성 시각
+    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+                                        // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+
+    // 주차장 관리번호
+    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+                                        // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 차량번호
+    private String vhcl_no;     // 이용자 차량번호(입출차 ID) varchar(64) 00하0000(암호화) 필수
+
+}

+ 22 - 0
src/main/java/com/its/pis/websocket/C2C/ParkingC2CVehicleLocationRequestPayload.java

@@ -0,0 +1,22 @@
+package com.its.pis.websocket.C2C;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 관리주차장 이용자 차량 위치 정보 요청
+ * message
+ * prk_plce_vhcl_location_request_info
+ * 관리주차장 이용자 차량 위치 정보 요청
+ * Single
+ * 1.2.410.200053.2.00090.0.2.1.5.0.1
+ */
+@Data
+@Builder
+public class ParkingC2CVehicleLocationRequestPayload extends ParkingC2CRequestPayload {
+
+    private List<ParkingC2CVehicleLocationRequestInfo> ParkingVehicleLocationRequestInfoList;
+
+}

+ 15 - 0
src/main/java/com/its/pis/websocket/C2F/C2FMessage.java

@@ -0,0 +1,15 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class C2FMessage<T> {
+
+    String command;
+    private C2FMessageData<T> data;
+}

+ 14 - 0
src/main/java/com/its/pis/websocket/C2F/C2FMessageData.java

@@ -0,0 +1,14 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class C2FMessageData<T> {
+
+    private T payload;
+}

+ 19 - 0
src/main/java/com/its/pis/websocket/C2F/C2FMessagePayload.java

@@ -0,0 +1,19 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+//@Builder
+//@NoArgsConstructor(access = AccessLevel.PRIVATE)
+//@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class C2FMessagePayload {
+
+    private String prk_tkn;
+    private String event_name;
+    private String event_type;
+    private String prk_plce_manage_no;
+    private String info_create_time;
+
+}

+ 30 - 0
src/main/java/com/its/pis/websocket/C2F/ParkingC2FMessage.java

@@ -0,0 +1,30 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParkingC2FMessage {
+
+    // 주차장 토큰정보: C2C 응답에 사용됨
+    protected String prk_tkn;             // "h80gATvT7Ge1PIb1QFxbHW17i9J6vNb21ZfSB“, (주차장 토큰정보)
+
+    // 이벤트명
+    protected String event_name;          // 주차정보 교환에 필요한 기본정보
+
+    // 이벤트형식
+    protected String event_type;          // 정보 등록/갱신 요청 메시지
+
+    // 정보생성 시각
+    protected String info_create_time;      // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+                                            // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+
+    // 주차장 관리번호
+    protected String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+    // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+}

+ 104 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceOprInfo.java

@@ -0,0 +1,104 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.its.pis.websocket.C2F.prk_plce_opr.OperationInfo;
+import com.its.pis.websocket.C2F.prk_plce_opr.OpertnSchedule;
+import com.its.pis.websocket.C2F.prk_plce_opr.ParkingChargeDetail;
+import lombok.*;
+
+/**
+ * 주차장 운영정보 오픈포맷 메시지 구성(개별시스템 → 통합시스템)
+ * message
+ * prk_plce_opr_info
+ * 주차장 운영정보메시지
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.2.2.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceOprInfo extends C2FMessagePayload {
+
+//    // 이벤트명
+//    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_opr_info(주차장 운영정보) 필수
+//
+//    // 이벤트형식
+//    private String event_type;          // 정보 등록/갱신 요청 메시지      -  request/event-driven                 필수
+//
+//    // 정보생성 시각
+//    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+//                                        // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+//
+//    // 주차장 관리번호
+//    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+//                                        // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 주차장 운영정보 버전
+    private String prk_plce_opr_ver;    // 주차운영 정보버전 varchar(10) 1.1.0          필수
+
+    // 관할기관 명칭
+    private String cmpt_inst_nm;        // 주차정보 수집 및  관리․ 연계, 공유하는 기관 명칭 varchar(32) 관할기관명 (OO 광역시청) 필수
+
+    // 운영기관 정보
+    private OperationInfo operation_info;
+
+    // 주차 부제 시행여부
+    private Integer no_drv_day_opertn_at;   // 주차부제 시행 유형 numeric(1,0)
+                                            // 0 : 미시행
+                                            // 1 : 2부제
+                                            // 2 : 5부제
+                                            // 3 : 10부제
+                                            // 4 : 승용차요일제
+                                            // 9 : 기타                           필수
+
+    // 운영스케쥴
+    private OpertnSchedule opertn_schedule;
+
+    // 기본무료 시간
+    private String opertn_bs_free_time;     // 주차장 회차 (기본 무료)시간 time 00:30:00 필수
+
+    // 개방코드
+    private Integer opn_code;               // 운영시간 외 무료 개방 numeric(1,0)
+                                            // 0 : 미개방
+                                            // 1 : 개방            선택
+
+    // 주차요금 정산 방식
+    private Integer parking_chrge_excclc_mthd;  // 주차요금 정산하는 방식 numeric(1,0)
+                                                // 0 : 유인정산
+                                                // 1 : 무인정산
+                                                // 2 : 혼합정산
+                                                // 9 : 기타            선택
+
+    // 주차요금 지불수단
+    private String parking_chrge_pymnt_mn;      // 주차요금 지불수단 방식 BIT(8)
+                                                // 1 : 현금
+                                                // 2 : 신용카드
+                                                // 3 : 교통카드
+                                                // 4 : 전자지불 (하이패스)
+                                                // 5 : 휴대폰소액결제
+                                                // 6 : 핀테크 (OO페이)
+                                                // 7 : MaaS 통합결제
+                                                // 9 : 기타
+                                                //    예시)
+                                                //    현금/신용카드 혼합결제 시 (11000000),
+                                                //    핀테크            결제 시 (00000100)    필수
+
+    // 주차요금
+    // TODO
+    //private ParkingChargeDetail parking_charge_detail;
+    private ParkingChargeDetail parking_chrge_detail;
+
+    // 주차예약 시행여부
+    private Integer parking_resve_opertn_at;    // 사전 주차 예약 서비스 시행 여부 numeric(1,0)
+                                                // 0 : 미시행
+                                                // 1 : 시행-주차장
+                                                // 2 : 시행-주차구역
+                                                // 3 : 시행-주차면         필수
+
+    // 특이사항
+    private String partclr_matter;              // 기타 주차장 운영 정보 관련 varchar(128) -   선택
+
+}

+ 55 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceReservationRequestInfo.java

@@ -0,0 +1,55 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.its.pis.websocket.C2F.prk_plce_reservation.ResveTime;
+import com.its.pis.websocket.C2F.prk_plce_reservation.RsvCtmInfo;
+import lombok.*;
+
+/**
+ * 주차장 예약 요청(통합시스템 → 개별시스템)
+ * message
+ * prk_plce_reservation_request_info
+ * 주차장 시설 이용 예약 요청
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.2.4.0.1
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceReservationRequestInfo {
+
+    // 이벤트명
+    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_reservation_request_info(주차장 예약요청정보) 필수
+
+    // 이벤트형식
+    private String event_type;          // 정보 등록/갱신 요청 메시지      -  request/event-driven                 필수
+
+    // 정보생성 시각
+    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+    // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+
+    // 주차장 관리번호
+    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+    // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 예약고유 식별번호
+    private String resve_innb;  // 예약에 대한 고유 식별 번호 (건당 1개 아이디 생성) varchar(32) 주차장 정보관리 확장 ID체계(18)+입차기준일(8)+입차건일련번호(6) (418002243300001002 20200101 000001) 필수
+
+    // 예약자 정보
+    private RsvCtmInfo rsv_ctm_info;
+
+    // 주차 예약 시간
+    private ResveTime resve_time;
+
+    // 예약코드
+    private Integer resve_code;     //  예약상태 코드표 numeric(1, 0)
+                                    // 0 : 신규예약
+                                    // 1 : 예약변경
+                                    // 2 : 취소요청             필수
+
+    // 특이사항
+    private String partclr_matter;  // 기타 주차장 예약 정보 관련 varchar(128) - 선택
+}

+ 55 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceReservationResponseInfo.java

@@ -0,0 +1,55 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차장 예약 응답(개별시스템 → 통합시스템)
+ * message
+ * prk_plce_reservation_response_info
+ * 주차장 시설 이용 예약 응답
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.2.4.0.2
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceReservationResponseInfo extends C2FMessagePayload {
+
+//    // 이벤트명
+//    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_reservation_response_info(주차장 예약 응답 정보) 필수
+//
+//    // 이벤트형식
+//    private String event_type;          // 정보 등록/갱신 요청 메시지      -  response                 필수
+//
+//    // 정보생성 시각
+//    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+//                                        // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+//
+//    // 주차장 관리번호
+//    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+//                                        // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 예약고유 식별번호
+    private String resve_innb;  // 예약에 대한 고유 식별 번호 (건당 1개 아이디 생성) varchar(32) 주차장 정보관리 확장 ID체계(18)+입차기준일(8)+입차건일련번호(6) (418002243300001002 20200101 000001) 필수
+
+    // 예약주차 구역/면
+    private String resve_prk_plce_cmprt_co; // 주차장의 예약 가능 주차구역 또는 주차면 varchar(16) 1F-A(층/구역번호) 1F-A001(층/구역/주차면번호) 선택
+
+    // 예약요청 결과회신
+    private Integer resve_result_code;      // 예약결과 회신 코드 numeric(1,0)
+                                            // 0 : 예약승인
+                                            // 1 : 변경승인
+                                            // 2 : 취소승인
+                                            // 3 : 예약실패/거부  필수
+    // 예약실패/거부 사유
+    private String resve_failr_resn;        // 예약 거부 또는 실패 사유 varchar(128) - 선택
+    // 예약완료 결과
+    private Integer resve_code;             // 예약 결과 안내 numeric(1,0)
+                                            // 0 : 입차완료
+                                            // 1 : 미입차/예약삭제 필수
+
+}

+ 22 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceRlTimeRequestInfo.java

@@ -0,0 +1,22 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차장 실시간 정보 요청(통합시스템 → 개별시스템)
+ * message
+ * prk_plce_rl_time_request_info
+ * 주차장 실시간 정보 요청/응답
+ * Single, Event-Driven, Periodic
+ * 1.2.410.200053.2. 00090.0.2.2.3.2.1
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceRlTimeRequestInfo {
+
+    private String temp;
+}

+ 79 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceRlTimeResponseInfo.java

@@ -0,0 +1,79 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.its.pis.websocket.C2F.prk_plce_rl_time.PrkColctDeviceInfo;
+import com.its.pis.websocket.C2F.prk_plce_rl_time.RtArInfr;
+import com.its.pis.websocket.C2F.prk_plce_rl_time.RtFlrInfr;
+import com.its.pis.websocket.C2F.prk_plce_rl_time.RtPrvusePrkarInfo;
+import lombok.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 주차장 실시간 정보 응답(개별시스템 → 통합시스템)
+ * message
+ * prk_plce_rl_time_info
+ * 주차장 실시간 정보 응답
+ * Single, Event-Driven, Periodic
+ * 1.2.410.200053.2. 00090.0.2.2.3.2.2
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceRlTimeResponseInfo extends C2FMessagePayload {
+
+    // Token
+    private String prk_tkn;
+//    // 이벤트명
+//    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_rl_time_info(주차장 실시간 정보) 필수
+//
+//    // 이벤트형식
+//    private String event_type;          // 정보 등록/갱신 요청 메시지      -  request/event-driven                 필수
+//
+//    // 정보생성 시각
+//    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+//                                        // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+//
+//    // 주차장 관리번호
+//    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+//                                        // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 데이터 수집 시간
+    private String data_colct_time;     // 실시간 주차데이터 수집시간 datetime 2020년01월01일 10시10분10초 (YYYY-MM-DD hh:mm:ss) 필수
+
+    // 주차혼잡 상태
+    private Integer parking_cgs_sttus;  // 주차장 상태 코드 (운영사와 협의하에 기준 선정하며, 제시된 기준은 예시임) numeric(1,0)
+                                        // 0 : 여유 (점유 50% 미만)
+                                        // 1 : 보통 (점유 70% 미만)
+                                        // 2 : 혼잡 (점유 90% 미만)
+                                        // 3 : 만차 (점유 90% 초과)       선택
+
+    // 총 주차구획 수
+    private Integer prk_cmprt_co;           // 주차장의 총 주차 구획 수 numeric(18,0) 150 (면) 필수
+
+    // 총 잔여 주차 구획 수
+    private Integer remndr_prk_cmprt_co;    // 주차장의 총 잔여 주차 구획 수 numeric(18,0) 150 (면) 필수
+
+    // 층 구분
+    private List<RtFlrInfr> flr_info = new ArrayList<>();
+
+    // 구역 구분
+    private List<RtArInfr> ar_info = new ArrayList<>();
+
+    // 전용주차 구역
+    private List<RtPrvusePrkarInfo> prvuse_prkar_info = new ArrayList<>();
+
+    // 주차예약 가능 단위 구획 수
+    private Integer prk_resve_avail_cmprt_co;    // 현재 주차 예약이 가능한 주차 단위 구획 수 (주차예약 시행 시) numeric(18,0) 5 (면) 선택
+
+    // 주차정보 수집장치 정보
+    private List<PrkColctDeviceInfo> prk_colct_device_info = new ArrayList<>();     // 선택
+
+    // 특이사항
+    private String partclr_matter;  // 기타 주차장 실시간 정보 관련 varchar(128) - 선택
+
+}

+ 127 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceSttusInfo.java

@@ -0,0 +1,127 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.its.pis.websocket.C2F.prk_plce_sttus.*;
+import lombok.*;
+
+/**
+ * 주차장 시설정보 오픈포맷 메시지 구성(개별시스템 → 통합시스템)
+ * message
+ * prk_plce_sttus_info
+ * 주차장 시설정보메시지
+ * Single, Event-Driven
+ * 1.2.410.200053.2.00090.0.2.2.1.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceSttusInfo extends C2FMessagePayload {
+
+//    // Token
+//    private String prk_tkn;
+//    // 이벤트명
+//    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_sttus_info(주차장 시설정보) 필수
+//    // 이벤트형식
+//    private String event_type;          // 정보 등록/갱신 요청 메시지      -  request/event-driven                 필수
+//    // 정보생성 시각
+//    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+//                                        // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+//    // 주차장 관리번호
+//    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+//                                        // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 주차장 시설정보 버전
+    private String prk_plce_sttus_ver;  // 주차시설 정보버전 varchar(10)    1.1.0	필수
+
+    // 주차장명
+    private String prk_plce_nm;         // 주차장 이름 varchar(32)	주차장 고유명칭 (OO역 제1주차장)	필수
+
+    // 주차장 주소
+    private String prk_plce_adres;      // 도로명 주소	varchar(32)	시․도, 구․군,    읍․면, 도로명,    건물번호, 동․호, 상세주소  (OO시 OO구OO로 10)	필수
+
+    // 주차장 설치일자
+    private String prk_plce_instl_de;   // 설치 주체에 의해 주차장이 설치된 일자	date	2020년01월01일 (YYYY-MM-DD)	필수
+
+    // 주차장 폐지일자
+    private String prk_plce_abl_de;     // 주차장 폐지된 일자	date	2020년01월01일 (YYYY-MM-DD)	선택
+
+    // 주차장 입구위치 (주출입구 기준)
+    private PrkPlceEntrcLc prk_plce_entrc_lc;  // 주차장 입구위치 (주출입구 기준)(JsonObject)
+
+    // 주차장 입출구 형태
+    private Integer prk_plce_entrc_extty;       //주차장 입구 ․ 출구 형태에 따른 구분(공통, 분리) numeric(1, 0)
+                                                // 0 : 공통출입구
+                                                // 1 : 출입구 분리
+                                                // 9 : 기타                                           선택
+
+    // 주차형식
+    private Integer parking_ty;                 // 주차장 내 따른 주차	주차 면에 형식 구분	numeric(1, 0)
+                                                // 0 : 평행주차
+                                                // 1 : 직각주차
+                                                // 2 : 60도 대향주차
+                                                // 3 : 45도 대향주차
+                                                // 9 : 기타                                           선택
+
+    // 이용형태
+    private Integer parking_us;                 // 주차장 이용형태 구분 numeric(1,0)
+                                                // 0 : 자주식
+                                                // 1 : 기계식
+                                                // 9 : 기타                                            필수
+
+    // 급지구분
+    private Integer ar_level_se;                // 지역 내 급지 구분 numeric(1, 0)
+                                                // 0 : 1급지
+                                                // 1 : 2급지
+                                                // 2 : 3급지
+                                                // 3 : 4급지
+                                                // 4 : 5급지
+                                                // 9 : 기타                                            필수
+
+    // 주차장 구조 이미지
+    private PrkPlaceImage prk_place_image;
+
+    // 시스템명
+    private String sys_ne;                      // SYSTEM NAME 대상 데이터베이스와 연계된 시스템 명칭	varchar(32)	(주차정보공유 시스템)	필수
+
+    // 주차관제 시스템 설치일자
+    private String parking_cntrl_sys_instl_de;  // 주차관제시스템 설치한 경우, 설치 일자(주차장 정보관리 확장 ID 체계 18번째 코드가 1인 경우)	date
+                                                // 2020년01월01일 (YYYY-MM-DD)	선택
+
+    // 관련법령
+    private String relation_law_and_ordinances; // 시스템 운영 및 데이터 수집과 관련된 근거 법령	varchar(50)	공공데이터 개방표준(행정안전부 고시 제2019-61호)	선택
+
+    // 이용가능 차량유형
+    private String prk_avail_cartype;           // 차량유형별 주차장 이용가능 여부    BIT(7)
+                                                // 0 : 승용(소형)
+                                                // 1 : 승용(중형)
+                                                // 2 : 승용(대형)
+                                                // 3 : SUV
+                                                // 4 : 승합차
+                                                // 5 : 화물(중형)
+                                                // 6 : 화물(대형)
+                                                // 예시)  승용(중형), SUV 이용가능 시,  (1101000)      선택
+// TODO
+    private PrkCmprtCoInfo prk_cmprt_co_info;   //
+//    // 총 주차구획 수
+//    private Integer prk_cmprt_co;               // 주차장의 총 주차 구획 수 numeric (18,0) 150(면) 필수
+//
+//    // 층 구분
+//    private List<FlrInfr> flr_infr = new ArrayList<>();
+//
+//    // 구역 구분
+//    private List<ArInfr> ar_infr = new ArrayList<>();
+//
+//    // 전용주차 구역
+//    private List<PrvusePrkarInfo> prvuse_prkar_info = new ArrayList<>();
+
+    // 주차구획 단위정보 수집장치 정보
+    private PrkUcmprtColctDeviceInfo prk_ucmprt_colct_device_info;
+
+    // 방범 CCTV 설치여부 정보
+    private CrmPrvCctvInstl crm_prv_cctv_instl;
+
+
+}

+ 39 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceVhclLocationRequestInfo.java

@@ -0,0 +1,39 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 이용자 차량 위치 정보 요청(통합시스템 → 개별시스템)
+ * message
+ * prk_plce_vhcl_location_request_info
+ * 이용자 차량 위치정보 요청
+ * Single
+ * 1.2.410.200053.2.00090.0.2.2.5.0.1
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceVhclLocationRequestInfo {
+
+    // 이벤트명
+    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_vhcl_location_request_info(이용자 차량 위치 정보 요청) 필수
+
+    // 이벤트형식
+    private String event_type;          // 정보 등록/갱신 요청 메시지      -  request                 필수
+
+    // 정보생성 시각
+    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+    // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+
+    // 주차장 관리번호
+    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+    // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 차량번호
+    private String vhcl_no;     // 이용자 차량번호(입출차ID) varchar(64) 00하0000(암호화) 필수
+
+}

+ 50 - 0
src/main/java/com/its/pis/websocket/C2F/PrkPlceVhclLocationResponseInfo.java

@@ -0,0 +1,50 @@
+package com.its.pis.websocket.C2F;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.its.pis.websocket.C2F.prk_plce_vhcl_location.LocationInfo;
+import lombok.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 이용자 차량 위치 정보 응답(개별시스템 → 통합시스템)
+ * message
+ * prk_plce_vhcl_location_response_info
+ * 이용자 차량 위치정보 응답
+ * Single
+ * 1.2.410.200053.2.00090.0.2.2.5.0.2
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceVhclLocationResponseInfo extends C2FMessagePayload {
+
+//    // Token
+//    private String prk_tkn;
+//    // 이벤트명
+//    private String event_name;          // 주차정보 교환에 필요한 기본정보 -  prk_plce_vhcl_location_response_info(이용자 차량위치 정보 응답)) 필수
+//
+//    // 이벤트형식
+//    private String event_type;          // 정보 등록/갱신 요청 메시지      -  response                 필수
+//
+//    // 정보생성 시각
+//    private String info_create_time;    // 주차정보를 입력하여 생성하는 시각(주차정보 신규 생성 시, 서버에서 정보 갱신 시각 관리, 24시간 표기법 사용)
+//                                        // datetime	2020년01월01일10시10분10초(YYYY-MM-DD hh:mm:ss)       필수
+//
+//    // 주차장 관리번호
+//    private String prk_plce_manage_no;  // 주차장 관리 ID 또는 확장 ID (시스템 내 정보교환을 하는데 있어, 필요하다 판단될 경우 관리ID와 확장ID 모두 명기)
+//                                        // char(18) 주차장 관리 ID 체계 또는 확장 ID 체계 참고               필수
+
+    ////////////////////////////////////////
+    // 차량번호
+    private String vhcl_no;     // 이용자 차량번호(입출차ID) varchar(64) 00하0000(암호화) 필수
+
+    // 위치정보
+    // TODO
+    //private LocationInfo location_info;
+    private List<LocationInfo> location_info = new ArrayList<>();
+
+}

+ 24 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/OperationInfo.java

@@ -0,0 +1,24 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 운영기관 정보
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OperationInfo {
+
+    // 운영부서명
+    private String oper_dept_nm;        // varchar(32) 운영부서명 (교통정책과) 선택
+    // 운영기관 담당자
+    private String oper_person_nm;      // varchar(10) 운영담당자명 (홍길동) 선택
+    // 운영담당자 전화번호
+    private String oper_ctt_pc_tel;     // varchar(13) 운영담당자 전화번호 (02-0000-0000) 필수
+    //운영담당자 이메일
+    private String oper_ctt_pc_email;   // varchar(50) 운영담당자 이메일 (hongkildong@korea.kr) 선택
+}

+ 33 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/OpertnSchedule.java

@@ -0,0 +1,33 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+
+/**
+ * 운영스케쥴
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OpertnSchedule {
+
+    @JsonProperty("Sunday")
+    private OpertnTime Sunday;
+    @JsonProperty("Monday")
+    private OpertnTime Monday;
+    @JsonProperty("Tuesday")
+    private OpertnTime Tuesday;
+    @JsonProperty("Wednesday")
+    private OpertnTime Wednesday;
+    @JsonProperty("Thursday")
+    private OpertnTime Thursday;
+    @JsonProperty("Friday")
+    private OpertnTime Friday;
+    @JsonProperty("Saturday")
+    private OpertnTime Saturday;
+    @JsonProperty("Holiday")
+    private OpertnTime Holiday;
+}

+ 25 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/OpertnTime.java

@@ -0,0 +1,25 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차장 운영시간
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OpertnTime {
+
+    // 운영시작시간
+    private String opertn_start_time;           // time 08:00:00
+    // 운영종료시간
+    private String opertn_end_time;             // time 21:00:00
+    // 요일별 주차요금 부과여부
+    private Integer parking_chrge_levy_at;      // numeric(1,0)
+                                                // 0 : 무료
+                                                // 1 : 유료
+                                                // 2 : 혼합
+}

+ 25 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeBasic.java

@@ -0,0 +1,25 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차요금-일반
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParkingChargeBasic {
+
+    // 기본주차시간
+    private Integer parking_chrge_bs_time;          // numeric(4,0) 0120 (2시간, 분단위 표기)
+    // 기본주차요금
+    private Integer parking_chrge_bs_chrge;         // numeric(6,0) 2000 (원)
+    // 추가단위시간
+    private Integer parking_chrge_adit_unit_time;   // numeric(4,0) 0060 (1시간, 분단위 표기)
+    // 추가단위요금
+    private Integer parking_chrge_adit_unit_chrge;  // numeric(6,0) 1000(원)
+
+}

+ 27 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeDetail.java

@@ -0,0 +1,27 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차요금
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParkingChargeDetail {
+
+    // 일반요금
+    private ParkingChargeBasic basic_info;      // 필수
+
+    // 정액요금
+    private ParkingChargeFxamt fxamt_info;      // 선택
+
+    // 할증요금
+    private ParkingChargePrmium prmium_info;    // 선택
+
+    // 요금할인
+    private ParkingChargeDscnt dscnt_info;      // 선택
+}

+ 49 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeDscnt.java

@@ -0,0 +1,49 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차요금-요금할인
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParkingChargeDscnt {
+
+    // 경형자동차
+    private Integer parking_chrge_dc_rate_lghvhcl;          // numeric(3,0) 60(%)
+    // 장애인차량
+    private Integer parking_chrge_dc_rate_dspsn;            // numeric(3,0) 50(%)
+    // 부제운행차량
+    private Integer parking_chrge_dc_rate_no_drv_day;       // numeric(3,0) 20(%)
+    // 긴급차량
+    private Integer parking_chrge_dc_rate_emrgncy;          // numeric(3,0) 100(%)
+    // 국가유공자차량
+    private Integer parking_chrge_dc_rate_national_merit;   // numeric(3,0) 50(%)
+    // 성실납세자차량
+    private Integer parking_chrge_dc_rate_earnest_taxpayer; // numeric(3,0) 100(%)
+    // 우수자원봉사차량
+    private Integer parking_chrge_dc_rate_exclnc_volunteer; // numeric(3,0) 100(%)
+    // 승용차요일제참여차량
+    private Integer parking_chrge_dc_rate_day_of_week;      // numeric(3,0) 20(%)
+    // 환승차량
+    private Integer parking_chrge_dc_rate_trnsit;           // numeric(3,0) 50(%)
+    // 관용차량
+    private Integer parking_chrge_dc_rate_offl;             // numeric(3,0) 100(%)
+    // 고엽제후유증차량
+    private Integer parking_chrge_dc_rate_agtorn_squl;      // numeric(3,0) 50(%)
+    // 병역명문가 차량
+    private Integer parking_chrge_dc_rate_mtrsc_dynasty;    // numeric(3,0) 50(%)
+    // 저공해차량
+    private Integer parking_chrge_dc_rate_lplgn;            // numeric(3,0) 60(%)
+    // 의상자증소지차량
+    private Integer parking_chrge_dc_rate_rescue_efforts;   // numeric(3,0) 60(%)
+    // 다자녀차량
+    private Integer parking_chrge_dc_rate_mnych;            // numeric(3,0) 50(%)
+    // 기타
+    private Integer parking_chrge_dc_rate_etc;              // numeric(3,0) 00(%)
+
+}

+ 22 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargeFxamt.java

@@ -0,0 +1,22 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차요금-정액
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParkingChargeFxamt {
+
+    // 1일요금적용시간
+    private Integer parking_chrge_one_day_time;    // numeric(4,0) 0360 (6시간 이상, 분단위)
+    // 1일요금
+    private Integer parking_chrge_one_day_chrge;   // numeric(6,0) 30000(원)
+    // 월정액
+    private Integer parking_chrge_mon_unit_chrge;  // numeric(7,0) 150000(원)
+}

+ 23 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_opr/ParkingChargePrmium.java

@@ -0,0 +1,23 @@
+package com.its.pis.websocket.C2F.prk_plce_opr;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차요금-할증요금
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ParkingChargePrmium {
+
+    // 할증 기준 시간
+    private Integer parking_chrge_adjst_bs_time;            // numeric(6,0) 0360 (6시간 이상, 분단위)
+    // 할증 추가단위시간
+    private Integer parking_chrge_adjst_adit_unit_time;     // numeric(4,0) 0060 (1시간, 분단위 표기)
+    // 할증 추가단위요금
+    private Integer parking_chrge_adjst_adit_unit_chrge;    // numeric(6,0) 1000(원)
+
+}

+ 21 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_reservation/ResveTime.java

@@ -0,0 +1,21 @@
+package com.its.pis.websocket.C2F.prk_plce_reservation;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차 예약 시간
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ResveTime {
+
+    // 입차시간
+    private String resve_ent_time;      // datetime 2020년01월01일 10시10분10초 (YYYY-MM-DD hh:mm:ss) 필수
+    // 출차시간
+    private String resve_lv_time;       // datetime 선택
+
+}

+ 36 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_reservation/RsvCtmInfo.java

@@ -0,0 +1,36 @@
+package com.its.pis.websocket.C2F.prk_plce_reservation;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 예약자 정보
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RsvCtmInfo {
+
+    // 입출차 ID
+    private String ent_lv_vhcl_id;      // varchar(64) 00하0000(암호화)         필수
+    // 예약차량 차종
+    private Integer resve_vhcty;        // numeric(1,0)
+                                        // 0 : 승용차 (소형,중형)
+                                        // 1 : 승용차(대형)
+                                        // 2 : 경차
+                                        // 3 : 친환경차(전기차)
+                                        // 4 : 장애인 차량
+                                        // 5 : 승합차
+                                        // 6 : 화물차(중형)
+                                        // 7 : 화물차(대형)
+                                        // 9 : 기타                             선택
+    // 이용자 성명
+    private String resve_name;          // varchar(32) 홍길동 선택
+    // 이용자 식별아이디
+    private String resve_email;         // varchar(64) hongkildong@korea.kr     필수
+    // 예약자 연락처
+    private String resve_tel;           // varchar(16) 010-1234-5678            선택
+
+}

+ 49 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/PrkColctDeviceInfo.java

@@ -0,0 +1,49 @@
+package com.its.pis.websocket.C2F.prk_plce_rl_time;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+
+/**
+ * 주차정보 수집장치 정보
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkColctDeviceInfo {
+
+    // 주차정보수집장치 ID
+    @JsonProperty("device_ID")
+    private String device_id;           // varchar(5) 설치순서에 따라 1부터 오름차순(1∼65535) 선택
+    // 주차정보수집장치 종류
+    private Integer device_type;        // numeric(1,0)
+                                        // 0 : 영상식
+                                        // 1 : 지자기
+                                        // 2 : 레이더
+                                        // 3 : 루프
+                                        // 4 : 초음파
+                                        // 9 : 기타
+    // 주차면 ID
+    @JsonProperty("prk_unit_ID")
+    private String prk_unit_id;         // varchar(10) 층번호+구역일련번호 예시) 1FA01 1층 A구역 01번 주차면
+    // 주차면 유형
+    private Integer typed_parking_lots; // numeric(1,0)
+                                        // 0 : 일반
+                                        // 1 : 경차 전용
+                                        // 2 : 대형(화물)전용
+                                        // 3 : 긴급차량전용
+                                        // 4 : 장애인 전용
+                                        // 5 : 여성 전용
+                                        // 9 : 기타
+    // 주차면 점유여부
+    private Integer occupation;         // numeric(1,0)
+                                        // 0 : 주차가능 (주차면 비점유)
+                                        // 1 : 주차불가 (주차면 점유)
+    // 통신상태
+    private Integer connect;            // numeric(1,0)
+                                        // 0 : 불량
+                                        // 1 : 정상
+
+}

+ 23 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/RtArInfr.java

@@ -0,0 +1,23 @@
+package com.its.pis.websocket.C2F.prk_plce_rl_time;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 구역 구분
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RtArInfr {
+
+    // 구역 일련번호
+    private String ar_no;               // varchar(10) A01, A02, A03, ...    선택
+    // 구역별 주차 구획 수
+    private Integer ar_prk_cmprt_co;    // numeric(18,0) 120(면)             선택
+
+    // 구역별 잔여 주차 구획 수
+    private Integer ar_remndr_prk_cmprt_co;     // numeric(18,0) 120(면)     선택
+}

+ 24 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/RtFlrInfr.java

@@ -0,0 +1,24 @@
+package com.its.pis.websocket.C2F.prk_plce_rl_time;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 층 구분
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RtFlrInfr {
+
+    // 층 번호
+    private String flr_no;              // varchar(10) 지상층(1F, 2F, ...) 지하층(B1, B2, ...)    선택
+    // 층별 주차구획 수
+    private Integer flr_prk_cmprt_co;   // numeric(18,0) 100(면)                                  선택
+
+    // 층별 잔여 주차구획 수
+    private Integer flr_remndr_prk_cmprt_co;    // numeric(18,0) 100(면) 선택
+
+}

+ 31 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_rl_time/RtPrvusePrkarInfo.java

@@ -0,0 +1,31 @@
+package com.its.pis.websocket.C2F.prk_plce_rl_time;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 전용주차 구역
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RtPrvusePrkarInfo {
+
+    // 전용주차구역 구분
+    private Integer vhcty_ar_se;            // numeric(1,0)
+                                            // 0: 경차 전용
+                                            // 1: 친환경차 (전기차)
+                                            // 2: 화물차 전용
+                                            // 3: 긴급차량 전용
+                                            // 4: 장애인 전용
+                                            // 5: 어르신 전용
+                                            // 6: 여성 전용
+                                            // 9: 기타                            선택
+    // 전용주차구역별 주차 구획 수
+    private Integer vhcty_ar_prk_cmprt_co;  // numeric(18,0) 10(면)               선택
+
+    // 전용주차구역별 잔여 주차 구획 수
+    private Integer vhcty_ar_remndr_prk_cmprt_co;   // numeric(18,0) 10(면)       선택
+}

+ 24 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/ArInfr.java

@@ -0,0 +1,24 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 구역 구분
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ArInfr {
+
+    // 구역 일련번호
+    private String ar_no;               // varchar(10) A01, A02, A03, ...       선택
+    // 구역별 주차 구획 수
+    private Integer ar_prk_cmprt_co;    // numeric(18,0) 120(면)             선택
+
+    // 층 번호
+    // TODO(문서에는 없고 json 예제에 만 존재)
+    private String flr_no;              // varchar(10) 지상층(1F, 2F, ...) 지하층(B1, B2, ...)    선택
+}

+ 21 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/ContCo.java

@@ -0,0 +1,21 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 제어기 수량
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ContCo {
+
+    // Master 제어기
+    private Integer master_controller;      // numeric(18,0) 1(대)   선택
+    // Slave 제어기
+    private Integer slave_controller;       // numeric(18,0) 5(대)   선택
+
+}

+ 24 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/CrmPrvCctvInstl.java

@@ -0,0 +1,24 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 방범 CCTV 설치여부 정보
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CrmPrvCctvInstl {
+
+    // 방범 CCTV 설치여부
+    private Integer crm_prv_cctv_instl_at;      // numeric(1,0)
+                                                // 0 : 미설치
+                                                // 1 : 설치            선택
+    // 방범 CCTV 설치대수
+    // TODO
+    //private Integer crm_prv_cctv_co;            // numeric(18,0) 10(대) 선택
+    private Integer crm_prv_cctv_instl_co;            // numeric(18,0) 10(대) 선택
+}

+ 20 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/FlrInfr.java

@@ -0,0 +1,20 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 층 구분
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FlrInfr {
+
+    // 층 번호
+    private String flr_no;              // varchar(10) 지상층(1F, 2F, ...) 지하층(B1, B2, ...)    선택
+    // 층별 주차구획 수
+    private Integer flr_prk_cmprt_co;   // numeric(18,0) 100(면)                                  선택
+}

+ 31 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkCmprtCoInfo.java

@@ -0,0 +1,31 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 주차장 입구위치
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkCmprtCoInfo {
+
+    // 총 주차구획 수
+    private Integer prk_cmprt_co;               // 주차장의 총 주차 구획 수 numeric (18,0) 150(면) 필수
+
+    // 층 구분
+    private List<FlrInfr> flr_info = new ArrayList<>();
+
+    // 구역 구분
+    private List<ArInfr> ar_info = new ArrayList<>();
+
+    // 전용주차 구역
+    private List<PrvusePrkarInfo> prvuse_prkar_info = new ArrayList<>();
+
+}

+ 27 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkPlaceImage.java

@@ -0,0 +1,27 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차장 구조 이미지
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlaceImage {
+    // 주차장 구조 이미지 데이터
+    //private byte[] prk_plce_image_data;     // BYTEA    Base64로 인코딩된 Binary Data            필수
+    private String prk_plce_image_data;     // BYTEA    Base64로 인코딩된 Binary Data            필수
+    // 주차장 이미지 유형
+    private Integer prk_plce_image_type;    // numeric (1,0)
+                                            // 0 : bitmap
+                                            // 1 : gif
+                                            // 2 : jpg
+                                            // 3 : png
+                                            // 9 : 기타                                           필수
+    // 이미지 파일명 또는 부가설명
+    private String prk_plce_image_dc;       // varchar (50)    OO역 제1주차장 전경/출입구         선택
+}

+ 23 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkPlceEntrcLc.java

@@ -0,0 +1,23 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차장 입구위치
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkPlceEntrcLc {
+
+    // 주차장 입구명
+    private String prk_plce_entrc_nm;   //varchar(32)	(동문 입구)	필수
+    // 주차장 입구위치 위도
+    private String prk_plce_entrc_la;   //varchar(16)	(35.879337)	필수
+    // 주차장 입구위치 경도
+    private String prk_plce_entrc_lo;   //varchar(16)	(128.628764)	필수
+
+}

+ 40 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrkUcmprtColctDeviceInfo.java

@@ -0,0 +1,40 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차구획 단위정보 수집장치 정보
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrkUcmprtColctDeviceInfo {
+
+    // 주차구획 단위정보 수집장치 설치 여부
+    private Integer prk_ucmprt_colct_device_instl_at;       // numeric(1,0)
+                                                            // 0 : 미설치
+                                                            // 1 : 설치 필수
+    // 제어기 수량
+    private ContCo cont_co;                                 // 선택
+
+    // 주차정보 수집장치 설치 수량
+    private Integer prk_ucmprt_colct_device_qty;            // numeric(18,0) 10(대) 선택
+
+    // 주차정보 수집장치 종류
+    private String prk_ucmprt_colct_device_knd;             // BIT(6)
+                                                            // 0 : 영상식
+                                                            // 1 : 지자기
+                                                            // 2 : 레이더
+                                                            // 3 : 루프
+                                                            // 4 : 초음파
+                                                            // 9 : 기타    예시) 지자기설치 시 (010000), 영상/레이더 혼합 설치시(101000)    선택
+
+    // 주차정보 수집장치 종류별 수량
+    private TypedPrkColctDeviceQty typed_prk_colct_device_qty;  // 선택
+
+    // 주차구획 단위정보 수집장치 설치일자
+    private String prk_ucmprt_colct_device_instl_de;            // date 2020년01월01일 (YYYY-MM-DD)    선택
+}

+ 28 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/PrvusePrkarInfo.java

@@ -0,0 +1,28 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 전용주차 구역
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PrvusePrkarInfo {
+
+    // 전용주차구역 구분
+    private Integer vhcty_ar_se;            // numeric(1,0)
+                                            // 0: 경차 전용
+                                            // 1: 친환경차 (전기차)
+                                            // 2: 화물차 전용
+                                            // 3: 긴급차량 전용
+                                            // 4: 장애인 전용
+                                            // 5: 어르신 전용
+                                            // 6: 여성 전용
+                                            // 9: 기타                            선택
+    // 전용주차구역별 주차 구획 수
+    private Integer vhcty_ar_prk_cmprt_co;  // numeric(18,0) 10(면)               선택
+}

+ 29 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_sttus/TypedPrkColctDeviceQty.java

@@ -0,0 +1,29 @@
+package com.its.pis.websocket.C2F.prk_plce_sttus;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 주차정보 수집장치 종류별 수량
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TypedPrkColctDeviceQty {
+    // 선택
+
+    // 영상식
+    private Integer type_imgage;            //  numeric(18,0) 2(대)
+    // 지자기
+    private Integer type_geomagnetic;       //  numeric(18,0) 5(대)
+    // 레이더
+    private Integer type_radar;             //  numeric(18,0) 1(대)
+    // 루프
+    private Integer type_loop;              //  numeric(18,0) 3(대)
+    // 초음파
+    private Integer type_ultrasonic;        //  numeric(18,0) 4(대)
+    // 기타
+    private Integer type_etc;               //  numeric(18,0) 0(대)
+}

+ 21 - 0
src/main/java/com/its/pis/websocket/C2F/prk_plce_vhcl_location/LocationInfo.java

@@ -0,0 +1,21 @@
+package com.its.pis.websocket.C2F.prk_plce_vhcl_location;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+/**
+ * 위치정보
+ */
+@Data
+@Builder
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class LocationInfo {
+
+    // 층 번호
+    private String flr_no;      // varchar(10) 지상층(1F, 2F, ...) 지하층(B1, B2, ...)  필수
+    // 구역 일련번호
+    private String ar_no;       // varchar(10)  A01, A02, A03,...                       필수
+
+}

+ 4 - 2
src/main/java/com/its/pis/websocket/ItsWebSocketConfig.java

@@ -13,19 +13,21 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
 @EnableWebSocket
 public class ItsWebSocketConfig implements WebSocketConfigurer {
 
+    public static final String WS_ENDPOINT = "/ws/pis-c2f.do";
+
     private final ItsWebSocketHandler itsWebsocketHandler;
 
     @Override
     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
 
-        registry.addHandler(this.itsWebsocketHandler, "/ws/messages.do")
+        registry.addHandler(this.itsWebsocketHandler, ItsWebSocketConfig.WS_ENDPOINT)
                 //.setAllowedOrigins("*")
                 .setAllowedOriginPatterns("*")
                 .withSockJS()
                 //.setSessionCookieNeeded(false)
         ;  // sockjs
 
-        registry.addHandler(this.itsWebsocketHandler, "/ws/messages.do")
+        registry.addHandler(this.itsWebsocketHandler, ItsWebSocketConfig.WS_ENDPOINT)
                 .setAllowedOriginPatterns("*")
                 //.setAllowedOrigins("*")
         ; // 그냥 websocket 지원

+ 49 - 4
src/main/java/com/its/pis/websocket/ItsWebSocketHandler.java

@@ -1,5 +1,8 @@
 package com.its.pis.websocket;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.its.pis.websocket.C2F.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,9 +15,11 @@ import java.util.Map;
 
 @Slf4j
 @Controller
-@RequestMapping("/ws/messages.do")
+@RequestMapping(ItsWebSocketConfig.WS_ENDPOINT)
 public class ItsWebSocketHandler extends TextWebSocketHandler {
 
+    private ObjectMapper mapper;
+
     public ItsWebSocketHandler() {
 
         Runtime.getRuntime().addShutdownHook(new Thread(() -> {
@@ -24,13 +29,18 @@ public class ItsWebSocketHandler extends TextWebSocketHandler {
             }
         }));
 
-        log.info("WebsocketHandler() START");
+        this.mapper = new ObjectMapper();
+
+        log.info("ItsWebSocketHandler() START");
     }
 
     @Override
     public void afterConnectionEstablished(WebSocketSession session) throws Exception {
         // 클라이언트가 연결되었을때 실행
+        log.info("afterConnectionEstablished: {}, {}, {}, {}", session.getBinaryMessageSizeLimit(), session.getTextMessageSizeLimit(), session.getRemoteAddress().getHostString(), session.getAcceptedProtocol());
         log.info("afterConnectionEstablished: " + session.getRemoteAddress() + ",  URI: " + session.getUri() + ", UUID: " + session.getId());
+        session.setBinaryMessageSizeLimit(1*1024*1024);
+        session.setTextMessageSizeLimit(1*1024*1024);
         super.afterConnectionEstablished(session);
 
         ItsWebSocketSession vo = new ItsWebSocketSession(this, session);
@@ -40,7 +50,8 @@ public class ItsWebSocketHandler extends TextWebSocketHandler {
     //클라이언트가 웹소켓 서버로 메시지를 전송했을 때 실행
     @Override
     protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
-        log.info("handleTextMessage: " + session.getRemoteAddress() + ",  Uri[" + session.getUri() + "], UUID[" + session.getId() + "], message[" + message.getPayload() + "]");
+        log.info("handleTextMessage: {}, {}, {}, {}", session.getBinaryMessageSizeLimit(), session.getTextMessageSizeLimit(), session.getRemoteAddress().getHostString(), session.getAcceptedProtocol());
+        log.info("handleTextMessage: " + session.getRemoteAddress() + ",  Uri[" + session.getUri() + "], UUID[" + session.getId() + "]");//, message[" + message.getPayload() + "]");
         /*List<String> requests = ItsUtils.split(message.getPayload(), ":");
         if (requests.size() != 2) {
             log.error("Request data parsing error: {}", requests);
@@ -48,13 +59,47 @@ public class ItsWebSocketHandler extends TextWebSocketHandler {
             return;
         }
 */
+
+        //C2FMessage<C2FMessagePayload> c2fMessage = this.mapper.readValue(message.getPayload(), C2FMessage.class);
+        C2FMessage<C2FMessagePayload> c2fMessage = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<C2FMessagePayload>>(){});
+        log.error("{}", c2fMessage);
+
+        try {
+            String eventName = c2fMessage.getData().getPayload().getEvent_name();
+            if ("prk_plce_sttus_info".equals(eventName)) {
+                C2FMessage<PrkPlceSttusInfo> sttusInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceSttusInfo>>(){});
+                log.error("{}", this.mapper.writeValueAsString(sttusInfo));
+            } else if ("prk_plce_opr_info".equals(eventName)) {
+                C2FMessage<PrkPlceOprInfo> oprInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceOprInfo>>(){});
+                //PrkPlceOprInfo oprInfo = (PrkPlceOprInfo)c2fMessage.getData().getPayload();
+                log.error("{}", this.mapper.writeValueAsString(oprInfo));
+            } else if ("prk_plce_rl_time_info".equals(eventName)) {
+                C2FMessage<PrkPlceRlTimeResponseInfo> rlTimeInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceRlTimeResponseInfo>>(){});
+                //PrkPlceRlTimeInfo rlTimeInfo = (PrkPlceRlTimeInfo)c2fMessage.getData().getPayload();
+                log.error("{}", this.mapper.writeValueAsString(rlTimeInfo));
+            } else if ("prk_plce_reservation_response_info".equals(eventName)) {
+                C2FMessage<PrkPlceReservationResponseInfo> reservationInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceReservationResponseInfo>>(){});
+                //PrkPlceReservationResponseInfo reservationInfo = (PrkPlceReservationResponseInfo)c2fMessage.getData().getPayload();
+                log.error("{}", this.mapper.writeValueAsString(reservationInfo));
+            } else if ("prk_plce_vhcl_location_response_info".equals(eventName)) {
+                C2FMessage<PrkPlceVhclLocationResponseInfo> locationInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceVhclLocationResponseInfo>>(){});
+                //PrkPlceVhclLocationResponseInfo locationInfo = (PrkPlceVhclLocationResponseInfo)c2fMessage.getData().getPayload();
+                log.error("{}", this.mapper.writeValueAsString(locationInfo));
+            } else {
+                log.error("Unknown event name: {}", eventName);
+                log.error("Payload: {}", message.getPayload());
+            }
+        } catch(NullPointerException e) {
+            log.error("Payload data null. {}", message.getPayload());
+        }
+
         ItsWebSocketSession sessionClient = ItsWebSocketSessionManager.getInstance().getSession(session);
         if (sessionClient == null) {
             log.error("Request session not found: {}", session);
             session.close();
             return;
         }
-        log.info("Payload: {}", message.getPayload());
+        //log.info("Payload: {}", message.getPayload());
     }
 
     //클라이언트 연결을 끊었을 때 실행

+ 9 - 10
src/main/resources/application.yml

@@ -23,7 +23,7 @@ application:
     listen-port: 9901
 
 server:
-  port: 9871
+  port: 9876
   shutdown: graceful
   error:
     whitelabel:
@@ -50,7 +50,7 @@ spring:
       auto-commit: true
       connection-test-query: SELECT 1 FROM DUAL
       minimum-idle: 10
-      maximum-pool-size: 50
+      //maximum-pool-size: 50
       pool-name: pool-pis-comm-server
 
 ---
@@ -62,11 +62,11 @@ spring:
     hikari:
       driver-class-name: com.tmax.tibero.jdbc.TbDriver
       jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
-      username: yiits
-      password: yiits
+      username: gmutis
+      password: gmutis
       minimumIdle: 5
       maximumIdle: 10
-      maximumPoolSize: 20
+      //maximumPoolSize: 20
       idleTimeout: 30000
       connectTimeout: 10000
 
@@ -78,13 +78,12 @@ spring:
   datasource:
     hikari:
       driver-class-name: com.tmax.tibero.jdbc.TbDriver
-      #jdbc-url: jdbc:tibero:thin:@172.16.11.52:8800:new_yiitsdb
-      jdbc-url: jdbc:tibero:thin:@(DESCRIPTION=(FAILOVER=ON)(LOAD_BALANCE=ON)(ADDRESS_LIST=(ADDRESS=(HOST=172.16.11.52)(PORT=8800))(ADDRESS=(HOST=172.16.11.62)(PORT=8800)))(DATABASE_NAME=new_yiitsdb))
-      username: yiits
-      password: yiits
+      jdbc-url: jdbc:tibero:thin:@100.100.10.10:8629:UTIS
+      username: itsdev
+      password: itsdev
       minimumIdle: 5
       maximumIdle: 10
-      maximumPoolSize: 20
+      //maximumPoolSize: 20
       idleTimeout: 30000
       connectTimeout: 10000
 

+ 1 - 1
src/main/resources/logback-spring.xml

@@ -3,7 +3,7 @@
     <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
 
     <property name="APP_CLASS_PATH"  value="com.its.pis"/>
-    <property name="PROJECT_PREFIX"  value="vds"/>
+    <property name="PROJECT_PREFIX"  value="pis"/>
     <property name="PROJECT_NAME"    value="${PROJECT_PREFIX}-comm-server"/>
     <property name="ROOT_LOG_LEVEL"  value="INFO"/>
     <property name="LOG_CHARSET"     value="UTF-8" />

+ 1 - 1
src/main/resources/mybatis/mapper/UnitSystMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.its.vds.dao.mapper.UnitSystMapper">
+<mapper namespace="com.its.pis.dao.mapper.UnitSystMapper">
 
     <select id="selectAll" resultType="com.its.pis.entity.TbUnitSyst">
     <![CDATA[

+ 1 - 1
src/main/resources/mybatis/mapper/VdsCtlrMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.its.vds.dao.mapper.VdsCtlrMapper">
+<mapper namespace="com.its.pis.dao.mapper.VdsCtlrMapper">
 
     <select id="selectAll" resultType="com.its.pis.entity.TbVdsCtlr">
     <![CDATA[

+ 1 - 1
src/main/resources/mybatis/mapper/VdsDtctMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.its.vds.dao.mapper.VdsDtctMapper">
+<mapper namespace="com.its.pis.dao.mapper.VdsDtctMapper">
 
     <select id="selectAll" resultType="com.its.pis.entity.TbVdsDtct">
     <![CDATA[

+ 1 - 1
src/main/resources/mybatis/mapper/VdsStatMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
-<mapper namespace="com.its.vds.dao.mapper.VdsStatMapper">
+<mapper namespace="com.its.pis.dao.mapper.VdsStatMapper">
     <!-- 용인시는 5분 통계정보 생성하지 않음  -->
 <!--    <insert id="CRT_TB_VDS_DTCT_HS" parameterType="com.its.pis.vo.voStatisticsTime">-->
 <!--    <![CDATA[-->

+ 7 - 244
src/test/java/com/its/app/PisCommServerApplicationTests.java

@@ -1,261 +1,24 @@
 package com.its.app;
 
-import com.google.common.primitives.Bytes;
-import com.its.app.utils.BcdConverter;
-import com.its.app.utils.SysUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.its.pis.PisCommServerApplication;
-import com.its.pis.entity.TbVdsCtlr;
-import com.its.pis.global.AppRepository;
-import com.its.pis.xnettcp.vds.process.VdsData;
-import com.its.pis.xnettcp.vds.process.VdsDataProcess;
-import com.its.pis.xnettcp.vds.protocol.*;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
 @Slf4j
 @SpringBootTest(classes = PisCommServerApplication.class)
 public class PisCommServerApplicationTests {
 
+    private ObjectMapper mapper;
     @Test
     void test1() {
-        byte[] sysdate = new byte[7];
-        sysdate[0] = (byte)(('2' - '0') << 4 | ('0' - '0'));
-        sysdate[1] = (byte)(('2' - '0') << 4 | ('2' - '0'));
-        sysdate[2] = (byte)(('0' - '0') << 4 | ('7' - '0'));
-        sysdate[3] = (byte)(('0' - '0') << 4 | ('8' - '0'));
-        sysdate[4] = (byte)(('1' - '0') << 4 | ('2' - '0'));
-        sysdate[5] = (byte)(('3' - '0') << 4 | ('4' - '0'));
-        sysdate[6] = (byte)(('5' - '0') << 4 | ('6' - '0'));
-
-        String bcdSysdate = BcdConverter.bcdToString(sysdate);
-        log.error("bcdSysdate: {}", bcdSysdate);
-
-        String now = SysUtils.getSysTime();
-        log.error("-------now: {}", now);
-        byte[] result = BcdConverter.stringToBcd(now);
-        log.error("----result: {}, {} Bytes", SysUtils.byteArrayToHex(result), result.length);
-        String res = BcdConverter.bcdToString(result);
-        log.error("-------res: {}", res);
-
-        String now1 = "1234567890123";
-        log.error("------now1: {}", now1);
-        byte[] result1 = BcdConverter.stringToBcd(now1);
-        log.error("---result: {}, {} Bytes", SysUtils.byteArrayToHex(result1), result1.length);
-        String res1 = BcdConverter.bcdToString(result1);
-        log.error("------res: {}", res1);
-    }
-    @Test
-    void Test2() {
-        int readableBytes = 23;
-        byte[] recvBytes = new byte[readableBytes];
-        recvBytes[ 0] = (byte)0x10;
-        recvBytes[ 1] = (byte)0x02;
-        recvBytes[ 2] = (byte)0x10;
-        recvBytes[ 3] = (byte)0x10;
-        recvBytes[ 4] = (byte)0x00;
-        recvBytes[ 5] = (byte)0x14;
-        recvBytes[ 6] = (byte)0x01;
-        recvBytes[ 7] = (byte)0x01;
-        recvBytes[ 8] = (byte)0x10;
-        recvBytes[ 9] = (byte)0x03;
-        recvBytes[10] = (byte)0x54;
-        recvBytes[11] = (byte)0x80;
-        recvBytes[12] = (byte)0x10;
-        recvBytes[13] = (byte)0x02;
-        recvBytes[14] = (byte)0x00;
-        recvBytes[15] = (byte)0x00;
-        recvBytes[16] = (byte)0x00;
-        recvBytes[17] = (byte)0x14;
-        recvBytes[18] = (byte)0x01;
-        recvBytes[19] = (byte)0x01;
-        recvBytes[20] = (byte)0x10;
-        recvBytes[21] = (byte)0x03;
-        recvBytes[22] = (byte)0x54;
-        //recvBytes[23] = (byte)0x80;
-
-        byte[] packets = new byte[readableBytes];
-
-        int readIdx = 0;
-        int msgSize = 0;   // 순수 데이터 사이즈
-        int totalMsgSize = 0;
-        boolean foundDle = false;
-        boolean remainPacket = false;
-        String ipAddress = "0.0.0.0";
-        log.error("recvBytes: {}", SysUtils.byteArrayToHex(recvBytes));
-
-        while (true) {
-            if (VdsProtocol.MIN_PACKET_SIZE > (readableBytes-totalMsgSize)) {
-                break;
-            }
-
-            msgSize = 0;
-            foundDle = false;
-            log.error("xxxxxxxxxxxxx: {}, {}, {}, {}", readIdx, readableBytes-totalMsgSize, totalMsgSize, readableBytes);
-            for (readIdx = totalMsgSize; readIdx < readableBytes; readIdx++) {
-                byte data = recvBytes[readIdx];
-                if (foundDle) {
-                    foundDle = false;
-                    if (data == VdsProtocol.vds_DLE) {
-                        // Skip Data
-                        log.warn("RECV_0: [{}]. ReadableBytes: {} Bytes, ReadIndex: {}, DLE Stuffing Data Recv.", ipAddress, readableBytes, readIdx);
-                    } else if (data == VdsProtocol.vds_STX) {
-                        packets[msgSize++] = data;
-                    } else if (data == VdsProtocol.vds_ETX) {
-                        // 이전데이터가 DLE 이고 현재 데이터가 ETX 이면 패킷의 끝임.
-                        // 다음 2바이트는 CRC 데이터임, 남아 있는 데이터가 CRC 2바이트를 포함한 크기보다 작으면
-                        // 하나의 패킷을 완전히 수신하지 못한 것임
-                        log.error("LENGTH: {}, {}", (readIdx + 2), (readableBytes-totalMsgSize));
-                        if ((readIdx + 3) > (readableBytes)) {
-                            // 하나의 패킷을 읽지 못함
-                            log.warn("RECV_0: [{}]. ReadableBytes: {} Bytes, ReadIndex: {}, DLE Data Remain.", ipAddress, readableBytes, readIdx);
-                            remainPacket = true;
-                            break;
-                        }
-                        packets[msgSize++] = data;
-                        packets[msgSize++] = recvBytes[readIdx+1];  // CRC1
-                        packets[msgSize++] = recvBytes[readIdx+2];  // CRC2
-
-                        // 하나의 패킷을 읽었음 ***************
-                        totalMsgSize += msgSize;
-                        log.error("OnePacket: {} Bytes, {} Bytes, {}", msgSize, totalMsgSize, SysUtils.byteArrayToHex(packets));
-
-                        VdsResFramePacket packet = new VdsResFramePacket(null, packets, msgSize);
-                        log.error("OnePacket: {} Bytes, {}", packet.getByteBuffer().array().length, SysUtils.byteArrayToHex(packet.getByteBuffer().array()));
-                        break;
-                    } else {
-                        // DLE 다음에 와야할 데이터가 들어오지 않았다. 패킷에 오류가 발생함.
-                        log.warn("RECV_0: [{}]. ReadableBytes: {} Bytes, ReadIndex: {}, DLE Next Data Recv Error.", ipAddress, readableBytes, readIdx);
-                    }
-                } else {
-                    packets[msgSize++] = data;
-                    if (data == VdsProtocol.vds_DLE) {
-                        foundDle = true;
-                    }
-                }
-            }
-            log.error("yyyyyyyyyyyyyyyyyyy: {}, {}, {}", totalMsgSize, readableBytes, remainPacket);
-            if (totalMsgSize >= readableBytes || remainPacket) {
-                break;
-            }
-        }
-    }
-
-    @Test
-    void Test3() {
-        int readableBytes = 10;
-        byte[] recvBytes = new byte[readableBytes];
-        recvBytes[ 0] = (byte)0x10;
-        recvBytes[ 1] = (byte)0x02;
-        recvBytes[ 2] = (byte)0x10;
-        recvBytes[ 3] = (byte)0x10;
-        recvBytes[ 4] = (byte)0x00;
-        recvBytes[ 5] = (byte)0x14;
-        recvBytes[ 6] = (byte)0x01;
-        recvBytes[ 7] = (byte)0x01;
-        recvBytes[ 8] = (byte)0x10;
-        recvBytes[ 9] = (byte)0x03;
-        log.error("{}", SysUtils.byteArrayToHex(recvBytes));
-        List<Byte> list = new ArrayList<Byte>();
-        for (byte b : recvBytes) {
-            list.add(b);
-        }
-
-        log.error("LENGTH: {}", list.size());
-
-        byte[] arr = Bytes.toArray(list);
-        log.error("{}", SysUtils.byteArrayToHex(arr));
-    }
-
-    @Test
-    void Test4() {
-        //10 02 00 00 00 1C 04 10 03 03 09
-        byte[] packet = { (byte)0x10, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x1C, (byte)0x04, (byte)0x10, (byte)0x03, (byte)0x00, (byte)0x00};
-        short crc = VdsProtocol.getCRC16ARC(packet, 2, packet.length - 6);
-
-        // 제어기 통과 데이터 요청
-        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
-            TbVdsCtlr obj = e.getValue();
-            ByteBuffer sendBuffer = obj.getReqData().getByteBuffer();
-            //log.error("{}: {}", obj.getVDS_CTLR_LOCAL_NO(), SysUtils.byteArrayToHex(sendBuffer.array()));
-        }
-
-        // 제어기 SYC
-        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
-            TbVdsCtlr obj = e.getValue();
-            ByteBuffer sendBuffer = obj.getReqSynchronize().getByteBuffer();
-            //log.error("{}: {}", obj.getVDS_CTLR_LOCAL_NO(), SysUtils.byteArrayToHex(sendBuffer.array()));
-        }
-
-        // 제어기 온도 데이터 요청
-        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
-            TbVdsCtlr obj = e.getValue();
-            ByteBuffer sendBuffer = obj.getReqTemperature().getByteBuffer();
-            //log.error("{}: {}", obj.getVDS_CTLR_LOCAL_NO(), SysUtils.byteArrayToHex(sendBuffer.array()));
-        }
-
-        // 제어기 상태 RTC 변경
-        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
-            TbVdsCtlr obj = e.getValue();
-            VdsReqRTC reqRTC = new VdsReqRTC((short)obj.getGROUP_NO(), (short)obj.getVDS_CTLR_LOCAL_NO());
-            reqRTC.makeCRC();
-            ByteBuffer sendBuffer = reqRTC.getByteBuffer();
-            //log.error("{}: {}", obj.getVDS_CTLR_LOCAL_NO(), SysUtils.byteArrayToHex(sendBuffer.array()));
-        }
-
-        // 화상 이미지 요청
-        for (int ii = 0; ii < 13; ii++) {
-            VdsReqImage reqImage = new VdsReqImage((short)0, (short)2);
-            reqImage.setCameraNo(1);
-            reqImage.setFrameNo(ii);
-            reqImage.makeCRC();
-            ByteBuffer sendBuffer = reqImage.getByteBuffer();
-            //log.error("{}, {}: {}", 2, ii, SysUtils.byteArrayToHex(sendBuffer.array()));
-        }
-
-        // 제어기 RESET
-        for (Map.Entry<String, TbVdsCtlr> e : AppRepository.getInstance().getCtlrMap().entrySet()) {
-            TbVdsCtlr obj = e.getValue();
-            VdsReqReset reqReset = new VdsReqReset((short)obj.getGROUP_NO(), (short)obj.getVDS_CTLR_LOCAL_NO());
-            reqReset.makeCRC();
-            ByteBuffer sendBuffer = reqReset.getByteBuffer();
-            log.error("{}: {}", obj.getVDS_CTLR_LOCAL_NO(), SysUtils.byteArrayToHex(sendBuffer.array()));
-        }
-    }
-
-    @Test
-    void Test5() {
-        // 온도 수신
-        byte[] recvBytes = { (byte)0x10, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x12, (byte)0x1E,
-                (byte)0x8A, (byte)0x40, (byte)0x21, (byte)0x00, (byte)0xDF, (byte)0x10, (byte)0x03, (byte)0xF2, (byte)0xB9};
-        //(byte)0x8A, (byte)0x00, (byte)0x21, (byte)0x00, (byte)0xDF, (byte)0x10, (byte)0x03, (byte)0xF2, (byte)0xB9};
-        VdsDataProcess vdsDataProcess = (VdsDataProcess)AppUtils.getBean(VdsDataProcess.class);
-        TbVdsCtlr obj = AppRepository.getInstance().getCtlrMap().get("00000018");
-        VdsResFramePacket packet = new VdsResFramePacket(obj, recvBytes, recvBytes.length);
-        vdsDataProcess.add(new VdsData(obj, obj.getVDS_CTLR_IP(), null, packet));
-
-        VdsProtocol.sleep(6000);
-    }
-    //[2022-07-12 09:59:44] [22번 제어기 교통정보응답 수신] 10 02 00 00 00 16 04 88 40 01 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 27 1A 61 3E 03 05 46 5A 08 32 0F 5D 40 04 03 29 47 06 35 0B 11 3F 03 02 25 42 10 03 E9 54
-
-    @Test
-    void Test6() {
-        // 교통정보응답수신(22번 제어기)
-        //byte[] recvBytes = { (byte)0x10, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x16, (byte)0x04, (byte)0x88, (byte)0x40, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0B, (byte)0x27, (byte)0x1A, (byte)0x61, (byte)0x3E, (byte)0x03, (byte)0x05, (byte)0x46, (byte)0x5A, (byte)0x08, (byte)0x32, (byte)0x0F, (byte)0x5D, (byte)0x40, (byte)0x04, (byte)0x03, (byte)0x29, (byte)0x47, (byte)0x06, (byte)0x35, (byte)0x0B, (byte)0x11, (byte)0x3F, (byte)0x03, (byte)0x02, (byte)0x25, (byte)0x42, (byte)0x10, (byte)0x03, (byte)0xE9, (byte)0x54};
-        // 교통정보응답수신(15번 제어기)
-        byte[] recvBytes = {(byte)0x10, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0F, (byte)0x04, (byte)0x8A, (byte)0x40, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x07, (byte)0x5E, (byte)0x05, (byte)0x48, (byte)0x2E, (byte)0x04, (byte)0x01, (byte)0x0E, (byte)0x26, (byte)0x0C, (byte)0x4B, (byte)0x0E, (byte)0x02, (byte)0x36, (byte)0x02, (byte)0x02, (byte)0x5D, (byte)0x2F, (byte)0x05, (byte)0x45, (byte)0x07, (byte)0x03, (byte)0x3C, (byte)0x06, (byte)0x01, (byte)0x2D, (byte)0x33, (byte)0x02, (byte)0x47, (byte)0x04, (byte)0x16, (byte)0x69, (byte)0x0A, (byte)0x00, (byte)0x62, (byte)0x32, (byte)0x07, (byte)0x40, (byte)0x0C, (byte)0x57, (byte)0x44, (byte)0x04, (byte)0x02, (byte)0x30, (byte)0x37, (byte)0x03, (byte)0x3C, (byte)0x06, (byte)0x41, (byte)0x5B, (byte)0x07, (byte)0x01, (byte)0x33, (byte)0x3B, (byte)0x10, (byte)0x03, (byte)0xB5, (byte)0x2C};
-        //(byte)0x8A, (byte)0x00, (byte)0x21, (byte)0x00, (byte)0xDF, (byte)0x10, (byte)0x03, (byte)0xF2, (byte)0xB9};
-        VdsDataProcess vdsDataProcess = (VdsDataProcess)AppUtils.getBean(VdsDataProcess.class);
-        TbVdsCtlr obj = AppRepository.getInstance().getCtlrMap().get("00000015");
-        VdsResFramePacket packet = new VdsResFramePacket(obj, recvBytes, recvBytes.length);
-        vdsDataProcess.add(new VdsData(obj, obj.getVDS_CTLR_IP(), null, packet));
+        // Class to Json String
+        this.mapper = new ObjectMapper();
+        //String message = this.mapper.writeValueAsString(bisMessage);
 
-        VdsProtocol.sleep(6000);
+        // Json String to Class
+        //CpuNodeStatusDTO status = this.mapper.readValue(message, CpuNodeStatusDTO.class);
     }
 
 }