shjung 2 жил өмнө
parent
commit
ad86e80080
45 өөрчлөгдсөн 1226 нэмэгдсэн , 405 устгасан
  1. 3 3
      src/main/java/com/its/vms/VmsCommServerApplication.java
  2. 1 1
      src/main/java/com/its/vms/dto/TbVmsCtlrDto.java
  3. 1 1
      src/main/java/com/its/vms/entity/TbVmsCtlr.java
  4. 0 1
      src/main/java/com/its/vms/process/DbmsDataProcess.java
  5. 13 0
      src/main/java/com/its/vms/scheduler/SchedulerTask.java
  6. 2 2
      src/main/java/com/its/vms/service/VmsManageService.java
  7. 3 1
      src/main/java/com/its/vms/xnettcp/vms/VmsTcpCommServerInitializer.java
  8. 2 7
      src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerDecoder.java
  9. 6 16
      src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerDleStuffingDecoder.java
  10. 17 46
      src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerEncoder.java
  11. 1 1
      src/main/java/com/its/vms/xnettcp/vms/handler/VmsServerIdleStateHandler.java
  12. 7 6
      src/main/java/com/its/vms/xnettcp/vms/handler/VmsServerPacketInboundHandler.java
  13. 0 171
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerDataProcess.java
  14. 2 2
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvData.java
  15. 142 0
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataProcess.java
  16. 2 2
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataTask.java
  17. 11 3
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendData.java
  18. 47 15
      src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendDataProcess.java
  19. 0 26
      src/main/java/com/its/vms/xnettcp/vms/process/response/TerminateResponse.java
  20. 84 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResDisplayDefaultForm.java
  21. 84 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResDisplayModuleStatus.java
  22. 107 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResParameter.java
  23. 76 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResPowerModuleStatus.java
  24. 112 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResStatus.java
  25. 84 0
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResUploadCurrentDisplayForm.java
  26. 3 3
      src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResponse.java
  27. 0 22
      src/main/java/com/its/vms/xnettcp/vms/process/service/UserCommandService.java
  28. 35 16
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsDleFrameHead.java
  29. 66 38
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsDleFramePacket.java
  30. 21 8
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsDleFrameTail.java
  31. 5 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFrameHead.java
  32. 13 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFramePacket.java
  33. 5 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFrameTail.java
  34. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqBlank.java
  35. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqDisplayDefaultForm.java
  36. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqDisplayModuleStatus.java
  37. 4 11
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqFramePacket.java
  38. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqParameter.java
  39. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqPowerModuleStatus.java
  40. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqStatus.java
  41. 39 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqStopImage.java
  42. 30 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqUploadCurrentDisplayForm.java
  43. 16 2
      src/main/java/com/its/vms/xnettcp/vms/protocol/VmsResFramePacket.java
  44. 1 0
      src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsReqControlDto.java
  45. 1 1
      src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsOpCode.java

+ 3 - 3
src/main/java/com/its/vms/VmsCommServerApplication.java

@@ -11,7 +11,7 @@ import com.its.vms.ui.JTextAreaOutputStream;
 import com.its.vms.ui.MainUI;
 import com.its.vms.xnettcp.center.CenterTcpServerService;
 import com.its.vms.xnettcp.vms.VmsTcpCommServerService;
-import com.its.vms.xnettcp.vms.process.TcpServerDataProcess;
+import com.its.vms.xnettcp.vms.process.TcpServerRecvDataProcess;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -139,8 +139,8 @@ public class VmsCommServerApplication implements CommandLineRunner, ApplicationL
         DbmsDataProcess dbmsDataProcess = (DbmsDataProcess)AppUtils.getBean(DbmsDataProcess.class);
         dbmsDataProcess.run();
 
-        TcpServerDataProcess tcpServerDataProcess = (TcpServerDataProcess)AppUtils.getBean(TcpServerDataProcess.class);
-        tcpServerDataProcess.run();
+        TcpServerRecvDataProcess tcpServerRecvDataProcess = (TcpServerRecvDataProcess)AppUtils.getBean(TcpServerRecvDataProcess.class);
+        tcpServerRecvDataProcess.run();
 
         UnitSystService unitSystService = (UnitSystService)AppUtils.getBean(UnitSystService.class);
         unitSystService.loadMaster();

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

@@ -38,7 +38,7 @@ public class TbVmsCtlrDto implements Serializable {
     private int  index;
     private Long vmsCtlrNmbr;
     private Long groupNo;
-    private String ctlrLocalNo;
+    private Integer ctlrLocalNo;
     private String ctlrId;
     private String name;
     private String ctlrIp;

+ 1 - 1
src/main/java/com/its/vms/entity/TbVmsCtlr.java

@@ -15,7 +15,7 @@ public class TbVmsCtlr implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private Long vmsCtlrNmbr;
-    private String vmsCtlrLocalNo;
+    private Integer vmsCtlrLocalNo;
     private String vmsCtlrId;
     private String vmsNm;
     private String vmsCtlrIp;

+ 0 - 1
src/main/java/com/its/vms/process/DbmsDataProcess.java

@@ -96,7 +96,6 @@ public class DbmsDataProcess {
             switch(type) {
                 case DBMS_DATA_CTLR_STTS:
                     TbVmsCtlrStts ctlrStts = (TbVmsCtlrStts)data.getData();
-                    log.error("{}", ctlrStts);
                     this.vmsCtlrMapper.updateCtlrStts(ctlrStts);
                     break;
                 case DBMS_DATA_CTLR_STTS_LIST:

+ 13 - 0
src/main/java/com/its/vms/scheduler/SchedulerTask.java

@@ -58,6 +58,19 @@ public class SchedulerTask {
         log.info("scheduleVmsOnOffControl: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
     }
 
+    @Scheduled(cron = "25 0/5 * * * *")  // 5분주기 작업 실행
+    public void scheduleVmsFormDownload() {
+        if (!this.config.isStartSchedule()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("scheduleVmsOnOffControl: start. {}", Thread.currentThread().getName());
+        this.repoService.setStaticCycle(false);
+        this.vmsManageService.loadVmsOnOffTime();
+        this.vmsManageService.jobMakeDownloadVmsForm();;
+        log.info("scheduleVmsOnOffControl: ..end. {} ms. {}", elapsed.milliSeconds(), Thread.currentThread().getName());
+    }
+
     @Scheduled(cron = "50 4,9,14,19,24,29,34,39,44,49,54,59 * * * *")  // 5분주기 작업 실행(DSRC 구간 소통정보 생성)
     public void scheduleMakeSectTraf() {
         if (!this.config.isStartSchedule()) {

+ 2 - 2
src/main/java/com/its/vms/service/VmsManageService.java

@@ -14,7 +14,7 @@ import com.its.vms.entity.TbVmsSchedule;
 import com.its.vms.process.DbmsData;
 import com.its.vms.process.DbmsDataProcess;
 import com.its.vms.process.DbmsDataType;
-import com.its.vms.xnettcp.vms.process.TcpServerDataProcess;
+import com.its.vms.xnettcp.vms.process.TcpServerRecvDataProcess;
 import com.its.vms.xnettcp.vms.process.TcpServerSendData;
 import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
 import com.its.vms.xnettcp.vms.protocol.dto.VmsReqControlDto;
@@ -46,7 +46,7 @@ public class VmsManageService {
     private final VmsParkService parkService;
     private final DbmsDataProcess dbmsDataProcess;
 
-    private final TcpServerDataProcess serverDataProcess;
+    private final TcpServerRecvDataProcess serverDataProcess;
     private int toggleFormSeq = 1;
 
     public void initVmsDsplPrst() {

+ 3 - 1
src/main/java/com/its/vms/xnettcp/vms/VmsTcpCommServerInitializer.java

@@ -12,6 +12,8 @@ import com.its.vms.xnettcp.vms.handler.VmsServerPacketInboundHandler;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelPipeline;
+import io.netty.handler.logging.LogLevel;
+import io.netty.handler.logging.LoggingHandler;
 import io.netty.handler.timeout.IdleStateHandler;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -46,7 +48,7 @@ public class VmsTcpCommServerInitializer extends ChannelInitializer<Channel> {
                     TimeUnit.SECONDS);
 
             ChannelPipeline pipeline = channel.pipeline();
-            //pipeline.addLast(new LoggingHandler(LogLevel.INFO));
+            pipeline.addLast(new LoggingHandler(LogLevel.INFO));
             pipeline.addLast("vmsTcpIdleStateHandler", tcpIdleStateHandler);
             pipeline.addLast("vmsServerIdleStateHandler", new VmsServerIdleStateHandler(obj, this.dbmsDataProcess));   // packet idle state handler, event handler
             if (obj.getProtocolVer() == 0) {

+ 2 - 7
src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerDecoder.java

@@ -23,16 +23,11 @@ public class VmsTcpServerDecoder extends ByteToMessageDecoder {
     private final CommunicationConfig communicationConfig;
     private final AppRepositoryService repoService;
 
-    private static final int DSRC_ASN1_PACKET_MIN_SIZE = 5;
-    private static final int DSRC_ASN1_PACKET_MAX_SIZE = 3000;
-
     @Override
-    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> list) throws Exception {
+    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> list) {
 
-        //String tcpAddress = NettyUtils.getTcpAddress(ctx.channel());
         String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
         Channel channel = ctx.channel();
-        //TbVmsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         TbVmsCtlrDto obj = this.repoService.getIpAddrMap(ipAddress);
         if (obj == null) {
             log.error("TcpServerDecoder.decode: Unknown Controller IP: {}. will be close.", ipAddress);
@@ -54,7 +49,7 @@ public class VmsTcpServerDecoder extends ByteToMessageDecoder {
             log.error("RECV: {}. byteBuf.readableBytes() == 0. [{]{}]", ipAddress, obj.getLogKey());
             return;
         }
-        //log.debug("RECV: Decoder: {}. [Readable:{}, RIDX:{}-WIDX:{}]", ipAddress, readableBytes, byteBuf.readerIndex(), byteBuf.writerIndex());
+        log.debug("RECV: Decoder: {}. [Readable:{}, RIDX:{}-WIDX:{}]", ipAddress, readableBytes, byteBuf.readerIndex(), byteBuf.writerIndex());
 
         if (this.communicationConfig.isDumpRecv()) {
             byte[] debugBytes = new byte[byteBuf.readableBytes()];

+ 6 - 16
src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerDleStuffingDecoder.java

@@ -6,6 +6,7 @@ import com.its.vms.dto.TbVmsCtlrDto;
 import com.its.vms.service.AppRepositoryService;
 import com.its.vms.xnettcp.vms.handler.VmsServerIdleStateHandler;
 import com.its.vms.xnettcp.vms.protocol.VmsProtocolConst;
+import com.its.vms.xnettcp.vms.protocol.VmsResFramePacket;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandlerContext;
@@ -32,7 +33,6 @@ public class VmsTcpServerDleStuffingDecoder extends ByteToMessageDecoder {
 
         MDC.put("id", this.vmsObj.getLogKey());
 
-
         if (!channel.isOpen() || !channel.isActive()) {
             log.error("[{}]. RECV: VmsTcpServerDleStuffingDecoder.decode: isOpen: {}, isActive: {}. [{}]", this.vmsObj.getCtlrId(), channel.isOpen(), channel.isActive(), this.vmsObj.getLogKey());
             VmsServerIdleStateHandler.disconnectChannel(this.vmsObj, channel);
@@ -43,27 +43,19 @@ public class VmsTcpServerDleStuffingDecoder extends ByteToMessageDecoder {
         MDC.put("id", logKey);
         try {
             int readableBytes = byteBuf.readableBytes();
-            log.info("[{}]. RECV: ReadableBytes: {} Bytes, ReaderIndex: {}", this.vmsObj.getCtlrId(), readableBytes, byteBuf.readerIndex());
-
-//            if (this.vmsObj.getDebugConfig() != null && this.vmsObj.getDebugConfig().isDumpRecv()) {
-//                byte[] debugBytes = new byte[byteBuf.readableBytes()];
-//                byteBuf.getBytes(byteBuf.readerIndex(), debugBytes);
-//                log.info("[{}]. RECV: {} Bytes. {}", this.vmsObj.getCtlrId(), debugBytes.length, SysUtils.byteArrayToHex(debugBytes));
-//            }
+            log.info("[{}]. RECV: VmsTcpServerDleStuffingDecoder.decode: ReadableBytes: {} Bytes, ReaderIndex: {}", this.vmsObj.getCtlrId(), readableBytes, byteBuf.readerIndex());
 
             byteBuf.markReaderIndex();
             byte[] recvBytes = new byte[readableBytes];
             byte[] packets = new byte[readableBytes];
             byteBuf.readBytes(recvBytes);
 
-            int stuffing = 0;
             int msgSize = 0;        // 순수 데이터 사이즈
             boolean foundDle = false;
-            boolean requiredEtx = false;
             for (int readIdx = 0; readIdx < readableBytes; readIdx++) {
                 if (readIdx == 2) {
                     if (recvBytes[0] != VmsProtocolConst.VMS_DLE || recvBytes[1] != VmsProtocolConst.VMS_STX) {
-                        log.error("[{}]. RECV: DLE/STX Data Error. {}/{}", this.vmsObj.getCtlrId(), recvBytes[0], recvBytes[1]);
+                        log.error("[{}]. RECV: VmsTcpServerDleStuffingDecoder: DLE/STX Data Error. {}/{}", this.vmsObj.getCtlrId(), recvBytes[0], recvBytes[1]);
                         VmsServerIdleStateHandler.disconnectChannel(this.vmsObj, channel);
                         return;
                     }
@@ -74,8 +66,7 @@ public class VmsTcpServerDleStuffingDecoder extends ByteToMessageDecoder {
                     foundDle = false;
                     if (data == VmsProtocolConst.VMS_DLE) {
                         // Skip DLE Stuffing Data
-                        stuffing++;
-                        log.warn("RECV_0: [{}]. ReadableBytes: {} Bytes, ReadIndex: {}, DLE Stuffing Data Recv.", ipAddress, readableBytes, readIdx);
+                        log.info("[{}]. VmsTcpServerDleStuffingDecoder: ReadableBytes: {} Bytes, ReadIndex: {}, DLE Stuffing Data Recv.", ipAddress, readableBytes, readIdx);
                     } else if (data == VmsProtocolConst.VMS_STX) {
                         // Packet
                         packets[msgSize++] = data;
@@ -98,12 +89,11 @@ public class VmsTcpServerDleStuffingDecoder extends ByteToMessageDecoder {
                         byteBuf.markReaderIndex();
                         byteBuf.discardReadBytes();
 
-//                        CctvResFramePacket frame = new CctvResFramePacket(obj, packets, msgSize);
-//                        list.add(frame);
+                        list.add(new VmsResFramePacket(this.vmsObj, packets, msgSize));
                         break;
                     } else {
                         // DLE 다음에 와야할 데이터가 들어오지 않았다. 패킷에 오류가 발생함.
-                        log.error("[{}]. RECV: ReadableBytes: {} Bytes, ReadIndex: {}, DLE Next Data Recv Error.", this.vmsObj.getCtlrId(), readableBytes, readIdx);
+                        log.error("[{}]. RECV: VmsTcpServerDleStuffingDecoder: ReadableBytes: {} Bytes, ReadIndex: {}, DLE Next Data Recv Error.", this.vmsObj.getCtlrId(), readableBytes, readIdx);
                         VmsServerIdleStateHandler.disconnectChannel(this.vmsObj, channel);
                         return;
                     }

+ 17 - 46
src/main/java/com/its/vms/xnettcp/vms/codec/VmsTcpServerEncoder.java

@@ -15,6 +15,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 import org.springframework.stereotype.Component;
 
+import java.nio.ByteBuffer;
+
 @Slf4j
 @RequiredArgsConstructor
 @Component
@@ -25,11 +27,10 @@ public class VmsTcpServerEncoder extends MessageToByteEncoder<Object> {
     private final AppRepositoryService repoService;
 
      @Override
-    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf byteBuf) throws Exception {
+    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf outByteBuf) throws Exception {
 
         String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
         Channel channel = ctx.channel();
-        //TbVmsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         TbVmsCtlrDto obj = this.repoService.getIpAddrMap(ipAddress);
         if (obj == null) {
             log.error("VmsTcpServerEncoder.encode: Unknown Controller IP: {}. will be close.", ipAddress);
@@ -39,53 +40,23 @@ public class VmsTcpServerEncoder extends MessageToByteEncoder<Object> {
 
         MDC.put("id", obj.getLogKey());
 
-        if (obj.getChannel() != null && (channel != obj.getChannel())) {
-            log.error("VmsTcpServerEncoder.encode: {}, channel error, curr: {}, old: {}", ipAddress, channel.toString(), obj.getChannel().toString());
-            VmsServerIdleStateHandler.disconnectChannel(obj, channel);
-            return;
-        }
-
         if (!channel.isOpen() || !channel.isActive()) {
-            log.error("VmsTcpServerEncoder.encode: {}, isOpen: {}, isActive: {}. [{}]", ipAddress, channel.isOpen(), channel.isActive(), obj.getLogKey());
+            log.error("[{}]. SEND: VmsTcpServerEncoder.encode: {}, isOpen: {}, isActive: {}. [{}]", obj.getCtlrId(), ipAddress, channel.isOpen(), channel.isActive(), obj.getLogKey());
             VmsServerIdleStateHandler.disconnectChannel(obj, channel);
             return;
         }
-//
-//        if (!(msg instanceof C2CAuthenticatedMessage)) {
-//            log.error("DsrcTcpServerEncoder.encode: {}, msg is not ByteBuffer. [{}]", ipAddress, obj.getLogKey());
-//            VmsServerIdleStateHandler.disconnectChannel(obj, channel);
-//            return;
-//        }
-//
-//        C2CAuthenticatedMessage c2c = (C2CAuthenticatedMessage)msg;
-//        try {
-//            ReverseByteArrayOutputStream c2cBuff = new ReverseByteArrayOutputStream(2048);
-//            ReverseByteArrayOutputStream pktBuff = new ReverseByteArrayOutputStream(2048);
-//            int length = c2c.encode(c2cBuff);
-//            if (length > 0) {
-//                DatexDataPacket dataPkt = new DatexDataPacket();
-//                dataPkt.setDatexVersionNumber(new BerEnum(1));  // version == 1
-//                dataPkt.setDatexData(new BerOctetString(c2cBuff.getArray()));
-//                dataPkt.setDatexCrcNbr(new BerOctetString(DsrcAsn1Crc16.getCrc16ToByteArray(c2cBuff.getArray())));  // crc
-//
-//                int encodeLength = dataPkt.encode(pktBuff);
-//                byteBuf.writeBytes(pktBuff.getArray());
-//                //log.info("SEND: Encoder: {}. ASN1 PACKET: {} Bytes, encodeLength: {} Bytes", ipAddress, length, encodeLength);
-//                //log.info("SEND: Encoder: {}, C2CAuth: {}", ipAddress, c2c);
-//                if (this.runningConfig.isDumpSend()) {
-//                    byte[] debugBytes = new byte[byteBuf.readableBytes()];
-//                    byteBuf.getBytes(byteBuf.readerIndex(), debugBytes);
-//                    log.info("SEND: [{}], {} Bytes. {}", ipAddress, debugBytes.length, SysUtils.byteArrayToHex(debugBytes));
-//                }
-//            } else {
-//                log.error("SEND: {}. C2CAuthenticatedMessage encode buffer length zero: will be closed.", ipAddress);
-//                VmsServerIdleStateHandler.disconnectChannel(obj, channel);
-//            }
-//        } catch (Exception e) {
-//            log.error("DsrcTcpServerEncoder.encode: SEND: {}. Exception Error: will be closed: {}. [{}]", ipAddress, e.toString(), obj.getLogKey());
-//            VmsServerIdleStateHandler.disconnectChannel(obj, channel);
-//        }
-        //MDC.remove(obj.getLogKey());
-        //MDC.clear();
+
+         if (!(msg instanceof ByteBuffer)) {
+             log.error("[{}]. SEND: VmsTcpServerEncoder.encode: msg is not ByteBuffer. [{}]", obj.getCtlrId(), obj.getLogKey());
+             VmsServerIdleStateHandler.disconnectChannel(null, channel);
+             return;
+         }
+
+        ByteBuffer buffer = (ByteBuffer)msg;
+        byte[] sendBytes = buffer.array();
+        outByteBuf.writeBytes(sendBytes);
+
+        MDC.remove(obj.getLogKey());
+        MDC.clear();
     }
 }

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/handler/VmsServerIdleStateHandler.java

@@ -80,7 +80,7 @@ public class VmsServerIdleStateHandler extends ChannelDuplexHandler {
 
         this.vmsObj.connected(ctx);
         TbVmsCtlrStts stts = this.vmsObj.getStts().clone();
-        dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CTLR_STTS, false, stts));
+        this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_CTLR_STTS, false, stts));
         this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_CONNECTED, null));
 
         MDC.remove(this.vmsObj.getLogKey());

+ 7 - 6
src/main/java/com/its/vms/xnettcp/vms/handler/VmsServerPacketInboundHandler.java

@@ -1,8 +1,8 @@
 package com.its.vms.xnettcp.vms.handler;
 
 import com.its.app.utils.NettyUtils;
-import com.its.vms.xnettcp.vms.process.TcpServerData;
-import com.its.vms.xnettcp.vms.process.TcpServerDataProcess;
+import com.its.vms.xnettcp.vms.process.TcpServerRecvData;
+import com.its.vms.xnettcp.vms.process.TcpServerRecvDataProcess;
 import com.its.vms.xnettcp.vms.protocol.VmsResFramePacket;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
@@ -17,17 +17,18 @@ import org.springframework.stereotype.Component;
 @ChannelHandler.Sharable
 public class VmsServerPacketInboundHandler extends ChannelInboundHandlerAdapter {
 
-    private final TcpServerDataProcess tcpServerDataProcess;
+    private final TcpServerRecvDataProcess tcpServerRecvDataProcess;
 
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         if (!(msg instanceof VmsResFramePacket)) {
             String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-            log.error("[{}] | Received Data is not VmsServerPacketInboundHandler Object", ipAddress);
+            log.error("[{}] | VmsServerPacketInboundHandler: Received Data is not VmsServerPacketInboundHandler Object", ipAddress);
             return;
         }
 
-        VmsResFramePacket res = (VmsResFramePacket)msg;
-        this.tcpServerDataProcess.add(new TcpServerData(TcpServerData.DATA_TYPE_REQ_PACKET, res.getObj(), ctx, res));
+        VmsResFramePacket framePacket = (VmsResFramePacket)msg;
+        this.tcpServerRecvDataProcess.add(new TcpServerRecvData(TcpServerRecvData.DATA_TYPE_RES_PACKET, framePacket.getVmsObj(), ctx, framePacket));
     }
+
 }

+ 0 - 171
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerDataProcess.java

@@ -1,171 +0,0 @@
-package com.its.vms.xnettcp.vms.process;
-
-import com.its.app.utils.NettyUtils;
-import com.its.vms.config.CommunicationConfig;
-import com.its.vms.dto.TbVmsCtlrDto;
-import com.its.vms.service.AppRepositoryService;
-import com.its.vms.xnettcp.vms.handler.VmsServerIdleStateHandler;
-import com.its.vms.xnettcp.vms.process.response.VmsResponse;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandlerContext;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-
-@Slf4j
-@RequiredArgsConstructor
-@Service
-public class TcpServerDataProcess {
-
-    private final CommunicationConfig communicationConfig;
-    private final AppRepositoryService repoService;
-    private final TcpServerDataTask serverDataTask;
-
-    public static LinkedBlockingQueue<TcpServerData> SERVER_DATA_QUEUE = new LinkedBlockingQueue<>(1000);
-    private ThreadPoolExecutor taskExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(1);
-    int MAX_CORE = Runtime.getRuntime().availableProcessors();
-
-    @PostConstruct
-    private void init() {
-    }
-    public void run() {
-        log.info("TcpServerDataProcess.run: Start.");
-        if (this.MAX_CORE < 8) {
-            this.MAX_CORE = 8;
-        }
-//        ItsThreadPoolInitializer poolInitializer = (ItsThreadPoolInitializer) AppUtils.getBean(ItsThreadPoolInitializer.class);
-        int executePool = this.MAX_CORE;//Math.max(this.MAX_CORE, poolInitializer.getThreadPoolWork());
-        for (int ii = 0; ii < executePool; ii++) {
-            log.info("TcpServerDataProcess.Task: {}", ii);
-            this.taskExecutor.execute(() -> {
-                boolean isRunning = true;
-                while (isRunning) {
-                    try {
-                        TcpServerData serverData = TcpServerDataProcess.SERVER_DATA_QUEUE.take();
-                        //TcpServerDataTask handler = (TcpServerDataTask) AppUtils.getBean(TcpServerDataTask.class);
-                        this.serverDataTask.run(this, serverData);
-                    }
-                    catch (Exception e) {
-                        log.error("TcpServerDataProcess.Task: Exception: {}", e.getMessage());
-                        Thread.currentThread().interrupt();
-                        isRunning = false;
-                    }
-                }
-            });
-        }
-
-        log.info("TcpServerDataProcess.run: ..End.");
-    }
-
-    public void process(TcpServerData data) {
-        try {
-            ChannelHandlerContext ctx = data.getCtx();
-            Channel channel = ctx.channel();
-            String ipAddress = NettyUtils.getRemoteIpAddress(channel);
-            //TbVmsCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);;
-            TbVmsCtlrDto obj = this.repoService.getIpAddrMap(ipAddress);;
-//            C2CAuthenticatedMessage c2c = (C2CAuthenticatedMessage)data.getData();
-//            PDUs pdus = c2c.getPdu();
-//
-//            if (obj == null || channel == null || c2c == null) {
-//                log.error("TcpServerDataProcess.process: {}, data null. controller: {}, channel: {}, c2c: {{}", ipAddress, obj, channel, c2c);
-//                return;
-//            }
-//
-//            MDC.put("id", obj.getLogKey());
-//            eAuthInfo cmd = eAuthInfo.getByValue(c2c.getDatexAuthenticationInfoText().value[0]);
-
-            //log.info("TcpServerDataProcess.process: {}, {}, ThreadId: {}", ipAddress, cmd.toString(), Thread.currentThread().getId());
-
-            VmsResponse response = null;
-//            switch (cmd) {
-//                case AI_Initiate    :   //(0x01, "AI_Initiate"),           /* 초기 통신연결을 위한 개시 요청 데이터 패킷 */
-//                    // 서버모드 처리내용 없음(평택 서버인데 클라이언트가 서버로 동작 => 로그인 요청해야함)
-//                    if (pdus.getDatexInitiateNull() != null) {
-//                        response = new InitiateResponse(obj, ctx, c2c);
-//                    }
-//                    else if (pdus.getSubscription() != null) {
-//                        response = new SubscriptionResponse(obj, ctx, c2c);
-//                    }
-//                    else if (pdus.getPublication() != null) {
-//                        response = new PublicationResponse(obj, ctx, c2c);
-//                    }
-//                    break;
-//                case AI_Login       :   //(0x02, "AI_Login"),              /* 서버에 접속하기 위한 클라이언트의 로그인 데이터 패킷 */
-//                    response = new LoginResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_FrED        :   //(0x03, "AI_FrED"),               /* 서버와 클라이언트의 연결을 유지하기 위한 확인 데이터 패킷 */
-//                    response = new FredResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Terminate   :   //(0x04, "AI_Terminate"),          /* 연결을 종료하고자 할 때, 서버에서 클라이언트에 요청하는 데이터 패킷 */
-//                    response = new TerminateResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Logout      :   //(0x05, "AI_Logout"),             /* 접속을 종료하기 위한 클라이언트의 로그아웃 데이터 패킷 */
-//                    response = new LogoutResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Subscription:   //(0x06, "AI_Subscription"),       /* 클라이언트가 서버에 정보를 요청할 경우 송신하는 데이터 패킷 */
-//                    response = new SubscriptionResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Publication :   //(0x07, "AI_Publication"),        /* 클라이언트가 요청한 정보를 제공하기 위한 데이터 패킷 - 요청에 대한 정보공개*/
-//                    response = new PublicationResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Accept      :   //(0x09, "AI_Accept"),             /* 클라이언트의 요청에 대한 수용 */
-//                    response = new AcceptResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Reject      :   //(0x0A, "AI_Reject");             /* 클라이언트의 요청에 대한 거부 */
-//                    // 운영단말 명령에 대한 거부도 발생할 수 있으므로 운영단말로 결과를 전송한다.
-//                    response = new RejectResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_TransferDone:   //(0x08, "AI_TransferDone"),       /* 클라이언트가 요청한 정보를 파일형태로 제공하기 위한 데이터 패킷 */
-//                    // 처리내용 없음
-//                    response = new TransferDoneResponse(obj, ctx, c2c);
-//                    break;
-//                case AI_Null        :   //(0x00, "AI_Null"),               /* NULL */
-//                    // 처리내용 없음
-//                    response = new NullResponse(obj, ctx, c2c);
-//                    break;
-//                default:
-//                    log.warn("{}. process: Unknown packet: {}, {}", ipAddress, cmd.toString(), obj.toString());
-//                    break;
-//            }
-
-            if (response != null) {
-                if (!response.response(this.communicationConfig)) {
-                    log.error("TcpServerDataProcess.process: {}, response error. will be closed.", ipAddress);
-                    VmsServerIdleStateHandler.disconnectChannel(obj, ctx.channel());
-                }
-            }
-            else {
-                log.error("TcpServerDataProcess.process: {}, unknown packet. will be closed.", ipAddress);
-                VmsServerIdleStateHandler.disconnectChannel(obj, ctx.channel());
-            }
-            MDC.remove(obj.getLogKey());
-            MDC.clear();
-        } catch (Exception e) {
-            log.error("TcpServerDataProcess.process: Exception: {}", e.toString());
-        }
-    }
-
-    /*
-    *  작업큐에 데이터 추가
-     */
-    public void add(TcpServerData data) {
-        try {
-            //offer => full -> return
-            //add   => full -> wait
-            //큐가 차더라도 바로 리턴함.
-            if (!SERVER_DATA_QUEUE.offer(data)) {
-                log.error("TcpServerDataProcess-QueueFull: {}", SERVER_DATA_QUEUE.size());
-            }
-        } catch (Exception e) {
-            log.error("TcpServerDataProcess-QueueAddError: {}", e.getMessage(), e);
-        }
-    }
-
-}

+ 2 - 2
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerData.java → src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvData.java

@@ -7,7 +7,7 @@ import lombok.Setter;
 
 @Getter
 @Setter
-public class TcpServerData {
+public class TcpServerRecvData {
     public static final int DATA_TYPE_REQ_PACKET = 0;
     public static final int DATA_TYPE_RES_PACKET = 1;
 
@@ -16,7 +16,7 @@ public class TcpServerData {
     private ChannelHandlerContext ctx;
     private Object data;
 
-    public TcpServerData(int type, TbVmsCtlrDto obj, ChannelHandlerContext ctx, Object data) {
+    public TcpServerRecvData(int type, TbVmsCtlrDto obj, ChannelHandlerContext ctx, Object data) {
         this.type = type;
         this.obj  = obj;
         this.ctx  = ctx;

+ 142 - 0
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataProcess.java

@@ -0,0 +1,142 @@
+package com.its.vms.xnettcp.vms.process;
+
+import com.its.vms.config.CommunicationConfig;
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.handler.VmsServerIdleStateHandler;
+import com.its.vms.xnettcp.vms.process.response.*;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsResFramePacket;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+import io.netty.channel.ChannelHandlerContext;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TcpServerRecvDataProcess {
+
+    private final CommunicationConfig communicationConfig;
+    private final TcpServerRecvDataTask serverDataTask;
+
+    public static final LinkedBlockingQueue<TcpServerRecvData> SERVER_DATA_QUEUE = new LinkedBlockingQueue<>(1000);
+    private final ThreadPoolExecutor taskExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(1);
+    private int maxCord = Runtime.getRuntime().availableProcessors();
+
+    public void run() {
+        log.info("TcpServerRecvDataProcess.run: Start.");
+        if (this.maxCord < 8) {
+            this.maxCord = 8;
+        }
+        int executePool = this.maxCord;
+        for (int ii = 0; ii < executePool; ii++) {
+            log.info("TcpServerRecvDataProcess.Task: {}", ii);
+            this.taskExecutor.execute(() -> {
+                boolean isRunning = true;
+                while (isRunning) {
+                    try {
+                        TcpServerRecvData serverData = TcpServerRecvDataProcess.SERVER_DATA_QUEUE.take();
+                        this.serverDataTask.run(this, serverData);
+                    }
+                    catch (Exception e) {
+                        log.error("TcpServerRecvDataProcess.Task: Exception: {}", e.getMessage());
+                        Thread.currentThread().interrupt();
+                        isRunning = false;
+                    }
+                }
+            });
+        }
+
+        log.info("TcpServerRecvDataProcess.run: ..End.");
+    }
+
+    public void process(TcpServerRecvData data) {
+        try {
+            ChannelHandlerContext ctx = data.getCtx();
+            TbVmsCtlrDto vmsObj = data.getObj();
+            VmsResFramePacket resFramePacket = (VmsResFramePacket)data.getData();
+
+            MDC.put("id", vmsObj.getLogKey());
+
+            VmsFramePacket packet;
+            if (vmsObj.getProtocolVer() == 0) {
+                packet = new VmsDleFramePacket(resFramePacket.getPacket(), resFramePacket.getMsgLen());
+            }
+            else {
+                packet = new VmsDleFramePacket(resFramePacket.getPacket(), resFramePacket.getMsgLen());
+            }
+
+            VmsResponse response = null;
+            eVmsOpCode opCode = eVmsOpCode.getValue(packet.getOpCode());
+            switch(opCode) {
+                case OP_VMS_STATUS_REQ:
+                    response = new VmsResStatus(vmsObj, packet);
+                    break;
+                case OP_VMS_POWER_MODULE_STATUS_REQ:
+                    response = new VmsResPowerModuleStatus(vmsObj, packet);
+                    break;
+                case OP_VMS_DISPLAY_MODULE_STATUS_REQ:
+                    response = new VmsResDisplayModuleStatus(vmsObj, packet);
+                    break;
+                case OP_VMS_PARAMETER_REQ:
+                    response = new VmsResParameter(vmsObj, packet);
+                    break;
+                case OP_VMS_STOP_IMAGE_REQ:
+                    log.error("OP_VMS_STOP_IMAGE_REQ");
+                    break;
+                case OP_VMS_CURRENT_DISPLAY_FORM_UPLOAD:
+                    log.error("OP_VMS_CURRENT_DISPLAY_FORM_UPLOAD");
+                    break;
+                case OP_VMS_DISPLAY_DEFAULT_FORM:
+                    log.error("OP_VMS_DISPLAY_DEFAULT_FORM");
+                    break;
+                case OP_VMS_BLANK:
+                    log.error("OP_VMS_BLANK");
+                    break;
+                default:
+                    log.warn("TcpServerRecvDataProcess.process: Unknown Op Code Packet: VMS {}, {}", vmsObj.getVmsCtlrNmbr(), packet.getOpCode());
+                    break;
+            }
+
+            if (response != null) {
+                if (!response.process()) {
+                    log.error("TcpServerRecvDataProcess.process: response error. VMS {}, will be closed.", vmsObj.getVmsCtlrNmbr());
+                    VmsServerIdleStateHandler.disconnectChannel(vmsObj, ctx.channel());
+                }
+            }
+            else {
+                log.error("TcpServerRecvDataProcess.process: Unknown Packet. VMS {}, will be closed.", vmsObj.getVmsCtlrNmbr());
+                VmsServerIdleStateHandler.disconnectChannel(vmsObj, ctx.channel());
+            }
+
+            MDC.remove(vmsObj.getLogKey());
+            MDC.clear();
+        } catch (Exception e) {
+            log.error("TcpServerRecvDataProcess.process: Exception: {}", e.toString());
+        }
+    }
+
+    /*
+    *  작업큐에 데이터 추가
+     */
+    public void add(TcpServerRecvData data) {
+        try {
+            //offer => full -> return
+            //add   => full -> wait
+            //큐가 차더라도 바로 리턴함.
+            if (!SERVER_DATA_QUEUE.offer(data)) {
+                log.error("TcpServerRecvDataProcess-QueueFull: {}", SERVER_DATA_QUEUE.size());
+            }
+        } catch (Exception e) {
+            log.error("TcpServerRecvDataProcess-QueueAddError: {}", e.getMessage(), e);
+        }
+    }
+
+}

+ 2 - 2
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerDataTask.java → src/main/java/com/its/vms/xnettcp/vms/process/TcpServerRecvDataTask.java

@@ -6,10 +6,10 @@ import org.springframework.stereotype.Service;
 
 @Slf4j
 @Service
-public class TcpServerDataTask {
+public class TcpServerRecvDataTask {
 
     @Async("workDataExecutor")
-    public void run(TcpServerDataProcess serverDataProcess, TcpServerData serverData) {
+    public void run(TcpServerRecvDataProcess serverDataProcess, TcpServerRecvData serverData) {
 
         serverDataProcess.process(serverData);
     }

+ 11 - 3
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendData.java

@@ -8,9 +8,17 @@ import lombok.Setter;
 public class TcpServerSendData {
     public static final int DATA_CONNECTED = 0;
     public static final int DATA_DISCONNECTED = 1;
-    public static final int DATA_RES_DEVICE_ID = 2;
-    public static final int DATA_REQ_CONTROL = 3;
-    public static final int DATA_REQ_FORM_DOWNLOAD = 4;
+    public static final int DATA_REQ_DEVICE_ID = 2;
+    public static final int DATA_REQ_STATUS = 3;
+    public static final int DATA_REQ_POWER_MODULE_STATUS = 4;
+    public static final int DATA_REQ_DISPLAY_MODULE_STATUS = 5;
+    public static final int DATA_REQ_PARAMETER = 6;
+    public static final int DATA_REQ_STOP_IMAGE = 7;
+    public static final int DATA_REQ_UPLOAD_CURRENT_DISPLAY_FORM = 8;
+    public static final int DATA_REQ_DISPLAY_DEFAULT_FORM = 9;
+    public static final int DATA_REQ_BLANK = 11;
+    public static final int DATA_REQ_CONTROL = 28;
+    public static final int DATA_REQ_FORM_DOWNLOAD = 29;
 
     private long requestTime;
     private int command;

+ 47 - 15
src/main/java/com/its/vms/xnettcp/vms/process/TcpServerSendDataProcess.java

@@ -2,6 +2,7 @@ package com.its.vms.xnettcp.vms.process;
 
 import com.its.vms.domain.NET;
 import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.*;
 import com.its.vms.xnettcp.vms.protocol.dto.VmsReqControlDto;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -15,13 +16,13 @@ import java.util.concurrent.ThreadPoolExecutor;
 @RequiredArgsConstructor
 public class TcpServerSendDataProcess {
 
-    private final TbVmsCtlrDto vmsCtlr;
+    private final TbVmsCtlrDto vmsObj;
 
     private final LinkedBlockingQueue<TcpServerSendData> reqCommandBlockingQueue = new LinkedBlockingQueue<>(100);
     private final ThreadPoolExecutor taskExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(1);
 
     public void run() {
-        log.info("TcpServerReqDataProcess[{}].run: Start.", this.vmsCtlr.getVmsCtlrNmbr());
+        log.info("TcpServerReqDataProcess[{}].run: Start.", this.vmsObj.getVmsCtlrNmbr());
         this.taskExecutor.execute(() -> {
             boolean isRunning = true;
             while (isRunning) {
@@ -40,47 +41,78 @@ public class TcpServerSendDataProcess {
 
     public void process(TcpServerSendData data) {
 
-        MDC.put("id", this.vmsCtlr.getLogKey());
+        MDC.put("id", this.vmsObj.getLogKey());
 
-        boolean isConnected = (this.vmsCtlr.getNetState() > NET.CLOSED && this.vmsCtlr.getChannel() != null);
+        boolean isConnected = (this.vmsObj.getNetState() > NET.CLOSED && this.vmsObj.getChannel() != null);
         boolean isRequested = false;
-        log.info("TcpServerReqDataProcess[{}].process: command({}), connected({}), Elapsed: {} ms.", this.vmsCtlr.getVmsCtlrNmbr(), data.getCommand(), isConnected, data.elapsed());
+        log.info("TcpServerReqDataProcess.process: VMS {}, command({}), connected({}), Elapsed: {} ms.", this.vmsObj.getVmsCtlrNmbr(), data.getCommand(), isConnected, data.elapsed());
 
         if (isConnected) {
             try {
                 switch (data.getCommand()) {
                     case TcpServerSendData.DATA_CONNECTED:
+                        VmsReqStatus reqStatus = new VmsReqStatus(this.vmsObj);
+                        this.vmsObj.sendData(reqStatus.getByteBuffer(), 10, reqStatus.getOpCodeDesc());
                         break;
-                    case TcpServerSendData.DATA_RES_DEVICE_ID:
+                    case TcpServerSendData.DATA_REQ_DEVICE_ID:
                         // 디바이스 인증요청에 대한 응답
                         // 디바이스 정보가 일치 하지 않으면 네트워크 연결을 종료한다.
                         break;
+                    case TcpServerSendData.DATA_REQ_POWER_MODULE_STATUS:
+                        VmsReqPowerModuleStatus reqPowerModuleStatus = new VmsReqPowerModuleStatus(this.vmsObj);
+                        this.vmsObj.sendData(reqPowerModuleStatus.getByteBuffer(), 10, reqPowerModuleStatus.getOpCodeDesc());
+                        break;
+                    case TcpServerSendData.DATA_REQ_DISPLAY_MODULE_STATUS:
+                        VmsReqDisplayModuleStatus reqDisplayModuleStatus = new VmsReqDisplayModuleStatus(this.vmsObj);
+                        this.vmsObj.sendData(reqDisplayModuleStatus.getByteBuffer(), 10, reqDisplayModuleStatus.getOpCodeDesc());
+                        break;
+                    case TcpServerSendData.DATA_REQ_PARAMETER:
+                        VmsReqParameter reqParameter = new VmsReqParameter(this.vmsObj);
+                        this.vmsObj.sendData(reqParameter.getByteBuffer(), 10, reqParameter.getOpCodeDesc());
+                        break;
+                    case TcpServerSendData.DATA_REQ_STOP_IMAGE:
+                        VmsReqStopImage reqStopImage = new VmsReqStopImage(this.vmsObj, (Integer)data.getData());
+                        this.vmsObj.sendData(reqStopImage.getByteBuffer(), 10, reqStopImage.getOpCodeDesc());
+                        break;
+                    case TcpServerSendData.DATA_REQ_UPLOAD_CURRENT_DISPLAY_FORM:
+                        VmsReqUploadCurrentDisplayForm reqUploadCurrentDisplayForm = new VmsReqUploadCurrentDisplayForm(this.vmsObj);
+                        this.vmsObj.sendData(reqUploadCurrentDisplayForm.getByteBuffer(), 10, reqUploadCurrentDisplayForm.getOpCodeDesc());
+                        break;
+                    case TcpServerSendData.DATA_REQ_DISPLAY_DEFAULT_FORM:
+                        VmsReqDisplayDefaultForm reqDisplayDefaultForm = new VmsReqDisplayDefaultForm(this.vmsObj);
+                        this.vmsObj.sendData(reqDisplayDefaultForm.getByteBuffer(), 10, reqDisplayDefaultForm.getOpCodeDesc());
+                        break;
+                    case TcpServerSendData.DATA_REQ_BLANK:
+                        VmsReqBlank reqBlank = new VmsReqBlank(this.vmsObj);
+                        this.vmsObj.sendData(reqBlank.getByteBuffer(), 10, reqBlank.getOpCodeDesc());
+                        break;
+
                     case TcpServerSendData.DATA_REQ_CONTROL:
                         VmsReqControlDto control = (VmsReqControlDto) data.getData();
                         byte[] command = control.getCommand();
                         // TODO: 전송성공하면
 
                         if (isRequested) {
-                            this.vmsCtlr.getModule().setOnOff(true);
+                            this.vmsObj.getModule().setOnOff(true);
                             //this.vmsCtlr.getModule().setOnOff(command[0]);
                         } else {
-                            int retry = this.vmsCtlr.getModule().getRetry();
+                            int retry = this.vmsObj.getModule().getRetry();
                             retry++;
-                            this.vmsCtlr.getModule().setRetry(retry);
-                            this.vmsCtlr.getModule().setOnOff(false);
+                            this.vmsObj.getModule().setRetry(retry);
+                            this.vmsObj.getModule().setOnOff(false);
                         }
                         break;
                     default:
                         break;
                 }
             } catch (Exception e) {
-                log.error("TcpServerReqDataProcess[{}].process: Exception: {}", this.vmsCtlr.getVmsCtlrNmbr(), e.toString());
+                log.error("TcpServerReqDataProcess.process: VMS {}, Exception: {}", this.vmsObj.getVmsCtlrNmbr(), e.toString());
             }
         }
 
-        log.info("TcpServerReqDataProcess[{}].process: command({}), connected({}), Requested({}).", this.vmsCtlr.getVmsCtlrNmbr(), data.getCommand(), isConnected, isRequested);
+        log.info("TcpServerReqDataProcess.process: VMS {}, command({}), connected({}), Requested({}).", this.vmsObj.getVmsCtlrNmbr(), data.getCommand(), isConnected, isRequested);
 
-        MDC.remove(this.vmsCtlr.getLogKey());
+        MDC.remove(this.vmsObj.getLogKey());
         MDC.clear();
     }
 
@@ -90,10 +122,10 @@ public class TcpServerSendDataProcess {
             //add   => full -> wait
             //큐가 차더라도 바로 리턴함.
             if (!this.reqCommandBlockingQueue.offer(data)) {
-                log.error("TcpServerReqDataProcess[{}].add: QueueFull: {}", this.vmsCtlr.getVmsCtlrNmbr(), this.reqCommandBlockingQueue.size());
+                log.error("TcpServerReqDataProcess[{}].add: QueueFull: {}", this.vmsObj.getVmsCtlrNmbr(), this.reqCommandBlockingQueue.size());
             }
         } catch (Exception e) {
-            log.error("TcpServerReqDataProcess[{}].add: QueueError: {}", this.vmsCtlr.getVmsCtlrNmbr(), e.getMessage());
+            log.error("TcpServerReqDataProcess[{}].add: QueueError: {}", this.vmsObj.getVmsCtlrNmbr(), e.getMessage());
         }
     }
 

+ 0 - 26
src/main/java/com/its/vms/xnettcp/vms/process/response/TerminateResponse.java

@@ -1,26 +0,0 @@
-package com.its.vms.xnettcp.vms.process.response;
-
-import com.its.app.utils.NettyUtils;
-import com.its.vms.config.CommunicationConfig;
-import com.its.vms.dto.TbVmsCtlrDto;
-import io.netty.channel.ChannelHandlerContext;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class TerminateResponse implements VmsResponse {
-    private TbVmsCtlrDto obj;
-    private ChannelHandlerContext ctx;
-
-    @Override
-    public boolean response(CommunicationConfig communicationConfig) {
-        if (this.obj == null) {
-            return false;
-        }
-
-        // 처리내용 없음.
-        String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
-        log.info("TerminateResponse.response: {}", ipAddress);
-
-        return true;
-    }
-}

+ 84 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResDisplayDefaultForm.java

@@ -0,0 +1,84 @@
+package com.its.vms.xnettcp.vms.process.response;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+public class VmsResDisplayDefaultForm implements VmsResponse {
+
+    private final TbVmsCtlrDto vmsObj;
+    private final VmsFramePacket resFramePacket;
+    private int x;  // (X축) VMS 모듈수 //가로
+    private int y;  // (Y축) VMS 모듈수 //세로
+    private String stts;
+
+    @Override
+    public boolean process() {
+
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_PARAMETER, null));
+
+        this.x = 0;
+        this.y = 0;
+        this.stts = "";
+
+        byte[] body = this.resFramePacket.getBody();
+        log.info("VmsResDisplayDefaultForm.process: body length: {} ", body != null ? body.length : 0);
+        if (body == null || body.length < 2) {
+            log.error("VmsResDisplayDefaultForm.process: body length error: {} ", body != null ? body.length : 0);
+            return false;
+        }
+
+        // Byte.toUnsignedInt(
+        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
+        this.x = byteBuffer.get(0) & 0xFF;
+        this.y = byteBuffer.get(1) & 0xFF;
+        if (this.x <= 0 || this.y <= 0) {
+            log.error("VmsResDisplayDefaultForm.process: Module Count Error {}/{}.", this.x, this.y);
+            return false;
+        }
+        if (body.length < ((this.x * this.y) + 2)) {
+            log.error("VmsResDisplayDefaultForm.process: Module Count and Body Length Error {}/{}, {}.", this.x, this.y, body.length);
+            return false;
+        }
+
+        int idx = 2;
+        StringBuilder data = new StringBuilder();
+        for (int ii = 0; ii < this.y; ii++) {
+            for (int jj = 0; jj < this.x; jj++) {
+                byte status = (byte) (byteBuffer.get(idx++) & 0xFF);
+                if (status == (byte)0x00) {
+                    data.append("1");   // ON
+                }
+                else if (status == (byte)0x01) {
+                    data.append("0");   // OFF
+                }
+                else {
+                    data.append("9");   // 0x02, Unknown
+                }
+            }
+        }
+        this.stts = data.toString();
+
+        log.info("{}", toString());
+
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder data = new StringBuilder();
+        data.append(String.format("VMS %d, Display Modules (X: %d, Y: %d)", this.vmsObj.getVmsCtlrNmbr(), this.x, this.y));
+        for (int ii = 0; ii < this.y; ii++) {
+            data.append(System.getProperty("line.separator")).append(String.format("Y(%02d): %s", ii, this.stts.substring(ii * this.x, (ii * this.x) + this.x)));
+        }
+        return data.toString();
+    }
+
+}

+ 84 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResDisplayModuleStatus.java

@@ -0,0 +1,84 @@
+package com.its.vms.xnettcp.vms.process.response;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+public class VmsResDisplayModuleStatus implements VmsResponse {
+
+    private final TbVmsCtlrDto vmsObj;
+    private final VmsFramePacket resFramePacket;
+    private int x;  // (X축) VMS 모듈수 //가로
+    private int y;  // (Y축) VMS 모듈수 //세로
+    private String stts;
+
+    @Override
+    public boolean process() {
+
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_PARAMETER, null));
+
+        this.x = 0;
+        this.y = 0;
+        this.stts = "";
+
+        byte[] body = this.resFramePacket.getBody();
+        log.info("VmsResDisplayModuleStatus.process: body length: {} ", body != null ? body.length : 0);
+        if (body == null || body.length < 2) {
+            log.error("VmsResDisplayModuleStatus.process: body length error: {} ", body != null ? body.length : 0);
+            return false;
+        }
+
+        // Byte.toUnsignedInt(
+        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
+        this.x = byteBuffer.get(0) & 0xFF;
+        this.y = byteBuffer.get(1) & 0xFF;
+        if (this.x <= 0 || this.y <= 0) {
+            log.error("VmsResDisplayModuleStatus.process: Module Count Error {}/{}.", this.x, this.y);
+            return false;
+        }
+        if (body.length < ((this.x * this.y) + 2)) {
+            log.error("VmsResDisplayModuleStatus.process: Module Count and Body Length Error {}/{}, {}.", this.x, this.y, body.length);
+            return false;
+        }
+
+        int idx = 2;
+        StringBuilder data = new StringBuilder();
+        for (int ii = 0; ii < this.y; ii++) {
+            for (int jj = 0; jj < this.x; jj++) {
+                byte status = (byte) (byteBuffer.get(idx++) & 0xFF);
+                if (status == (byte)0x00) {
+                    data.append("1");   // ON
+                }
+                else if (status == (byte)0x01) {
+                    data.append("0");   // OFF
+                }
+                else {
+                    data.append("9");   // 0x02, Unknown
+                }
+            }
+        }
+        this.stts = data.toString();
+
+        log.info("{}", toString());
+
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder data = new StringBuilder();
+        data.append(String.format("VMS %d, Display Modules (X: %d, Y: %d)", this.vmsObj.getVmsCtlrNmbr(), this.x, this.y));
+        for (int ii = 0; ii < this.y; ii++) {
+            data.append(System.getProperty("line.separator")).append(String.format("Y(%02d): %s", ii, this.stts.substring(ii * this.x, (ii * this.x) + this.x)));
+        }
+        return data.toString();
+    }
+
+}

+ 107 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResParameter.java

@@ -0,0 +1,107 @@
+package com.its.vms.xnettcp.vms.process.response;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+public class VmsResParameter implements VmsResponse {
+
+    private final TbVmsCtlrDto vmsObj;
+    private final VmsFramePacket resFramePacket;
+
+    private int   powerCtrlMode;  // 전원제어 모드                1 Byte  0x00 : 꺼짐, 0x01 : 켜짐,
+    private int   fanRunMode;     // Fan 동작모드                 1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
+    private int   fanRunTemp;     // Fan 의 동작개시온도          1 Byte  온도( 0x00 ~0x03f )
+    private int   heaterRunMode;  // Heater 의 동작모드           1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
+    private int   heaterRunTemp;  // Heater 의 동작개시온도       1 Byte  온도(0x00 ~ 0x3f )
+    private int   brightMode; // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
+    private int   brightCurr; // 화면의 밝기 - 현재 휘도값, 0~100
+    private int   brightWeek; // 화면의 밝기 - 주간 휘도값, 0~100
+    private int   brightNght; // 화면의 밝기 - 야간 휘도값, 0~100
+    private int   blinkTime;      // 깜빡이는 시간주기            1 Byte  문자 비트맵의 깜빡이는 시간주기 0x00 ~ 0x1e( 0.1 ~3.0 )
+    private short scnTurnTime;    // 디폴트 시나리오로 전환시간   2 Byte  디폴트 시나리오로 전환될 때까지 기다리는 시간, 단위 : 초
+    private int   reserved;       // 기타                         1 Byte
+
+    //현재 로컬 제어기의 시간
+    private int   year;           // 년       1 Byte  0x00 ~ 0x32
+    private int   mon;            // 월       1 Byte  0x01 ~ 0x0c
+    private int   day;            // 일       1 Byte  0x01 ~ 0x1f
+    private int   hour;           // 시       1 Byte  0x00 ~ 0x17
+    private int   min;            // 분       1 Byte  0x00 ~ 0x3b
+    private int   sec;            // 초       1 Byte  0x00 ~ 0x3b
+
+    @Override
+    public boolean process() {
+
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_STOP_IMAGE, 0xFF)); // 안됨
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_UPLOAD_CURRENT_DISPLAY_FORM, null)); // 안됨
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_DISPLAY_DEFAULT_FORM, null)); // 안됨
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_BLANK, null));
+
+
+        byte[] body = this.resFramePacket.getBody();
+        log.info("VmsResParameter.process: body length: {} ", body != null ? body.length : 0);
+        if (body == null || body.length < 17) {
+            log.error("VmsResParameter.process: body length error: {} ", body != null ? body.length : 0);
+            return false;
+        }
+
+        // Byte.toUnsignedInt(
+        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
+        this.powerCtrlMode = byteBuffer.get() & 0xFF;
+        this.fanRunMode = byteBuffer.get() & 0xFF;
+        this.fanRunTemp = byteBuffer.get() & 0xFF;
+        this.heaterRunMode = byteBuffer.get() & 0xFF;
+        this.heaterRunTemp = byteBuffer.get() & 0xFF;
+        this.brightMode = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
+        this.brightCurr = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 현재 휘도값, 0~100
+        if (body.length > 17) {
+            this.brightWeek = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 주간 휘도값, 0~100
+            this.brightNght = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 야간 휘도값, 0~100
+        }
+        else {
+            this.brightWeek = 0;
+            this.brightNght = 0;
+        }
+        this.blinkTime = byteBuffer.get() & 0xFF;
+        this.scnTurnTime = (short) (byteBuffer.getShort() & 0xFFFF);
+        this.reserved = byteBuffer.get() & 0xFF;
+        this.year = byteBuffer.get() & 0xFF;
+        this.mon = byteBuffer.get() & 0xFF;
+        this.day = byteBuffer.get() & 0xFF;
+        this.hour = byteBuffer.get() & 0xFF;
+        this.min = byteBuffer.get() & 0xFF;
+        this.sec = byteBuffer.get() & 0xFF;
+
+        log.info("{}", toString());
+
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder data = new StringBuilder();
+        data.append(String.format("VMS %d, ", this.vmsObj.getVmsCtlrNmbr()));
+        data.append(System.getProperty("line.separator")).append(String.format(" PANL_PWER_MODE(%02X)", this.powerCtrlMode));
+        data.append(System.getProperty("line.separator")).append(String.format("       FAN_MODE(%02X)", this.fanRunMode));
+        data.append(System.getProperty("line.separator")).append(String.format("   FAN_RUN_TMPR(%d)", this.fanRunTemp));
+        data.append(System.getProperty("line.separator")).append(String.format("      HETR_MODE(%02X)", this.heaterRunMode));
+        data.append(System.getProperty("line.separator")).append(String.format("  HETR_RUN_TMPR(%d)", this.heaterRunTemp));
+        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_MODE(%02X)", this.brightMode));
+        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_CURR(%d)", this.brightCurr));
+        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_WEEK(%d)", this.brightWeek));
+        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_NGHT(%d)", this.brightNght));
+        data.append(System.getProperty("line.separator")).append(String.format("     BLINK_TIME(%d)", this.blinkTime));
+        data.append(System.getProperty("line.separator")).append(String.format("  SCN_TURN_TIME(%d)", this.scnTurnTime));
+        data.append(System.getProperty("line.separator")).append(String.format("     LOCAL_TIME(%04d%02d%02d%02d%02d%02d)", this.year+2000, this.mon, this.day, this.hour, this.min, this.sec));
+        return data.toString();
+    }
+
+}

+ 76 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResPowerModuleStatus.java

@@ -0,0 +1,76 @@
+package com.its.vms.xnettcp.vms.process.response;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+public class VmsResPowerModuleStatus implements VmsResponse {
+
+    private final TbVmsCtlrDto vmsObj;
+    private final VmsFramePacket resFramePacket;
+    private int moduleCnt;
+    private String stts;
+
+    @Override
+    public boolean process() {
+
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_DISPLAY_MODULE_STATUS, null));
+
+        this.moduleCnt = 0;
+        this.stts = "";
+
+        byte[] body = this.resFramePacket.getBody();
+        log.info("VmsResPowerModuleStatus.process: body length: {} ", body != null ? body.length : 0);
+        if (body == null || body.length < 2) {
+            log.error("VmsResPowerModuleStatus.process: body length error: {} ", body != null ? body.length : 0);
+            return false;
+        }
+
+        // Byte.toUnsignedInt(
+        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
+        this.moduleCnt = byteBuffer.get(0) & 0xFF;
+        if (this.moduleCnt <= 0) {
+            log.error("VmsResPowerModuleStatus.process: Module Count Error {}.", this.moduleCnt);
+            return false;
+        }
+        if (body.length < this.moduleCnt + 2) {
+            log.error("VmsResPowerModuleStatus.process: Module Count and Body Length Error {}, {}.", this.moduleCnt, body.length);
+            return false;
+        }
+
+        StringBuilder data = new StringBuilder();
+        for (int ii = 0; ii < this.moduleCnt; ii++) {
+            byte status = (byte) (byteBuffer.get(2+ii) & 0xFF);
+            if (status == (byte)0x00) {
+                data.append("1");   // ON
+            }
+            else if (status == (byte)0x01) {
+                data.append("0");   // OFF
+            }
+            else {
+                data.append("9");   // 0x02, Unknown
+            }
+        }
+        this.stts = data.toString();
+
+        log.info("{}", toString());
+
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder data = new StringBuilder();
+        data.append(String.format("VMS %d, Power Modules (%d)", this.vmsObj.getVmsCtlrNmbr(), this.moduleCnt));
+        data.append(System.getProperty("line.separator")).append(this.stts);
+        return data.toString();
+    }
+
+}

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

@@ -0,0 +1,112 @@
+package com.its.vms.xnettcp.vms.process.response;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+public class VmsResStatus implements VmsResponse {
+
+    private final TbVmsCtlrDto vmsObj;
+    private final VmsFramePacket resFramePacket;
+    private int door;       // Door Open/Close 상태, 0x00: Open, 0x01: Close, 0x09: Unknown
+    private int power;      // 전원의 ON/OFF 상태, 0x00: On, 0x01: Off, 0x09: Unknown (Sign Board)
+    private int fan;        // VMS Fan 동작 상태, 0x00: On, 0x01: Off, 0x09: Unknown
+    private int heater;     // VMS Heater 동작 상태, 0x00: On, 0x01: Off, 0x09: Unknown
+    private int formNo;     // 표출 폼 번호, 현재 표출중인 폼 번호 : 0~9999
+    private int reboot;     // 표출 폼 번호, 0x00: 정상, 0x01: 재실행
+    private int cboxTemp;   // 함체온도, 127 ~ -127, -128 : Unknown
+    private int brightMode; // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
+    private int brightCurr; // 화면의 밝기 - 현재 휘도값, 0~100
+    private int brightWeek; // 화면의 밝기 - 주간 휘도값, 0~100
+    private int brightNght; // 화면의 밝기 - 야간 휘도값, 0~100
+    private int dpTemp;     // 외부온도, -127 ~ 127, -128: Unknown
+    private int dpHum;      // 외부습도,    0 ~ 100,  101: Unknown
+    private int powerModuleStts = 0x02; // 0x00: 정상, 0x01: 에러, 0x02: Unknown
+    private int moduleStts = 0x02;      // 0x00: 정상, 0x01: 불량, 0x02: Unknown
+    private int cboxFan = 0x09;         // 0x00: On, 0x01: Off, 0x09: Unknown
+    private int cboxHeather = 0x09;     // 0x00: On, 0x01: Off, 0x09: Unknown
+
+    @Override
+    public boolean process() {
+
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_POWER_MODULE_STATUS, null));
+
+        byte[] body = this.resFramePacket.getBody();
+        log.info("VmsResStatus.process: body length: {} ", body != null ? body.length : 0);
+        if (body == null || body.length < 14) {
+            log.error("VmsResStatus.process: body length error: {} ", body != null ? body.length : 0);
+            return false;
+        }
+
+        // Byte.toUnsignedInt(
+        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
+        this.door = byteBuffer.get() & 0xFF;        // Door Open/Close 상태, 0x00: Open, 0x01: Close, 0x09: Unknown
+        this.power = byteBuffer.get() & 0xFF;       // 전원의 ON/OFF 상태, 0x00: On, 0x01: Off, 0x09: Unknown (Sign Board)
+        this.fan = byteBuffer.get() & 0xFF;         // VMS Fan 동작 상태, 0x00: On, 0x01: Off, 0x09: Unknown
+        this.heater = byteBuffer.get() & 0xFF;      // VMS Heater 동작 상태, 0x00: On, 0x01: Off, 0x09: Unknown
+        this.formNo = byteBuffer.getShort() & 0xFFFF; // 표출 폼 번호, 현재 표출중인 폼 번호 : 0~9999
+        this.reboot = byteBuffer.get() & 0xFF;      // 표출 폼 번호, 0x00: 정상, 0x01: 재실행
+        this.cboxTemp = byteBuffer.get() & 0xFF;    // 함체온도, 127 ~ -127, -128 : Unknown
+        this.brightMode = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
+        this.brightCurr = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 현재 휘도값, 0~100
+        this.brightWeek = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 주간 휘도값, 0~100
+        this.brightNght = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 야간 휘도값, 0~100
+        this.dpTemp = byteBuffer.get() & 0xFF;      // 외부온도, -127 ~ 127, -128: Unknown
+        this.dpHum = byteBuffer.get() & 0xFF;       // 외부습도, 0 ~ 100, 101: Unknown
+
+        this.cboxFan = 0x09;
+        this.cboxHeather = 0x09;
+        if (body.length >= 16) {
+            this.powerModuleStts = byteBuffer.get() & 0xFF;    // 전원 모듈 상태, 0x00: 정상, 0x01: 에러, 0x02: Unknown
+            this.moduleStts = byteBuffer.get() & 0xFF;         // 모듈 상태, 0x00: 정상, 0x01: 불량, 0x02: Unknown
+            this.cboxFan = byteBuffer.get() & 0xFF;            // 함체 Fan 동작 상태, 0x00: On, 0x01: Off, 0x09: Unknown
+            this.cboxHeather = byteBuffer.get() & 0xFF;        // 함체 Heater 동작 상태, 0x00: On, 0x01: Off, 0x09: Unknown
+        }
+        else {
+            int tmpFan1 = (this.fan & 0x0F);
+            int tmpFan2 = (this.fan & 0xF0) >> 4;
+            int tmpHtr1 = (this.heater & 0x0F);
+            int tmpHtr2 = (this.heater & 0xF0) >> 4;
+            this.fan = tmpFan1;
+            this.cboxFan = tmpFan2;
+            this.heater = tmpHtr1;
+            this.cboxHeather = tmpHtr2;
+        }
+
+        log.info("{}", toString());
+
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder data = new StringBuilder();
+        data.append(String.format("VMS %d, ", this.vmsObj.getVmsCtlrNmbr()));
+        data.append(String.format("Door(%02X), ", this.door));
+        data.append(String.format("Power(%02X), ", this.power));
+        data.append(String.format("Fan(%02X), ", this.fan));
+        data.append(String.format("Heater(%02X), ", this.heater));
+        data.append(String.format("FormNo(%d), ", this.formNo));
+        data.append(String.format("ReBoot(%02X), ", this.reboot));
+        data.append(String.format("CboxTemp(%d), ", this.cboxTemp));
+        data.append(String.format("B-Mode(%02X), ", this.brightMode));
+        data.append(String.format("B-Curr(%d), ", this.brightCurr));
+        data.append(String.format("B-Week(%d), ", this.brightWeek));
+        data.append(String.format("B-Nght(%d), ", this.brightNght));
+        data.append(String.format("DpTemp(%d), ", this.dpTemp));
+        data.append(String.format("DpHum(%d), ", this.dpHum));
+        data.append(String.format("PowerModuleStts(%02X), ", this.powerModuleStts));
+        data.append(String.format("ModuleStts(%02X), ", this.moduleStts));
+        data.append(String.format("CboxFan(%02X), ", this.cboxFan));
+        data.append(String.format("CboxHeater(%02X)", this.cboxHeather));
+        return data.toString();
+    }
+
+}

+ 84 - 0
src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResUploadCurrentDisplayForm.java

@@ -0,0 +1,84 @@
+package com.its.vms.xnettcp.vms.process.response;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.process.TcpServerSendData;
+import com.its.vms.xnettcp.vms.protocol.VmsDleFramePacket;
+import com.its.vms.xnettcp.vms.protocol.VmsFramePacket;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+public class VmsResUploadCurrentDisplayForm implements VmsResponse {
+
+    private final TbVmsCtlrDto vmsObj;
+    private final VmsFramePacket resFramePacket;
+    private int x;  // (X축) VMS 모듈수 //가로
+    private int y;  // (Y축) VMS 모듈수 //세로
+    private String stts;
+
+    @Override
+    public boolean process() {
+
+        this.vmsObj.addRequestData(new TcpServerSendData(TcpServerSendData.DATA_REQ_PARAMETER, null));
+
+        this.x = 0;
+        this.y = 0;
+        this.stts = "";
+
+        byte[] body = this.resFramePacket.getBody();
+        log.info("VmsResUploadCurrentDisplayForm.process: body length: {} ", body != null ? body.length : 0);
+        if (body == null || body.length < 2) {
+            log.error("VmsResUploadCurrentDisplayForm.process: body length error: {} ", body != null ? body.length : 0);
+            return false;
+        }
+
+        // Byte.toUnsignedInt(
+        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
+        this.x = byteBuffer.get(0) & 0xFF;
+        this.y = byteBuffer.get(1) & 0xFF;
+        if (this.x <= 0 || this.y <= 0) {
+            log.error("VmsResUploadCurrentDisplayForm.process: Module Count Error {}/{}.", this.x, this.y);
+            return false;
+        }
+        if (body.length < ((this.x * this.y) + 2)) {
+            log.error("VmsResUploadCurrentDisplayForm.process: Module Count and Body Length Error {}/{}, {}.", this.x, this.y, body.length);
+            return false;
+        }
+
+        int idx = 2;
+        StringBuilder data = new StringBuilder();
+        for (int ii = 0; ii < this.y; ii++) {
+            for (int jj = 0; jj < this.x; jj++) {
+                byte status = (byte) (byteBuffer.get(idx++) & 0xFF);
+                if (status == (byte)0x00) {
+                    data.append("1");   // ON
+                }
+                else if (status == (byte)0x01) {
+                    data.append("0");   // OFF
+                }
+                else {
+                    data.append("9");   // 0x02, Unknown
+                }
+            }
+        }
+        this.stts = data.toString();
+
+        log.info("{}", toString());
+
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder data = new StringBuilder();
+        data.append(String.format("VMS %d, Display Modules (X: %d, Y: %d)", this.vmsObj.getVmsCtlrNmbr(), this.x, this.y));
+        for (int ii = 0; ii < this.y; ii++) {
+            data.append(System.getProperty("line.separator")).append(String.format("Y(%02d): %s", ii, this.stts.substring(ii * this.x, (ii * this.x) + this.x)));
+        }
+        return data.toString();
+    }
+
+}

+ 3 - 3
src/main/java/com/its/vms/xnettcp/vms/process/response/VmsResponse.java

@@ -1,7 +1,7 @@
 package com.its.vms.xnettcp.vms.process.response;
 
-import com.its.vms.config.CommunicationConfig;
-
 public interface VmsResponse {
-    boolean response(CommunicationConfig communicationConfig);
+
+    boolean process();
+
 }

+ 0 - 22
src/main/java/com/its/vms/xnettcp/vms/process/service/UserCommandService.java

@@ -1,22 +0,0 @@
-package com.its.vms.xnettcp.vms.process.service;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class UserCommandService {
-    private static UserCommandService _instance = null;
-
-    public static UserCommandService getInstance() {
-        if (_instance == null) {
-            synchronized (UserCommandService.class) {
-                if (_instance == null)
-                    _instance = new UserCommandService();
-            }
-        }
-        return _instance;
-    }
-
-    public UserCommandService() {
-    }
-
-}

+ 35 - 16
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsDleFrameHead.java

@@ -1,16 +1,18 @@
 package com.its.vms.xnettcp.vms.protocol;
 
+import com.google.common.primitives.Bytes;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
 
 @Slf4j
 @Data
-public class VmsDleFrameHead {
+public class VmsDleFrameHead implements VmsFrameHead {
 
-    private final int headSize = 11;
-    private final int opCodePos = 4;
+    public static final int HEAD_SIZE = 11;
 
     private byte dle = VmsProtocolConst.VMS_DLE;    // byte
     private byte stx = VmsProtocolConst.VMS_STX;    // byte
@@ -21,26 +23,17 @@ public class VmsDleFrameHead {
     private int total;          // byte
     private int length;         // int
 
-    public VmsDleFrameHead() {
-        this.group = 0;
-        this.controller = 0;
-        this.curr = 1;
-        this.total = 1;
-        this.opCode = 0;
-        this.length = 0;
-    }
-
     public VmsDleFrameHead(int group, int controller, int opCode, int curr, int total) {
         this.group = group;
         this.controller = controller;
-        this.curr = opCode;
-        this.total = curr;
-        this.opCode = total;
+        this.opCode = opCode;
+        this.curr = curr;
+        this.total = total;
         this.length = 0;
     }
 
     public VmsDleFrameHead(byte[] headBytes) {
-        if (headBytes != null && headBytes.length >= this.headSize) {
+        if (headBytes != null && headBytes.length >= VmsDleFrameHead.HEAD_SIZE) {
             ByteBuffer byteBuffer = ByteBuffer.wrap(headBytes);
             byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
             this.dle = byteBuffer.get();
@@ -57,4 +50,30 @@ public class VmsDleFrameHead {
         }
     }
 
+    public byte[] getBuffer() {
+        List<Byte> list = new ArrayList<>();
+
+        // HEAD (패킷 분석결과 DLE Stuffing 하지 않음)
+        list.add(this.dle);
+        list.add(this.stx);
+        list.add((byte)(this.group & 0xFF));
+        list.add((byte)(this.controller & 0xFF));
+        list.add((byte)(this.opCode & 0xFF));
+        list.add((byte)(this.curr & 0xFF));
+        list.add((byte)(this.total & 0xFF));
+
+//        list.add((byte)(this.length & 0xFF000000 >> 24));
+//        list.add((byte)(this.length & 0x00FF0000 >> 16));
+//        list.add((byte)(this.length & 0x0000FF00 >>  8));
+//        list.add((byte)(this.length & 0x000000FF      ));
+
+        // 길이 부분은 Little Endian
+        list.add((byte)(this.length & 0x000000FF      ));
+        list.add((byte)(this.length & 0x00FF0000 >> 16));
+        list.add((byte)(this.length & 0x0000FF00 >>  8));
+        list.add((byte)(this.length & 0xFF000000 >> 24));
+
+        return Bytes.toArray(list);
+    }
+
 }

+ 66 - 38
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsDleFramePacket.java

@@ -1,13 +1,16 @@
 package com.its.vms.xnettcp.vms.protocol;
 
 import com.google.common.primitives.Bytes;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+import lombok.extern.slf4j.Slf4j;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.List;
 
-public class VmsDleFramePacket extends VmsReqFramePacket {
+@Slf4j
+public class VmsDleFramePacket implements VmsFramePacket {
     public static final ByteOrder BYTE_ORDER = ByteOrder.BIG_ENDIAN;
 
     /**
@@ -52,46 +55,70 @@ public class VmsDleFramePacket extends VmsReqFramePacket {
     protected byte[]          body;
     protected VmsDleFrameTail tail;
 
-    public VmsDleFramePacket() {
-        this.head = new VmsDleFrameHead();
+    public VmsDleFramePacket(int group, int controller, byte opCode) {
+        this.head = new VmsDleFrameHead(group, controller, opCode, 1, 1);
         this.body = null;
         this.tail = new VmsDleFrameTail();
     }
 
-    public VmsDleFramePacket(int group, int controller, byte opCode) {
-        this.head = new VmsDleFrameHead(group, controller, opCode, 1, 1);
+    public VmsDleFramePacket(byte[] packet, int msgLen) {
         this.body = null;
-        this.tail = new VmsDleFrameTail();
+        if (packet == null || msgLen == 0) {
+            this.head = new VmsDleFrameHead(0, 0, 0, 1, 1);
+            this.tail = new VmsDleFrameTail();
+            return;
+        }
+
+        this.head = new VmsDleFrameHead(packet);
+        this.tail = new VmsDleFrameTail(packet);
+
+        int bodySize = msgLen - VmsDleFrameHead.HEAD_SIZE - VmsDleFrameTail.TAIL_SIZE;
+        if (bodySize > 0) {
+            this.body = new byte[bodySize];
+            System.arraycopy(packet, VmsDleFrameHead.HEAD_SIZE, this.body, 0, bodySize);
+        }
     }
 
-    public VmsDleFramePacket(VmsDleFrameHead head, byte[] body, VmsDleFrameTail tail) {
-        this.head = head;
+    @Override
+    public void setBody(byte[] body) {
         this.body = body;
-        this.tail = tail;
     }
 
     /**
      * 요청 패킷을 ByteBuffer 로 변경하여 리턴
      * @return
      */
+    @Override
     public ByteBuffer getByteBuffer() {
+        makeCRC();
         return getDleBuffer();
     }
 
+    @Override
+    public String getOpCodeDesc() {
+        eVmsOpCode opCode = eVmsOpCode.getValue(this.head.getOpCode());
+        if (opCode != null) {
+            return opCode.toString();
+        }
+        return String.format("0x%02X.Unknown OpCode.", this.head.getOpCode());
+    }
+
+    @Override
+    public int getOpCode() {
+        return this.head != null ? this.head.getOpCode() : 0x00;
+    }
+
+    @Override
+    public byte[] getBody() {
+        return this.body;
+    }
+
     private ByteBuffer getDleBuffer() {
         List<Byte> list = new ArrayList<Byte>();
         int bodySize = 0;
         if (this.body != null) {
             bodySize = this.body.length;
         }
-//        private byte dle = VmsProtocolConst.VMS_DLE;    // byte
-//        private byte stx = VmsProtocolConst.VMS_STX;    // byte
-//        private int group;          // byte
-//        private int controller;     // byte
-//        private int opCode;         // byte
-//        private int curr;           // byte
-//        private int total;          // byte
-//        private int length;         // int
 
         // HEAD (패킷 분석결과 DLE Stuffing 하지 않음)
         list.add(this.head.getDle());
@@ -101,10 +128,17 @@ public class VmsDleFramePacket extends VmsReqFramePacket {
         list.add((byte)(this.head.getOpCode() & 0xFF));
         list.add((byte)(this.head.getCurr() & 0xFF));
         list.add((byte)(this.head.getTotal() & 0xFF));
-        list.add((byte)(this.head.getLength() & 0xFF000000 >> 24));
-        list.add((byte)(this.head.getLength() & 0x00FF0000 >> 16));
-        list.add((byte)(this.head.getLength() & 0x0000FF00 >>  8));
-        list.add((byte)(this.head.getLength() & 0x000000FF      ));
+
+//        list.add((byte)((this.head.getLength() & 0xFF000000) >> 24));
+//        list.add((byte)((this.head.getLength() & 0x00FF0000) >> 16));
+//        list.add((byte)((this.head.getLength() & 0x0000FF00) >>  8));
+//        list.add((byte)((this.head.getLength() & 0x000000FF)      ));
+
+        // 길이부분은 Little Endian
+        list.add((byte)((this.head.getLength() & 0x000000FF)      ));
+        list.add((byte)((this.head.getLength() & 0x0000FF00) >>  8));
+        list.add((byte)((this.head.getLength() & 0x00FF0000) >> 16));
+        list.add((byte)((this.head.getLength() & 0xFF000000) >> 24));
 
         // BODY
         if (bodySize > 0) {
@@ -118,9 +152,10 @@ public class VmsDleFramePacket extends VmsReqFramePacket {
 
         // TAIL
         list.add(this.tail.getDle());
-        list.add(this.tail.getExt());
-        list.add((byte)(this.tail.getCrc() & 0x0000FF00 >>  8));
-        list.add((byte)(this.tail.getCrc() & 0x000000FF      ));
+        list.add(this.tail.getEtx());
+        list.add((byte)((this.tail.getCrc() & 0xFF00) >> 8));
+        list.add((byte)((this.tail.getCrc() & 0x00FF)     ));
+
 
         byte[] arr = Bytes.toArray(list);
         ByteBuffer byteBuffer = ByteBuffer.allocate(arr.length);
@@ -129,30 +164,24 @@ public class VmsDleFramePacket extends VmsReqFramePacket {
         return byteBuffer;
     }
 
-    private ByteBuffer getBuffer() {
+    public ByteBuffer getBuffer() {
         int bodySize = 0;
         if (this.body != null) {
             bodySize = this.body.length;
         }
-        ByteBuffer byteBuffer = ByteBuffer.allocate(CctvReqFrameHead.SIZE + bodySize + CctvReqFrameTail.SIZE);
-        byteBuffer.order(this.byteOrder);
 
-        // HEAD
-        byteBuffer.put(this.head.getDle());
-        byteBuffer.put(this.head.getStx());
-        byteBuffer.putShort(this.head.getAddress());
-        byteBuffer.put(this.head.getOpCode());
+        this.head.setLength(bodySize);
+        ByteBuffer byteBuffer = ByteBuffer.allocate(VmsDleFrameHead.HEAD_SIZE + bodySize + VmsDleFrameTail.TAIL_SIZE);
+        byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
 
+        // HEAD
+        byteBuffer.put(this.head.getBuffer());
         // BODY
         if (bodySize > 0) {
             byteBuffer.put(this.body);
         }
-
         // TAIL
-        byteBuffer.put(this.tail.getDle());
-        byteBuffer.put(this.tail.getEtx());
-        byteBuffer.putShort(this.tail.getCrc());
-
+        byteBuffer.put(this.tail.getBuffer());
         return byteBuffer;
     }
 
@@ -163,7 +192,6 @@ public class VmsDleFramePacket extends VmsReqFramePacket {
         this.tail.setCrc(crc);
     }
 
-
     /**
      * CRC16-ARC(https://crccalc.com/)
      * @param data

+ 21 - 8
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsDleFrameTail.java

@@ -1,37 +1,50 @@
 package com.its.vms.xnettcp.vms.protocol;
 
+import com.google.common.primitives.Bytes;
 import lombok.Data;
-import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
 
 @Slf4j
 @Data
 public class VmsDleFrameTail {
 
-    private final int tailSize = 4;
-    private final int opCodePos = 4;
+    public static final int TAIL_SIZE = 4;
+    private int opCodePos = 4;
 
     private byte dle = VmsProtocolConst.VMS_DLE;
-    private byte ext = VmsProtocolConst.VMS_ETX;
-    private int crc;
+    private byte etx = VmsProtocolConst.VMS_ETX;
+    private short crc;
 
     public VmsDleFrameTail() {
         this.crc = 0;
     }
 
     public VmsDleFrameTail(byte[] packet) {
-        if (packet != null && packet.length >= this.tailSize) {
+        if (packet != null && packet.length >= TAIL_SIZE) {
             ByteBuffer byteBuffer = ByteBuffer.wrap(packet);
             byteBuffer.order(VmsDleFramePacket.BYTE_ORDER);
             this.dle = byteBuffer.get(packet.length-4);
-            this.stx = byteBuffer.get(packet.length-3);
-            this.crc = byteBuffer.getShort(packet.length-2) & 0xFFFF;
+            this.etx = byteBuffer.get(packet.length-3);
+            this.crc = (short)(byteBuffer.getShort(packet.length-2) & 0xFFFF);
         }
         else {
             log.error("VmsReqDleFrameHead: create failed, headBytes error");
         }
     }
 
+    public byte[] getBuffer() {
+        List<Byte> list = new ArrayList<Byte>();
+
+        // TAIL
+        list.add(this.dle);
+        list.add(this.etx);
+        list.add((byte)(this.crc & 0xFF00 >> 8));
+        list.add((byte)(this.crc & 0x00FF     ));
+
+        return Bytes.toArray(list);
+    }
 }

+ 5 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFrameHead.java

@@ -0,0 +1,5 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+public interface VmsFrameHead {
+
+}

+ 13 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFramePacket.java

@@ -0,0 +1,13 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import java.nio.ByteBuffer;
+
+public interface VmsFramePacket {
+
+    ByteBuffer getByteBuffer();
+    String getOpCodeDesc();
+    int getOpCode();
+    void setBody(byte[] body);
+    byte[] getBody();
+
+}

+ 5 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsFrameTail.java

@@ -0,0 +1,5 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+public interface VmsFrameTail {
+
+}

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqBlank.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 상태정보 요청
+ */
+public class VmsReqBlank implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqBlank(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_BLANK.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqDisplayDefaultForm.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 상태정보 요청
+ */
+public class VmsReqDisplayDefaultForm implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqDisplayDefaultForm(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_DISPLAY_DEFAULT_FORM.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqDisplayModuleStatus.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 모듈상태정보 요청
+ */
+public class VmsReqDisplayModuleStatus implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqDisplayModuleStatus(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_DISPLAY_MODULE_STATUS_REQ.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 4 - 11
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqFramePacket.java

@@ -1,17 +1,10 @@
 package com.its.vms.xnettcp.vms.protocol;
 
-import com.its.vms.dto.TbVmsCtlrDto;
+import java.nio.ByteBuffer;
 
-public class VmsReqFramePacket {
+public interface VmsReqFramePacket {
 
-    private TbVmsCtlrDto vmsObj = null;
-
-    public void setObj(TbVmsCtlrDto vmsObj) {
-        this.vmsObj = vmsObj;
-    }
-
-    public TbVmsCtlrDto getObj() {
-        return this.vmsObj;
-    }
+    ByteBuffer getByteBuffer();
+    String getOpCodeDesc();
 
 }

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqParameter.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 상태정보 요청
+ */
+public class VmsReqParameter implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqParameter(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_PARAMETER_REQ.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqPowerModuleStatus.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 모듈상태정보 요청
+ */
+public class VmsReqPowerModuleStatus implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqPowerModuleStatus(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_POWER_MODULE_STATUS_REQ.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqStatus.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 상태정보 요청
+ */
+public class VmsReqStatus implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqStatus(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_STATUS_REQ.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 39 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqStopImage.java

@@ -0,0 +1,39 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 상태정보 요청
+ */
+@Slf4j
+public class VmsReqStopImage implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    private short deviceId;
+    public VmsReqStopImage(TbVmsCtlrDto vmsObj, int deviceId) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_STOP_IMAGE_REQ.getValue());
+            this.deviceId = (short)deviceId;
+            byte[] body = new byte[2];
+            body[0] = (byte)(((this.deviceId & 0xFF00) >> 8) & 0xFF);
+            body[1] = (byte)(((this.deviceId * 0x00FF)     ) * 0xFF);
+            this.framePacket.setBody(body);
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+
+}

+ 30 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsReqUploadCurrentDisplayForm.java

@@ -0,0 +1,30 @@
+package com.its.vms.xnettcp.vms.protocol;
+
+import com.its.vms.dto.TbVmsCtlrDto;
+import com.its.vms.xnettcp.vms.protocol.enums.eVmsOpCode;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 상태정보 요청
+ */
+public class VmsReqUploadCurrentDisplayForm implements  VmsReqFramePacket {
+
+    private VmsFramePacket framePacket;
+
+    public VmsReqUploadCurrentDisplayForm(TbVmsCtlrDto vmsObj) {
+        if (vmsObj.getProtocolVer() == 0) {
+            this.framePacket = new VmsDleFramePacket(vmsObj.getGroupNo().intValue(), vmsObj.getCtlrLocalNo(), (byte)eVmsOpCode.OP_VMS_CURRENT_DISPLAY_FORM_UPLOAD.getValue());
+        }
+    }
+
+    @Override
+    public ByteBuffer getByteBuffer() {
+        return this.framePacket.getByteBuffer();
+    }
+
+    @Override
+    public String getOpCodeDesc() {
+        return this.framePacket.getOpCodeDesc();
+    }
+}

+ 16 - 2
src/main/java/com/its/vms/xnettcp/vms/protocol/VmsResFramePacket.java

@@ -1,7 +1,21 @@
 package com.its.vms.xnettcp.vms.protocol;
 
 import com.its.vms.dto.TbVmsCtlrDto;
+import lombok.Data;
 
-public interface VmsResFramePacket {
-    TbVmsCtlrDto getObj();
+@Data
+public class VmsResFramePacket {
+
+    private TbVmsCtlrDto vmsObj;
+    private byte[] packet;
+    private int msgLen;
+
+    public VmsResFramePacket(TbVmsCtlrDto vmsObj, byte[] packet, int msgLen) {
+        // 배열이 비었는지는 체크하지 않음.
+        this.vmsObj = vmsObj;
+        this.msgLen = msgLen;
+        this.packet = new byte[msgLen];
+        System.arraycopy(packet, 0, this.packet, 0, msgLen);
+    }
 }
+

+ 1 - 0
src/main/java/com/its/vms/xnettcp/vms/protocol/dto/VmsReqControlDto.java

@@ -16,4 +16,5 @@ public class VmsReqControlDto implements Serializable {
         this.control = control;
         this.command = command;
     }
+
 }

+ 1 - 1
src/main/java/com/its/vms/xnettcp/vms/protocol/enums/eVmsOpCode.java

@@ -13,7 +13,7 @@ public enum eVmsOpCode {
     OP_VMS_STATUS_REQ                   (0x88, "0x88.VMS Status 요구"),         // VMS 상태정보 요구                          SERVER→VMS
     OP_VMS_PARAMETER_REQ                (0x8A, "0x8A.VMS 파라미터 요구"),       // VMS 로컬 상태 요구                         SERVER→VMS
     OP_VMS_POWER_MODULE_STATUS_REQ      (0x8C, "0x8C.전원 모듈 상태 요구"),     // 전원 모듈 상태를 검사 결과를 요청,         SERVER→VMS
-    OP_VMS_MODULE_STATUS_REQ            (0x8E, "0x8E.표출 모듈 상태 요구"),     // 표출 모듈 상태를 검사 결과를 요청,         SERVER→VMS
+    OP_VMS_DISPLAY_MODULE_STATUS_REQ    (0x8E, "0x8E.표출 모듈 상태 요구"),     // 표출 모듈 상태를 검사 결과를 요청,         SERVER→VMS
     OP_VMS_STOP_IMAGE_REQ               (0x90, "0x90.VMS 정지영상 요구"),       // 현재 표출되는 이미지 송신 요구,            SERVER→VMS
     OP_VMS_PIXEL_IMAGE_REQ              (0x92, "0x92.VMS Pixel Image 요구"),    // VMS LED Pixel 상태요구                     SERVER→VMS
     OP_VMS_CURRENT_DISPLAY_FORM_UPLOAD  (0x94, "0x94.현재 표출폼 Upload"),      // Local 에서 표출 중인 폼 Upload 요구,       SERVER→VMS