shjung hai 1 ano
pai
achega
b82a761d45

+ 46 - 0
conf/application.yml

@@ -0,0 +1,46 @@
+application:
+  listen-port: 3001
+  ftp-home-dir: C:\DRIVE_E\ANDONG_VMS_FTP
+  load-db: true
+  check-new-form: false
+
+communication:
+  listen-port: 30200
+  dump-recv: true
+  dump-send: true
+  subscription-status: true
+  subscription-status-cycle: 30
+  esb-server: 192.168.20.99
+  esb-port: 9904
+
+server:
+  port: 8904
+
+spring:
+  profiles:
+    active: dev
+
+---
+spring:
+  config:
+    activate:
+      on-profile: dev
+  datasource:
+    hikari:
+      driver-class-name: com.tmax.tibero.jdbc.TbDriver
+      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
+      username: ENC(D/mtjX68HkE=)
+      password: ENC(D/mtjX68HkE=)
+
+---
+spring:
+  config:
+    activate:
+      on-profile: prod
+  datasource:
+    hikari:
+      driver-class-name: com.tmax.tibero.jdbc.TbDriver
+      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
+      username: ENC(D/mtjX68HkE=)
+      password: ENC(D/mtjX68HkE=)
+

+ 1 - 1
conf/debug.properties

@@ -1,5 +1,5 @@
 #system debug setting configuration...
-#Tue Aug 22 17:18:21 KST 2023
+#Tue Sep 12 17:14:57 KST 2023
 packet-info=1001
 packet-dump=1001
 system-debug=true

+ 0 - 212
conf/vms-comm-server-logback.xml

@@ -1,212 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration scan="true" scanPeriod="60 seconds">
-    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
-
-    <property name="PROJECT_NAME"    value="vms-comm-server"/>
-    <property name="ROOT_LOG_LEVEL"  value="INFO"/>
-    <property name="LOG_CHARSET"     value="UTF-8" />
-    <property name="LOG_PATH"        value="${user.dir}/logs/"/>
-    <property name="LOG_BACKUP_PATH" value="${user.dir}/logs/backup/"/>
-
-    <property name="LOG_FILE_NAME"             value="${PROJECT_NAME}.log"/>
-    <property name="LOG_FILE_NAME_ERROR"       value="${PROJECT_NAME}.err.log"/>
-    <property name="LOG_FILE_NAME_PATTERN"     value="%d{yyyyMMdd}_%i.log.gz"/>
-    <property name="LOG_FILE_NAME_PACKET"      value="vms-packet"/>
-    <property name="LOG_FILE_NAME_SESSION"     value="vms-session.log"/>
-    <property name="LOG_FILE_NAME_CENTER_COMM" value="vms-center-comm.log"/>
-    <property name="LOG_FILE_NAME_SQL"         value="vms-sql.log"/>
-    <property name="LOG_FILE_NAME_SCHEDULE"    value="vms-schedule.log"/>
-    <property name="LOG_FILE_NAME_STATISTICS"  value="vms-statistics.log"/>
-
-    <property name="MAX_FILESIZE" value="10MB"/>
-    <property name="MAX_HISTORY"  value="30"/>
-    <property name="LOG_PATTERN_FILE"        value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_ERROR"       value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%30t] [%5level] %42logger{35}.%-20M ${PID:-} %n%msg%n"/>
-    <property name="LOG_PATTERN_PACKET"      value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_SESSION"     value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_CENTER_COMM" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_SQL"         value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_SCHEDULE"    value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_STATISTICS"  value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <!--<property name="LOG_PATTERN_CONSOLE"     value="%d{HH:mm:ss.SSS} [%30thread] %highlight([%5level]) %cyan(%42logger{35}.%-20M)${PID:-} : %msg%n"/>
-    <property name="LOG_PATTERN_FILE"        value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%30t] [%5level] %42logger{35}.%-20M ${PID:-} : %msg%n"/>
-    <property name="LOG_PATTERN_ERROR"       value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%30t] [%5level] %42logger{35}.%-20M ${PID:-} : %msg%n"/>
-    <property name="LOG_PATTERN_PACKET"      value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %msg%n"/>
-    <property name="LOG_PATTERN_SESSION"     value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
-    <property name="LOG_PATTERN_CENTER_COMM" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%30t] [%5level] %42logger{35}.%-20M ${PID:-} : %msg%n"/>
-    <property name="LOG_PATTERN_SQL"         value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %msg%n"/>
-    <property name="LOG_PATTERN_SCHEDULE"    value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%30thread] %msg%n"/>
-    <property name="LOG_PATTERN_CONSOLE"     value="[%d{HH:mm:ss.SSS}] %highlight([%5level]) %highlight(${PID:-}): %cyan(%msg) [%class{0}.%method] [%thread] %n"/>
-    -->
-    <property name="LOG_PATTERN_CONSOLE" value="[%d{HH:mm:ss.SSS}] %highlight([%5level]) %highlight(${PID:-}): %cyan(%msg) %n"/>
-
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <withJansi>true</withJansi>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <pattern>${LOG_PATTERN_CONSOLE}</pattern>
-        </encoder>
-    </appender>
-
-    <appender name="FILE_PACKET" class="ch.qos.logback.classic.sift.SiftingAppender">
-        <discriminator>
-            <key>id</key>
-            <defaultValue>${LOG_FILE_NAME_PACKET}</defaultValue>
-        </discriminator>
-        <sift>
-            <appender name="FILE-${id}" class="ch.qos.logback.core.rolling.RollingFileAppender">
-                <file>${LOG_PATH}packet/${id}.log</file>
-                <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-                    <charset>${LOG_CHARSET}</charset>
-                    <Pattern>${LOG_PATTERN_PACKET}</Pattern>
-                </encoder>
-
-                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-                    <FileNamePattern>${LOG_BACKUP_PATH}packet/${id}.${LOG_FILE_NAME_PATTERN}</FileNamePattern>
-                    <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-                    <maxHistory>${MAX_HISTORY}</maxHistory>
-                </rollingPolicy>
-            </appender>
-        </sift>
-    </appender>
-
-    <appender name="FILE_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${LOG_PATH}${LOG_FILE_NAME}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_FILE}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>error</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
-        <file>${LOG_PATH}${LOG_FILE_NAME_ERROR}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_ERROR}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME_ERROR}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <root level="INFO">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE_LOG"/>
-        <appender-ref ref="FILE_ERROR"/>
-    </root>
-
-    <logger name="com.its.app.xnettcp" level="DEBUG" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE_PACKET"/>
-        <appender-ref ref="FILE_ERROR"/>
-    </logger>
-
-    <appender name="CENTER_COMM" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${LOG_PATH}${LOG_FILE_NAME_CENTER_COMM}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_CENTER_COMM}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}CenterComm/${LOG_FILE_NAME_CENTER_COMM}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <logger name="com.its.app.xnetudp" level="DEBUG" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="CENTER_COMM"/>
-        <appender-ref ref="FILE_ERROR"/>
-    </logger>
-
-    <appender name="FILE_SESSION" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${LOG_PATH}${LOG_FILE_NAME_SESSION}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_FILE}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME_SESSION}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <logger name="com.its.app.xnettcp.handler" level="DEBUG" additivity="true">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE_SESSION"/>
-        <appender-ref ref="FILE_ERROR"/>
-    </logger>
-
-    <appender name="FILE_STATISTICS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${LOG_PATH}${LOG_FILE_NAME_STATISTICS}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_STATISTICS}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}Schedule/${LOG_FILE_NAME_STATISTICS}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <logger name="com.its.vms.service.StatisticsServices" level="DEBUG" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE_STATISTICS"/>
-        <appender-ref ref="FILE_ERROR"/>
-    </logger>
-
-    <appender name="FILE_SCHEDULE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${LOG_PATH}${LOG_FILE_NAME_SCHEDULE}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_SCHEDULE}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME_SCHEDULE}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <logger name="com.its.app.scheduler" level="DEBUG" additivity="false">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE_SCHEDULE"/>
-        <appender-ref ref="FILE_ERROR"/>
-    </logger>
-
-    <appender name="FILE_SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>${LOG_PATH}${LOG_FILE_NAME_SQL}</file>
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>${LOG_CHARSET}</charset>
-            <pattern>${LOG_PATTERN_SQL}</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${LOG_BACKUP_PATH}${LOG_FILE_NAME_SQL}.${LOG_FILE_NAME_PATTERN}</fileNamePattern>
-            <maxFileSize>${MAX_FILESIZE}</maxFileSize>
-            <maxHistory>${MAX_HISTORY}</maxHistory>
-        </rollingPolicy>
-    </appender>
-
-    <logger name="jdbc"                level="OFF"   additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-    <logger name="jdbc.sqlonly"        level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-    <logger name="jdbc.sqltiming"      level="DEBUG" additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-    <logger name="jdbc.audit"          level="OFF"   additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-    <logger name="jdbc.resultset"      level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-    <logger name="jdbc.resultsettable" level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-    <logger name="jdbc.connection"     level="INFO"  additivity="false"> <appender-ref ref="FILE_SQL" /> <appender-ref ref="FILE_ERROR"/> </logger>
-
-</configuration>

+ 0 - 72
conf/vms-comm-server.properties

@@ -1,72 +0,0 @@
-#[logging]
-logging.config=conf//vms-comm-server-logback.xml
-
-#[Application properties]
-process.id=vms01
-process.name=vms Communication Server
-
-#[server config]
-server.user.id=1
-server.user.pswd=1
-server.db.threads=20
-server.data.threads=20
-server.task.statistics=true
-
-#[server <---> operator]
-server.center.bind.port=4602
-server.center.dump=false
-
-#[server <---> controller]
-server.tcp.bind.port=355
-server.tcp.recv.dump=false
-server.tcp.send.dump=false
-server.tcp.allIdleTime=60
-
-#[vms]
-vms.server.authuser=test1
-vms.server.authpassword=test1
-vms.server.senderText=vms Center Unit
-
-#OBU ID 암호화해제 등록요청
-vms.publication.nonCryptObu=true
-#최초 안테나 활성화시 안테나 갯수
-vms.publication.antenna=1
-#최초 상태정보 요청등록시 true
-vms.subscription.status=true
-#최초 교통정보 요청등록시 true
-vms.subscription.traffic=true
-
-#구간가공정보 파라미터
-vms.filtering.minSpeed=3
-vms.filtering.maxSpeed=140
-vms.filtering.historyMinute=60
-
-
-#[Database properties]
-#spring.datasource.hikari.driver-class-name=com.tmax.tibero.jdbc.TbDriver
-#spring.datasource.hikari.jdbc-url=jdbc:tibero:thin:@192.168.20.29:8629:tibero
-#spring.datasource.hikari.username=gmutis
-#spring.datasource.hikari.password=gmutis
-
-#spring.datasource.hikari.driver-class-name=oracle.jdbc.OracleDriver
-#spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@127.0.0.1:1521:HANTE
-spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
-spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:HANTE
-spring.datasource.hikari.username=gmutis
-spring.datasource.hikari.password=gmutis
-
-spring.datasource.hikari.jpool-name=hikari-cp
-spring.datasource.hikari.jmaximum-pool-size=30
-spring.datasource.hikari.jminimum-idle=2
-
-# FOR WEB UI: START
-server.shutdown=graceful
-server.port=80
-server.error.whitelabel.enabled=true
-server.error.include-exception=false
-server.error.include-stacktrace=never
-
-spring.mvc.view.prefix=/WEB-INF/jsp/
-spring.mvc.view.suffix=.jsp
-server.servlet.session.timeout=300
-# FOR WEB UI: END

+ 6 - 0
pom.xml

@@ -184,6 +184,12 @@
             <version>1.18.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.ulisesbocchio</groupId>
+            <artifactId>jasypt-spring-boot-starter</artifactId>
+            <version>3.0.4</version>
+        </dependency>
+
         <!-- FOR WEB UI: START -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 63 - 0
src/main/java/com/its/vms/config/JasyptConfig.java

@@ -0,0 +1,63 @@
+package com.its.vms.config;
+
+import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
+import org.jasypt.encryption.StringEncryptor;
+import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
+import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
+import org.jasypt.salt.StringFixedSaltGenerator;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableEncryptableProperties
+public class JasyptConfig {
+
+    @Value("${jasypt.encryptor.password:asdkjfaslkjflkajslfjkajlkf}")
+    private final String encKey = "asdkjfaslkjflkajslfjkajlkf";
+
+    @Bean("jasyptStringEncryptor")
+    public StringEncryptor stringEncryptor() {
+
+        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
+        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
+
+        // ==> SimpleStringPBEConfig 사용시 아래 3개 반드시 설정해야함
+        config.setPassword(encKey);                                         // 암호화에 사용할 키
+        config.setPoolSize(1);                                              // Pool Size
+        config.setSaltGenerator(new StringFixedSaltGenerator("fixedSalt")); // 고정으로 암호화(Default: Random)
+        //config.setAlgorithm("PBEWithMD5AndTripleDES");
+        //config.setAlgorithm("PBEWithMD5AndDES"); // Jasypt 를 이용한 암호화 알고리즘
+        //config.setProviderName("SunJCE");
+        config.setKeyObtentionIterations("10000");
+        config.setStringOutputType("base64");
+        /*private Boolean proxyPropertySources = false;
+        private String bean = "jasyptStringEncryptor";
+        private String password;
+        private String algorithm = "PBEWithMD5AndDES";
+        private String keyObtentionIterations = "1000";
+        private String poolSize = "1";
+        private String providerName = null;
+        //config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
+        private String saltGeneratorClassname = "org.jasypt.salt.RandomSaltGenerator";
+        private String stringOutputType = "base64";*/
+        encryptor.setConfig(config);
+
+        return encryptor;
+    }
+
+    public String getKey() {
+        return this.encKey;
+    }
+
+    public String encrypt(String string) {
+        StringEncryptor encrypt = stringEncryptor();
+        return encrypt.encrypt(string);
+    }
+
+    public String decrypt(String string) {
+        StringEncryptor decrypt = stringEncryptor();
+        return decrypt.decrypt(string);
+    }
+
+}

+ 2 - 1
src/main/java/com/its/vms/domain/task/VmsCommandTimeoutTask.java

@@ -31,7 +31,8 @@ public class VmsCommandTimeoutTask extends TimerTask {
     }
 
     public short getPacketNmbr() {
-        return this.packet.getPacketNmbr();
+        return (short)(this.packet.getOpCode().getValue() & 0xFF);
+        //return this.packet.getPacketNmbr();
     }
 
     @Override

+ 8 - 7
src/main/java/com/its/vms/dto/TbVmsCtlrDto.java

@@ -324,10 +324,11 @@ public class TbVmsCtlrDto implements Serializable {
         long timeoutSec = 1000L * 5;
         Timer timer = new Timer();
         timer.schedule(cmdTimeoutTask, timeoutSec);
-        this.registeredCommandTimer.put(cmdTimeoutTask.getPacketNmbr(), timer);
-        this.registeredCommand.put(cmdTimeoutTask.getPacketNmbr(), cmdTimeoutTask);
-//        log.info("addRegisteredCommandsTimer: VMS {}, Task {} EA, OpCode {}.",
-//                cmdTimeoutTask.getCtlr().getVmsCtlrNmbr(), this.registeredCommandTimer.size(), cmdTimeoutTask.getPacket().getOpCode());
+        short packetNmbr = (short)(cmdTimeoutTask.getPacket().getOpCode().getValue() & 0xFF);
+        this.registeredCommandTimer.put(packetNmbr, timer);
+        this.registeredCommand.put(packetNmbr, cmdTimeoutTask);
+        log.info("addRegisteredCommandsTimer: VMS {}, Task {} EA, OpCode {}.",
+                cmdTimeoutTask.getCtlr().getVmsCtlrNmbr(), this.registeredCommandTimer.size(), cmdTimeoutTask.getPacket().getOpCode());
     }
 
     /**
@@ -335,7 +336,7 @@ public class TbVmsCtlrDto implements Serializable {
      * @param opCode
      */
     public synchronized void removeRegisteredCommandsTimer(eVmsOpCode opCode) {
-        short packetNmbr = (short)opCode.getValue();
+        short packetNmbr = (short)(opCode.getValue() & 0xFF);
         Timer timer = this.registeredCommandTimer.get(packetNmbr);
         if (timer != null) {
             timer.cancel();
@@ -344,8 +345,8 @@ public class TbVmsCtlrDto implements Serializable {
         VmsCommandTimeoutTask cmdTimeoutTask = this.registeredCommand.get(packetNmbr);
         if (cmdTimeoutTask != null) {
             this.registeredCommand.remove(packetNmbr);
-//            log.info("removeRegisteredCommandsTimer: VMS {}, Task {} EA, OpCode {}.",
-//                    cmdTimeoutTask.getCtlr().getVmsCtlrNmbr(), this.registeredCommandTimer.size(), cmdTimeoutTask.getPacket().getOpCode());
+            log.info("removeRegisteredCommandsTimer: VMS {}, Task {} EA, OpCode {}.",
+                    cmdTimeoutTask.getCtlr().getVmsCtlrNmbr(), this.registeredCommandTimer.size(), cmdTimeoutTask.getPacket().getOpCode());
         }
     }
 

+ 3 - 2
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataProcess.java

@@ -79,10 +79,11 @@ public class TcpServerRecvDataProcess {
                 packet = new VmsDleFramePacket(resFramePacket.getPacket(), resFramePacket.getMsgLen());
             }
 
-            String opCodeValue = String.format("0x%02X", packet.getOpCode());
+            String opCodeValue = String.format("0x%02X", (byte)(packet.getOpCode() & 0xFF));
 
             VmsResponse response = null;
-            eVmsOpCode opCode = eVmsOpCode.getValue(packet.getOpCode());
+            eVmsOpCode opCode = eVmsOpCode.getValue((packet.getOpCode() & 0xFF));
+            log.info("{}, {}", opCodeValue, opCode);
             /**
              * 제어기 명령 타임아웃 타스크 제거
              */

+ 2 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/impl/VmsResStatus.java

@@ -1,5 +1,6 @@
 package com.its.vms.xnettcp.vms.process.response.impl;
 
+import com.its.app.utils.SysUtils;
 import com.its.vms.domain.NET;
 import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
@@ -39,6 +40,7 @@ public class VmsResStatus implements VmsResponse {
     @Override
     public boolean process() {
 
+        log.info("VmsResStatus.process: {}", SysUtils.byteArrayToHex(this.resFramePacket.getBody()));
         // 상태정보 최초 수신시
         if (this.vmsObj.getNetState() == NET.LOGIN_REQ) {
             if (this.vmsObj.getVmsCtlrNmbr() != this.resFramePacket.getHead().getControllerNo() &&

+ 2 - 2
src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsProtocolVersion.java

@@ -6,8 +6,8 @@ import java.util.Map;
 public enum eVmsProtocolVersion {
 
     PROTOCOL_EX_FIGURE ( 0, "0.ExpressHighway Figure"),
-    PROTOCOL_EX_TEXT   ( 1, "0.ExpressHighway Text"),
-    PROTOCOL_ANDONG    ( 2, "0.ANDONG");
+    PROTOCOL_EX_TEXT   ( 1, "1.ExpressHighway Text"),
+    PROTOCOL_ANDONG    ( 2, "2.ANDONG");
 
     private final int value;
     private final String string;

+ 44 - 60
src/main/resources/application.yml

@@ -1,3 +1,41 @@
+spring:
+  application:
+    name: vms-comm-server
+  main:
+    #web-application-type: none
+    log-startup-info: true
+    banner-mode: off
+  mvc:
+    view:
+      prefix: /WEB-INF/jsp/
+      suffix: .jsp
+  config:
+    import: file:${user.dir}/conf/application.yml
+  profiles:
+    include: application
+  datasource:
+    hikari:
+      auto-commit: true
+      connection-test-query: SELECT 1 FROM DUAL
+      minimumIdle: 5
+      maximumIdle: 10
+      #maximumPoolSize: 20
+      idleTimeout: 30000
+      connectTimeout: 10000
+      pool-name: pool-vms-comm-server
+
+server:
+  port: 8904
+  shutdown: graceful
+  error:
+    whitelabel:
+      enabled: true
+    include-exception: false
+    include-stacktrace: never
+  servlet:
+    session:
+      timeout: 300
+
 application:
   id: VMS01
   name: VMS Communication Server
@@ -36,63 +74,9 @@ communication:
   esb-server: 192.168.20.99
   esb-port: 9904
 
-server:
-  port: 8904
-  shutdown: graceful
-  error:
-    whitelabel:
-      enabled: true
-    include-exception: false
-    include-stacktrace: never
-  servlet:
-    session:
-      timeout: 300
-
-spring:
-  application:
-    name: vms-comm-server
-  profiles:
-    active: dev
-  main:
-    #web-application-type: none
-    log-startup-info: true
-    banner-mode: off
-  mvc:
-    view:
-      prefix: /WEB-INF/jsp/
-      suffix: .jsp
-  datasource:
-    hikari:
-      auto-commit: true
-      connection-test-query: SELECT 1 FROM DUAL
-      minimumIdle: 5
-      maximumIdle: 10
-      #maximumPoolSize: 20
-      idleTimeout: 30000
-      connectTimeout: 10000
-      pool-name: pool-vms-comm-server
-
----
-spring:
-  config:
-    activate:
-      on-profile: dev
-  datasource:
-    hikari:
-      driver-class-name: com.tmax.tibero.jdbc.TbDriver
-      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
-      username: adits
-      password: adits
-
----
-spring:
-  config:
-    activate:
-      on-profile: prod
-  datasource:
-    hikari:
-      driver-class-name: com.tmax.tibero.jdbc.TbDriver
-      jdbc-url: jdbc:tibero:thin:@115.91.94.42:8629:tibero
-      username: adits
-      password: adits
-
+jasypt:
+  encryptor:
+    bean: jasyptStringEncryptor
+    property:
+      prefix: ENC(
+      suffix: )

+ 37 - 0
src/test/java/com/its/app/VmsCommServerApplicationTests.java

@@ -9,6 +9,9 @@ import com.its.vms.service.VmsSymbService;
 import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
+import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
+import org.jasypt.salt.StringFixedSaltGenerator;
 import org.junit.jupiter.api.Test;
 
 import java.io.UnsupportedEncodingException;
@@ -18,6 +21,40 @@ import java.nio.ByteBuffer;
 //@SpringBootTest(classes = VmsCommServerApplication.class)
 public class VmsCommServerApplicationTests {
 
+    @Test
+    void jasypt() {
+        String encKey = "asdkjfaslkjflkajslfjkajlkf";
+        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
+        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
+
+        // ==> SimpleStringPBEConfig 사용시 아래 3개 반드시 설정해야함
+        config.setPassword(encKey);                                         // 암호화에 사용할 키
+        config.setPoolSize(1);                                              // Pool Size
+        config.setSaltGenerator(new StringFixedSaltGenerator("fixedSalt")); // 고정으로 암호화(Default: Random)
+        //config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
+        //config.setAlgorithm("PBEWithMD5AndTripleDES");
+        config.setAlgorithm("PBEWithMD5AndDES"); // Jasypt 를 이용한 암호화 알고리즘
+        config.setProviderName("SunJCE");
+        config.setKeyObtentionIterations("10000");
+        config.setStringOutputType("base64");
+        /*private Boolean proxyPropertySources = false;
+        private String bean = "jasyptStringEncryptor";
+        private String password;
+        private String algorithm = "PBEWithMD5AndDES";
+        private String keyObtentionIterations = "1000";
+        private String poolSize = "1";
+        private String providerName = null;
+        //config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
+        private String saltGeneratorClassname = "org.jasypt.salt.RandomSaltGenerator";
+        private String stringOutputType = "base64";*/
+        encryptor.setConfig(config);
+
+        String yiits = encryptor.encrypt("adits");
+        String rutis = encryptor.encrypt("adits");
+        log.info("{}", yiits);
+        log.info("{}", rutis);
+    }
+
     @Test
     void test1() {
         //                 0123 45 67 89 0123