shjung 11 ay önce
ebeveyn
işleme
2bee2c10ad
19 değiştirilmiş dosya ile 665 ekleme ve 382 silme
  1. 5 3
      src/main/java/com/evp/comm/server/dto/EvpsCenter.java
  2. 11 0
      src/main/java/com/evp/comm/server/dto/EvpsSequenceDto.java
  3. 67 0
      src/main/java/com/evp/comm/server/dto/EvpsServiceDto.java
  4. 21 6
      src/main/java/com/evp/comm/server/entity/TbEvpEvent.java
  5. 6 3
      src/main/java/com/evp/comm/server/entity/TbEvpService.java
  6. 3 0
      src/main/java/com/evp/comm/server/entity/TbEvpsCenter.java
  7. 4 0
      src/main/java/com/evp/comm/server/repository/ApplicationRepository.java
  8. 1 1
      src/main/java/com/evp/comm/server/service/UnitSystService.java
  9. 1 1
      src/main/java/com/evp/comm/server/xnet/server/handler/EvpCommServerInboundMessageHandler.java
  10. 49 36
      src/main/java/com/evp/comm/server/xnet/server/process/protocol/EvpsCommPacket.java
  11. 8 8
      src/main/java/com/evp/comm/server/xnet/server/process/protocol/EvpsProtocolConst.java
  12. 1 1
      src/main/java/com/evp/comm/server/xnet/server/process/protocol/eEvpsOpCode.java
  13. 63 31
      src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsEvent.java
  14. 153 0
      src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsNode.java
  15. 0 73
      src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsRoute.java
  16. 161 102
      src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsService.java
  17. 71 83
      src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsServiceEnd.java
  18. 2 2
      src/main/java/com/evp/comm/server/xnet/server/process/work/DataPacketProcess.java
  19. 38 32
      src/test/java/com/evp/comm/server/EvpCommServerApplicationTests.java

+ 5 - 3
src/main/java/com/evp/comm/server/dto/EvpsCenter.java

@@ -6,23 +6,24 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
-import java.io.Serializable;
+import java.util.HashMap;
 
 @Slf4j
 @Data
 @Builder
 @NoArgsConstructor//(access = AccessLevel.PROTECTED)
 @AllArgsConstructor
-public class EvpsCenter implements Serializable {
-    private static final long serialVersionUID = 1L;
+public class EvpsCenter {
 
     private int idx;
     private String centerId;        /* 지역 코드 */
     private String centerNm;        /* 지역 명 */
     private String ipAddress;       /* IP Address */
+    private String currentServiceId;
     private boolean useYn;
 
     private boolean dump;
+    private HashMap<Integer, EvpsSequenceDto> sequenceMap = new HashMap<>();
 
     // 센터 네트워크 상태 정보
     private NetState netState;
@@ -32,6 +33,7 @@ public class EvpsCenter implements Serializable {
     }
 
     public void update(EvpsCenter dto) {
+        this.currentServiceId = dto.getCurrentServiceId();
         this.centerNm = dto.getCenterNm();
         this.ipAddress = dto.getIpAddress();
         this.useYn = dto.isUseYn();

+ 11 - 0
src/main/java/com/evp/comm/server/dto/EvpsSequenceDto.java

@@ -0,0 +1,11 @@
+package com.evp.comm.server.dto;
+
+import lombok.Data;
+
+@Data
+public class EvpsSequenceDto {
+
+    private Integer sequence;
+    private String serviceId;
+
+}

+ 67 - 0
src/main/java/com/evp/comm/server/dto/EvpsServiceDto.java

@@ -0,0 +1,67 @@
+package com.evp.comm.server.dto;
+
+import com.evp.comm.server.entity.TbEvpService;
+import lombok.Data;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+@Data
+public class EvpsServiceDto {
+
+    private boolean completed;
+    private String serviceId;
+
+    private TbEvpService service;
+
+    private ByteBuffer routeBuffer;
+    private ByteBuffer nodeBuffer;
+
+    public EvpsServiceDto(String serviceId) {
+        this.completed = false;
+        this.serviceId = serviceId;
+        this.service = new TbEvpService();
+        this.routeBuffer = null;
+        this.nodeBuffer = null;
+    }
+
+    public void clearRouteBuffer() {
+        this.routeBuffer = null;
+    }
+
+    public void addRouteBuffer(byte[] buffer) {
+        if (buffer == null) {
+            return;
+        }
+        if (this.routeBuffer == null) {
+            this.routeBuffer = ByteBuffer.wrap(buffer);
+            routeBuffer.order(ByteOrder.BIG_ENDIAN);
+        }
+        else {
+            byte[] prevBuffer = this.routeBuffer.array();
+            this.routeBuffer = ByteBuffer.allocate(prevBuffer.length + buffer.length);
+            this.routeBuffer.put(prevBuffer);
+            this.routeBuffer.put(buffer);
+        }
+    }
+
+    public void clearNodeBuffer() {
+        this.nodeBuffer = null;
+    }
+
+    public void addNodeBuffer(byte[] buffer) {
+        if (buffer == null) {
+            return;
+        }
+        if (this.nodeBuffer == null) {
+            this.nodeBuffer = ByteBuffer.wrap(buffer);
+            nodeBuffer.order(ByteOrder.BIG_ENDIAN);
+        }
+        else {
+            byte[] prevBuffer = this.nodeBuffer.array();
+            this.nodeBuffer = ByteBuffer.allocate(prevBuffer.length + buffer.length);
+            this.nodeBuffer.put(prevBuffer);
+            this.nodeBuffer.put(buffer);
+        }
+    }
+}

+ 21 - 6
src/main/java/com/evp/comm/server/entity/TbEvpEvent.java

@@ -1,9 +1,6 @@
 package com.evp.comm.server.entity;
 
-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -13,11 +10,12 @@ import java.util.Date;
 * tb_evp_event
 */
 @Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
 public class TbEvpEvent implements Serializable {
 
+    public static final int EVPS_EVENT_SERVICE_START = 0;
+    public static final int EVPS_EVENT_VEHICLE_MOVE = 1;
+    public static final int EVPS_EVENT_SERVICE_END = 2;
+
     /**
     * 수집시각
     */
@@ -26,6 +24,10 @@ public class TbEvpEvent implements Serializable {
     * 긴급차량 서비스 ID
     */
     private String serviceId;
+    /**
+     * 긴급차량 번호(Not Used)
+     */
+    private String evNo;
     /**
     * 이벤트 코드(0:서비스시작, 1:차량위치, 2:서비스종료)
     */
@@ -47,4 +49,17 @@ public class TbEvpEvent implements Serializable {
     */
     private Integer remDist;
 
+    public TbEvpEvent(String serviceId, int eventCd) {
+        this.serviceId = serviceId;
+        this.eventCd = eventCd;
+        init();
+    }
+
+    private void init() {
+        this.curLat = 0;
+        this.curLng = 0;
+        this.curSpd = 0;
+        this.remDist = 0;
+        this.evNo = "";
+    }
 }

+ 6 - 3
src/main/java/com/evp/comm/server/entity/TbEvpService.java

@@ -18,6 +18,8 @@ import java.util.Date;
 @AllArgsConstructor
 public class TbEvpService implements Serializable {
 
+    public static final int SERVICE_START = 1;
+
     /**
     * 긴급차량 서비스 ID
     */
@@ -75,7 +77,8 @@ public class TbEvpService implements Serializable {
     */
     private Integer statusCd;
 
-    public void init() {
-
-    }
+    /**
+     * 현재 차량 속도(DTO 에서만 사용할 변수)
+     */
+    private Integer curSpd;
 }

+ 3 - 0
src/main/java/com/evp/comm/server/entity/TbEvpsCenter.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.HashMap;
 
 @Data
 @Builder
@@ -28,6 +29,8 @@ public class TbEvpsCenter implements Serializable {
                 .ipAddress(this.ipAddress.trim())
                 .useYn("Y".equals(this.useYn))
                 .dump(false)
+                .currentServiceId("")
+                .sequenceMap(new HashMap<>())
                 .build();
     }
 }

+ 4 - 0
src/main/java/com/evp/comm/server/repository/ApplicationRepository.java

@@ -4,6 +4,7 @@ import com.evp.app.common.utils.Elapsed;
 import com.evp.app.common.xnet.NettyUtils;
 import com.evp.comm.server.dao.mapper.EvpsCenterMapper;
 import com.evp.comm.server.dto.EvpsCenter;
+import com.evp.comm.server.dto.EvpsServiceDto;
 import com.evp.comm.server.dto.NET;
 import com.evp.comm.server.dto.NetState;
 import com.evp.comm.server.entity.TbEvpsCenter;
@@ -40,6 +41,9 @@ public class ApplicationRepository {
             .netState(new NetState())
             .dump(false)
             .build();
+
+    public static final ConcurrentHashMap<String, EvpsServiceDto> serviceMap = new ConcurrentHashMap<>();
+
     private final ConcurrentHashMap<String, EvpsCenter> centerMap = new ConcurrentHashMap<>();
     private final ConcurrentHashMap<String, EvpsCenter> ipAddrMap = new ConcurrentHashMap<>();
 

+ 1 - 1
src/main/java/com/evp/comm/server/service/UnitSystService.java

@@ -65,7 +65,7 @@ public class UnitSystService {
         String keyData = "unit";
         MDC.put("id", keyData);
 
-        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_PROCESS_STTS, ApplicationRepository.center, false, this.processId));
+        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_PROCESS_STTS, ApplicationRepository.center, this.processId));
 
         MDC.remove(keyData);
         MDC.clear();

+ 1 - 1
src/main/java/com/evp/comm/server/xnet/server/handler/EvpCommServerInboundMessageHandler.java

@@ -100,7 +100,7 @@ public class EvpCommServerInboundMessageHandler extends SimpleChannelInboundHand
                 .regionCd(center.getCenterId())
                 .commState(TbRegionCenterComm.CENTER_COMM_STOP)
                 .build();
-        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_CENTER_STTS, center, false, stts));
+        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_CENTER_STTS, center, stts));
     }
 
     @Override

+ 49 - 36
src/main/java/com/evp/comm/server/xnet/server/process/protocol/EvpsCommPacket.java

@@ -17,7 +17,9 @@ public class EvpsCommPacket implements Serializable {
     private final EvpsCenter center;
     private final long timestamp;
     private final int  frameLength;
+    private final byte[] headBuffer;
     private final byte[] buffer;
+
     /**
      * Protocol Format
      * START_1      통신프레임의 시작 부호 1 (‘U’)                           1
@@ -56,7 +58,7 @@ public class EvpsCommPacket implements Serializable {
     protected boolean isValid;
 
     private void decode() {
-        if (this.frameLength < (EvpsProtocolConst.EVPS_HEAD_SIZE)) {
+        if (this.frameLength < EvpsProtocolConst.EVPS_HEAD_SIZE) {
             this.stx1       = EvpsProtocolConst.EVPS_NULL;
             this.stx2       = EvpsProtocolConst.EVPS_NULL;
             this.opCode     = EvpsProtocolConst.EVPS_NULL;
@@ -77,51 +79,62 @@ public class EvpsCommPacket implements Serializable {
         }
 
         int idx = 0;
-        this.stx1       = this.buffer[idx++];
-        this.stx2       = this.buffer[idx++];
-        this.opCode     = this.buffer[idx++];
-        this.sequence   = ((this.buffer[idx++] & 0xFF) << 8) | (this.buffer[idx++] & 0xFF);
-        this.current    = ((this.buffer[idx++] & 0xFF) << 8) | (this.buffer[idx++] & 0xFF);
-        this.total      = ((this.buffer[idx++] & 0xFF) << 8) | (this.buffer[idx++] & 0xFF);
-
-        this.year       = ((this.buffer[idx++] & 0xFF) << 8) | (this.buffer[idx++] & 0xFF);
-        this.month      = (short)(this.buffer[idx++] & 0xFF);
-        this.day        = (short)(this.buffer[idx++] & 0xFF);
-        this.hour       = (short)(this.buffer[idx++] & 0xFF);
-        this.min        = (short)(this.buffer[idx++] & 0xFF);
-        this.sec        = (short)(this.buffer[idx++] & 0xFF);
-        this.dataLength = ((this.buffer[idx++] & 0xFF) << 8) | (this.buffer[idx++] & 0xFF);
+        this.stx1       = this.headBuffer[idx++];
+        this.stx2       = this.headBuffer[idx++];
+        this.opCode     = this.headBuffer[idx++];
+        this.sequence   = ((this.headBuffer[idx++] & 0xFF) << 8) | (this.headBuffer[idx++] & 0xFF);
+        this.current    = ((this.headBuffer[idx++] & 0xFF) << 8) | (this.headBuffer[idx++] & 0xFF);
+        this.total      = ((this.headBuffer[idx++] & 0xFF) << 8) | (this.headBuffer[idx++] & 0xFF);
 
+        this.year       = ((this.headBuffer[idx++] & 0xFF) << 8) | (this.headBuffer[idx++] & 0xFF);
+        this.month      = (short)(this.headBuffer[idx++] & 0xFF);
+        this.day        = (short)(this.headBuffer[idx++] & 0xFF);
+        this.hour       = (short)(this.headBuffer[idx++] & 0xFF);
+        this.min        = (short)(this.headBuffer[idx++] & 0xFF);
+        this.sec        = (short)(this.headBuffer[idx++] & 0xFF);
+        this.dataLength = ((this.headBuffer[idx++] & 0xFF) << 8) | (this.headBuffer[idx] & 0xFF);
         this.commDate = String.format("%4d%02d%02d%02d%02d%02d", this.year, this.month, this.day, this.hour, this.min, this.sec);
         this.isValid = true;
     }
 
-    public EvpsCommPacket(EvpsCenter center, byte[] byteBuff) {
-        this.timestamp = System.currentTimeMillis();
-        this.center = center;
-        this.frameLength = byteBuff.length;
-        this.buffer = new byte[this.frameLength];
-        System.arraycopy(byteBuff, 0, this.buffer, 0, this.frameLength);
-        decode();
-    }
+//    public EvpsCommPacket(EvpsCenter center, byte[] byteBuff) {
+//        this.timestamp = System.currentTimeMillis();
+//        this.center = center;
+//        this.frameLength = byteBuff.length;
+//        this.headBuffer = new byte[this.frameLength];
+//        System.arraycopy(byteBuff, 0, this.headBuffer, 0, this.frameLength);
+//        decode();
+//    }
+
+//    public EvpsCommPacket(EvpsCenter center, ByteBuf byteBuf) {
+//    this.timestamp = System.currentTimeMillis();
+//    this.center = center;
+//    this.frameLength = byteBuf.readableBytes();
+//    this.headBuffer = new byte[this.frameLength];
+//    byteBuf.getBytes(byteBuf.readerIndex(), this.headBuffer);
+//    decode();
+//    if (this.isValid) {
+//        this.buffer = new byte[1];
+//    }
+//    else {
+//        this.buffer = new byte[1];
+//    }
+//}
 
     public EvpsCommPacket(EvpsCenter center, ByteBuf byteBuf) {
         this.timestamp = System.currentTimeMillis();
         this.center = center;
         this.frameLength = byteBuf.readableBytes();
-        this.buffer = new byte[this.frameLength];
-        byteBuf.getBytes(byteBuf.readerIndex(), this.buffer);
+        this.headBuffer = new byte[EvpsProtocolConst.EVPS_HEAD_SIZE];
+        byteBuf.getBytes(0, this.headBuffer);
+        if ((this.frameLength - EvpsProtocolConst.EVPS_HEAD_SIZE) > 0) {
+            this.buffer = new byte[this.frameLength - EvpsProtocolConst.EVPS_HEAD_SIZE];
+            byteBuf.getBytes(EvpsProtocolConst.EVPS_HEAD_SIZE, this.buffer);
+        }
+        else {
+            this.buffer = new byte[1];
+        }
         decode();
     }
-//
-//    public boolean checkDataLength(int dataSize) {
-//        int dataLength = this.count * dataSize;
-//        return (dataLength == (this.packetLength - EvpsProtocolConst.EVPS_HEAD_SIZE - EvpsProtocolConst.SIG_TAIL_SIZE));
-//    }
-//    public int getReqDataLength(int dataSize) {
-//        return this.count * dataSize;
-//    }
-//    public int getCurDataLength() {
-//        return (this.packetLength - EvpsProtocolConst.EVPS_HEAD_SIZE - EvpsProtocolConst.SIG_TAIL_SIZE);
-//    }
+
 }

+ 8 - 8
src/main/java/com/evp/comm/server/xnet/server/process/protocol/EvpsProtocolConst.java

@@ -21,20 +21,20 @@ public class EvpsProtocolConst {
      *              제외한 8174바이트가 DATA 의 최대 길이임.                 2
      * ****************************************************************************************************************/
 
-    public static final int EVPS_MAX_PACKET = 8192;         /* 한번에 전송하는 최대 패킷 크기, 8192 */
-    public static final int EVPS_HEAD_SIZE = 18;            /* 프로토콜 헤더 크기 16 byte */
-    public static final int EVPS_PACKET_LENGTH_FIELD_OFFSET = 16;
-    public static final int EVPS_PACKET_LENGTH_FIELD_SIZE = 2;
-    public static final int EVPS_PACKET_LENGTH_ADJUSTMENTS = 0;  /* Length Field 이후의 데이터 나머지 크기 */
+    public static final int EVPS_MAX_PACKET = 8192;                 /* 한번에 전송하는 최대 패킷 크기, 8192 */
+    public static final int EVPS_HEAD_SIZE = 18;                    /* 프로토콜 헤더 크기 16 byte */
+    public static final int EVPS_PACKET_LENGTH_FIELD_OFFSET = 16;   /* Netty Fixed Packet Length position */
+    public static final int EVPS_PACKET_LENGTH_FIELD_SIZE = 2;      /* Netty Fixed Packet Length field size */
+    public static final int EVPS_PACKET_LENGTH_ADJUSTMENTS = 0;     /* Length Field 이후의 데이터 나머지 크기 */
 
     public static final byte EVPS_STX1 = 'U';  /* STX1 */
     public static final byte EVPS_STX2 = 'E';  /* STX1 */
     public static final byte EVPS_NULL = (byte)0x00;
 
     public static final int MIN_SERVICE_DATA_SIZE = 199;
-    public static final int MIN_NODE_DATA_SIZE = 21;     //(19+2);
-    public static final int EVENT_DATA_SIZE = 45;        //(19+10+4+4+4+4);
-    public static final int EVENT_SERVICE_END_SIZE = 23; //(19+4);
+    public static final int MIN_NODE_DATA_SIZE = 21;     // (19+2);
+    public static final int EVENT_DATA_SIZE = 45;        // (19+10+4+4+4+4);
+    public static final int EVENT_SERVICE_END_SIZE = 23; // (19+4);
 
     public static final int EVPS_SERVICE_ID_SIZE = 19;
     public static final int EVPS_SERVICE_NAME_SIZE = 100;

+ 1 - 1
src/main/java/com/evp/comm/server/xnet/server/process/protocol/eEvpsOpCode.java

@@ -8,7 +8,7 @@ import java.util.Map;
 public enum eEvpsOpCode {
 
     EVPS_SERVICE     ( (byte)0x14, "긴급차량우선신호 발생에 따른 출발지-목적지 사이의 경로정보"),
-    EVPS_ROUTE       ( (byte)0x15, "경로 내의 교차로 정보"),
+    EVPS_NODE        ( (byte)0x15, "경로 내의 교차로 정보"),
     EVPS_EVENT       ( (byte)0x16, "긴급차량의 위치와 속도 정보"),
     EVPS_SERVICE_END ( (byte)0x18, "긴급차량 서비스 종료"); // 사용 안함(예비)
 

+ 63 - 31
src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsEvent.java

@@ -1,13 +1,25 @@
 package com.evp.comm.server.xnet.server.process.response;
 
+import com.evp.comm.server.dto.EvpsCenter;
+import com.evp.comm.server.dto.EvpsServiceDto;
+import com.evp.comm.server.entity.TbEvpEvent;
+import com.evp.comm.server.process.dbms.DbmsData;
 import com.evp.comm.server.process.dbms.DbmsDataProcess;
+import com.evp.comm.server.repository.ApplicationRepository;
 import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.Arrays;
+
+/*
+serviceId       서비스ID          String      19
+evNo            차량번호          String      10
+currentLat      현재위치의 위도   Integer      4   ( DD.DDDDDD x 1000000 )
+currentLng      현재위치의 경도   Integer      4   ( DD.DDDDDD x 1000000 )
+speed           속도              Integer      4
+distance        잔여 거리         Integer      4   (단위: m), 목적지 까지의 잔여 거리
+ */
 
 @Slf4j
 public class EvpsEvent implements EvpsCommResponse {
@@ -22,37 +34,12 @@ public class EvpsEvent implements EvpsCommResponse {
         boolean result = true;
         try {
             MDC.put("id", packet.getCenter().getLogKey());
-            log.info("[{}], SigEventInfo.response.", packet.getCenter().getLogKey());
-
-            final int recordSize = 3;
-            if (!packet.getPacket().checkDataLength(recordSize)) {
-                log.error("[{}], SigPhaseChange.response: Data Length Error: Req({}), Cur({}). will be closed.",
-                        packet.getCenter().getLogKey(), packet.getPacket().getReqDataLength(recordSize), packet.getPacket().getCurDataLength());
-                return false;
-            }
-
-            List<HashMap<String, Object>> lists = new ArrayList<>();
-            String regionCd = packet.getCenter().getCenterId();
-            int idx = EvpsProtocolConst.EVPS_HEAD_SIZE;
-            byte[] buffer = packet.getPacket().getBuffer();
-            for (int ii = 0; ii < packet.getPacket().getCount(); ii++) {
-                HashMap<String, Object> param = new HashMap<>();
-                int intNo = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                int event = (buffer[idx++] & 0xFF);
-
-                String eventCd = String.format("%02x", event);
+            log.info("[{}], EvpsEvent.response.", packet.getCenter().getLogKey());
 
-                param.put("REGION_CD",  regionCd);
-                param.put("INT_NO",     intNo);
-                param.put("EVENT_CD",   eventCd);
-
-                lists.add(param);
-            }
-
-//            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INT_EVENT_INFO, packet.getCenter(), false, lists));
+            return makeData(packet.getCenter(), packet.getPacket().getBuffer());
         }
         catch (Exception e) {
-            log.error("[{}], SigEventInfo.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
+            log.error("[{}], EvpsEvent.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
             result = false;
         }
         finally {
@@ -62,4 +49,49 @@ public class EvpsEvent implements EvpsCommResponse {
         return result;
     }
 
+    private boolean makeData(EvpsCenter center, byte[] buffer) {
+        if (buffer == null || buffer.length != EvpsProtocolConst.EVENT_DATA_SIZE) {
+            log.error("[{}], EvpsEvent.response: Data Length Error: Required data length({}), Cur({}). will be closed.",
+                    center.getLogKey(), EvpsProtocolConst.EVENT_DATA_SIZE, buffer == null ? 0 : buffer.length);
+            return false;
+        }
+
+        int idx = 0;
+        // 서비스ID
+        byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
+        idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
+        // 차량번호
+        byte[] vehNoArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE);
+        idx += EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE;
+        // 현재위치LAT
+        int currentLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 현재위치LNG
+        int currentLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 속도
+        int speed      = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 잔여 거리
+        int distance   = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+
+        // 이벤트 정보 입력(차량 이동)
+        TbEvpEvent event = new TbEvpEvent(new String(serviceIdArr).trim(), TbEvpEvent.EVPS_EVENT_VEHICLE_MOVE);
+        event.setEvNo(new String(vehNoArr).trim());
+        event.setCurLat(currentLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
+        event.setCurLng(currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
+        event.setCurSpd(speed);
+        event.setRemDist(distance);
+
+        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_EVENT, center, event));
+
+        EvpsServiceDto currService = ApplicationRepository.serviceMap.get(event.getServiceId());
+        if (currService == null) {
+            log.error("[{}], EvpsEvent.response: Not Found Service Information. Service Id: {}", center.getLogKey(), event.getServiceId());
+        }
+        else {
+            currService.getService().setCurLat(event.getCurLat());
+            currService.getService().setCurLng(event.getCurLng());
+            currService.getService().setCurSpd(event.getCurSpd());
+            currService.getService().setServiceDist(event.getRemDist());
+        }
+        return true;
+    }
 }

+ 153 - 0
src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsNode.java

@@ -0,0 +1,153 @@
+package com.evp.comm.server.xnet.server.process.response;
+
+import com.evp.comm.server.dto.EvpsCenter;
+import com.evp.comm.server.dto.EvpsSequenceDto;
+import com.evp.comm.server.dto.EvpsServiceDto;
+import com.evp.comm.server.process.dbms.DbmsData;
+import com.evp.comm.server.process.dbms.DbmsDataProcess;
+import com.evp.comm.server.repository.ApplicationRepository;
+import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/*
+serviceId       서비스ID        String      19
+lcList          교차로 갯수     Integer     2
+    intLcNo1    교차로 번호1    Integer     4       국토부 표준 NODE ID
+    intName1    교차로명1       String      100     교차로명
+    intLat1     교차로LAT1      Integer     4       ( DD.DDDDDD x 1000000 )
+    intLng1     교차로LNG1      Integer     4       ( DDD.DDDDDD x 1000000 )
+ */
+
+@Slf4j
+public class EvpsNode implements EvpsCommResponse {
+    private final DbmsDataProcess dbmsDataProcess;
+
+    public EvpsNode(DbmsDataProcess dbmsDataProcess) {
+        this.dbmsDataProcess = dbmsDataProcess;
+    }
+
+    @Override
+    public boolean response(RecvPacketDto packet) {
+        boolean result = true;
+        try {
+            MDC.put("id", packet.getCenter().getLogKey());
+            log.info("[{}], EvpsNode.response.", packet.getCenter().getLogKey());
+
+            if (packet.getPacket().getCurrent() == 1 && packet.getPacket().getTotal() == 1) {
+                // 모든 정보가 하나의 프레임으로 전송된 경우
+                return makeData(packet.getCenter(), packet.getPacket().getBuffer());
+            }
+
+            // 패킷이 분할되어 전송된 경우
+            EvpsServiceDto serviceDto = null;
+            int sequence = packet.getPacket().getSequence();
+            if (packet.getPacket().getCurrent() == 1) {
+                // 첫번째 프레임
+                // sequence 에 대항하는 서비스 정보를 메모리에 저장하고 서비스 ID에 대한 메모리 정보를 얻는다.
+                byte[] serviceIdArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), 0, EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
+                String serviceId = new String(serviceIdArr).trim();
+                EvpsSequenceDto sequenceDto = new EvpsSequenceDto();
+                sequenceDto.setSequence(sequence);
+                sequenceDto.setServiceId(serviceId);
+                packet.getCenter().getSequenceMap().put(sequence, sequenceDto); // SequenceMap 에 SequenceDto 를 저장한다.
+                // 서비스 정보를 메모리에서 얻어온다.
+                serviceDto = ApplicationRepository.serviceMap.get(serviceId);
+            }
+            else {
+                // 분할된 프레임
+                // sequence 에 대한 정보를 메모리에서 구하고 얻어온 서비스 ID로 서비스 정보를 메모리에서 얻어온다.
+                EvpsSequenceDto sequenceDto = packet.getCenter().getSequenceMap().get(sequence);
+                if (sequenceDto != null) {
+                    // 서비스 정보를 메모리에서 얻어온다.
+                    serviceDto = ApplicationRepository.serviceMap.get(sequenceDto.getServiceId());
+                }
+            }
+
+            if (serviceDto == null) {
+                // 서비스 정보를 메모리에서 얻어 오지 못한 경우.
+                log.error("[{}], EvpsNode.response: Not Found Service Information. Sequence: {}, Curr: ({}), Tot: ({})",
+                        packet.getCenter().getLogKey(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
+                return false;
+            }
+
+            // 서비스 메모리에 교차로 정보 패킷을 순차적으로 적재
+            serviceDto.addNodeBuffer(packet.getPacket().getBuffer());
+            if (packet.getPacket().getCurrent() == packet.getPacket().getTotal()) {
+                // 분할된 프레임을 모두 받았음. 즉 마지막 프레임을 수신한 경우 데이터 처리
+                log.info("[{}], EvpsNode.response: Recv All Frames. Service Id: {}, Sequence: {}, Curr: ({}), Tot: ({})",
+                        packet.getCenter().getLogKey(), serviceDto.getServiceId(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
+
+                // 저장한 프레임 전체를 이용해서 데이터 생성
+                result = makeData(packet.getCenter(), serviceDto.getNodeBuffer().array());
+
+                // SequenceMap 에서 SequenceDto 를 제거한다.
+                packet.getCenter().getSequenceMap().remove(sequence);
+            }
+        }
+        catch (Exception e) {
+            log.error("[{}], EvpsNode.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
+            result = false;
+        }
+        finally {
+            MDC.remove(packet.getCenter().getLogKey());
+            MDC.clear();
+        }
+        return result;
+    }
+
+    private boolean makeData(EvpsCenter center, byte[] buffer) {
+        if (buffer == null || buffer.length < EvpsProtocolConst.MIN_NODE_DATA_SIZE) {
+            log.error("[{}], EvpsNode.response: Data Length Error: Required minimum data length({}), Cur({}). will be closed.",
+                    center.getLogKey(), EvpsProtocolConst.MIN_NODE_DATA_SIZE, buffer == null ? 0: buffer.length);
+            return false;
+        }
+
+        // 서비스ID
+        int idx = 0;
+        byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
+        idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
+        String serviceId = new String(serviceIdArr).trim();
+
+        // 교차로수(2 Byte)
+        int nodeCount = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        int reqNodeSize = nodeCount * 112;  // nodeId(4), name(100), lat(4), lng(4)
+        int reqDataSize = EvpsProtocolConst.MIN_NODE_DATA_SIZE + reqNodeSize;
+        if (buffer.length != reqDataSize) {
+            log.error("[{}], EvpsNode.response: Data Length Error: Required data length({}), Cur({}). will be closed.",
+                    center.getLogKey(), reqDataSize, buffer.length);
+            return false;
+        }
+
+        List<HashMap<String, Object>> lists = new ArrayList<>();
+        for (int ii = 0; ii < nodeCount; ii++) {
+            int nodeId       = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+            byte[] nodeNmArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_NODE_NAME_SIZE);
+            idx += EvpsProtocolConst.EVPS_NODE_NAME_SIZE;
+            int currentLat   = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+            int currentLng   = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+
+            HashMap<String, Object> param = new HashMap<>();
+            param.put("SERVICE_ID",  serviceId);
+            param.put("SEQ_NO",      ii+1);
+            param.put("NODE_ID",     nodeId);
+            param.put("NODE_NM",     new String(nodeNmArr).trim());
+            param.put("LAT",         currentLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
+            param.put("LNG",         currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
+
+            lists.add(param);
+        }
+
+        log.info("[{}], EvpsNode.response: Service Node List {} EA.", center.getLogKey(), lists.size());
+
+        if (!lists.isEmpty()) {
+            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_NODE, center, lists));
+        }
+        return true;
+    }
+}

+ 0 - 73
src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsRoute.java

@@ -1,73 +0,0 @@
-package com.evp.comm.server.xnet.server.process.response;
-
-import com.evp.comm.server.process.dbms.DbmsDataProcess;
-import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-@Slf4j
-public class EvpsRoute implements EvpsCommResponse {
-    private final DbmsDataProcess dbmsDataProcess;
-
-    public EvpsRoute(DbmsDataProcess dbmsDataProcess) {
-        this.dbmsDataProcess = dbmsDataProcess;
-    }
-
-    @Override
-    public boolean response(RecvPacketDto packet) {
-        boolean result = true;
-        try {
-            MDC.put("id", packet.getCenter().getLogKey());
-            log.info("[{}], SigHolidayPlan.response.", packet.getCenter().getLogKey());
-
-            final int recordSize = 92; // 2+(3*30)
-            if (!packet.getPacket().checkDataLength(recordSize)) {
-                log.error("[{}], SigHolidayPlan.response: Data Length Error: Req({}), Cur({}). will be closed.",
-                        packet.getCenter().getLogKey(), packet.getPacket().getReqDataLength(recordSize), packet.getPacket().getCurDataLength());
-                return false;
-            }
-
-            List<HashMap<String, Object>> lists = new ArrayList<>();
-            String regionCd = packet.getCenter().getCenterId();
-            int idx = EvpsProtocolConst.EVPS_HEAD_SIZE;
-            byte[] buffer = packet.getPacket().getBuffer();
-            for (int ii = 0; ii < packet.getPacket().getCount(); ii++) {
-                int intNo = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-
-                for (int jj = 0; jj < 30; jj++) {
-                    int mon    = (buffer[idx++] & 0xFF);
-                    int day    = (buffer[idx++] & 0xFF);
-                    int planNo = (buffer[idx++] & 0xFF);
-
-                    HashMap<String, Object> param = new HashMap<>();
-
-                    param.put("REGION_CD",      regionCd);
-                    param.put("INT_NO",         intNo);
-                    param.put("PLAN_SN",        jj+1);
-
-                    param.put("INT_PLAN_NO",    planNo);
-                    param.put("HOLYDD_PLAN_MM", mon);
-                    param.put("HOLYDD_PLAN_DD", day);
-
-                    lists.add(param);
-                }
-            }
-
-//            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INT_HOLIDAY, packet.getCenter(), false, lists));
-        }
-        catch (Exception e) {
-            log.error("[{}], SigHolidayPlan.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
-            result = false;
-        }
-        finally {
-            MDC.remove(packet.getCenter().getLogKey());
-            MDC.clear();
-        }
-        return result;
-    }
-
-}

+ 161 - 102
src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsService.java

@@ -1,8 +1,13 @@
 package com.evp.comm.server.xnet.server.process.response;
 
+import com.evp.comm.server.dto.EvpsCenter;
+import com.evp.comm.server.dto.EvpsSequenceDto;
+import com.evp.comm.server.dto.EvpsServiceDto;
+import com.evp.comm.server.entity.TbEvpEvent;
 import com.evp.comm.server.entity.TbEvpService;
 import com.evp.comm.server.process.dbms.DbmsData;
 import com.evp.comm.server.process.dbms.DbmsDataProcess;
+import com.evp.comm.server.repository.ApplicationRepository;
 import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
@@ -30,6 +35,7 @@ routeList       경로수          Integer     2
     routeLng1   경로LNG1        Integer     4       ( DD.DDDDDD x 1000000 )
     ................................................................
  */
+
 @Slf4j
 public class EvpsService implements EvpsCommResponse {
     private final DbmsDataProcess dbmsDataProcess;
@@ -45,113 +51,56 @@ public class EvpsService implements EvpsCommResponse {
             MDC.put("id", packet.getCenter().getLogKey());
             log.info("[{}], EvpsService.response.", packet.getCenter().getLogKey());
 
+            if (packet.getPacket().getCurrent() == 1 && packet.getPacket().getTotal() == 1) {
+                // 모든 정보가 하나의 프레임으로 전송된 경우
+                return makeData(packet.getCenter(), packet.getPacket().getBuffer(), true);
+            }
+
+            // 패킷이 분할되어 전송된 경우
+            EvpsServiceDto serviceDto = null;
+            int sequence = packet.getPacket().getSequence();
             if (packet.getPacket().getCurrent() == 1) {
-                // 제일 첫번째 패킷
-                if (packet.getPacket().getFrameLength() < EvpsProtocolConst.MIN_SERVICE_DATA_SIZE) {
-                    log.error("[{}], EvpsService.response: Data Frame Length Error: Required minimum frame length({}), Cur({}). will be closed.",
-                            packet.getCenter().getLogKey(), EvpsProtocolConst.MIN_SERVICE_DATA_SIZE, packet.getPacket().getFrameLength());
-                    return false;
-                }
-                TbEvpService service = new TbEvpService();
-
-                int idx = EvpsProtocolConst.EVPS_HEAD_SIZE;
-                byte[] buffer = packet.getPacket().getBuffer();
-
-                // 서비스ID
-                byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
-                service.setServiceId(new String(serviceIdArr).trim());
-                idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
-
-                // 차량번호
-                byte[] vehNoArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE);
-                service.setEvNo(new String(vehNoArr).trim());
-                idx += EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE;
-
-                // 현재위치LAT
-                int currentLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setCurLat(currentLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
-
-                // 현재위치LNG
-                int currentLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setCurLng(currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
-
-                // 서비스명
-                byte[] serviceNameArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE);
-                service.setServiceNm(new String(serviceNameArr).trim());
-                idx += EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE;
-
-                // 도착위치LAT
-                int arrivalLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setArrLat(arrivalLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
-
-                // 도착위치LNG
-                int arrivalLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setArrLng(arrivalLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
-
-                // 차량길이
-                int vehicleLength = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setVehLen(vehicleLength);
-
-                // 재난번호
-                byte[] ocrNoArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_OCR_NO_SIZE);
-                service.setOcrNo(new String(ocrNoArr).trim());
-                idx += EvpsProtocolConst.EVPS_OCR_NO_SIZE;
-
-                // 재난종별명
-                byte[] ocrTypeArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_OCR_TYPE_SIZE);
-                service.setOcrType(new String(ocrTypeArr).trim());
-                idx += EvpsProtocolConst.EVPS_OCR_TYPE_SIZE;
-
-                // 예상도착시각
-                int arrivalTime = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setArrTm(arrivalTime);
-
-                // 거리
-                int distance = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                service.setServiceDist(distance);
-
-                service.setStatusCd(0);
-
-                this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_SERVICE, packet.getCenter(), service));
-
-                if (packet.getPacket().getTotal() == 1) {
-                    // 프레임이 한번에 전송되어서 온것
-                    // 경로수
-                    int routeCount = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                    int reqRouteSize = routeCount * 8;  // lat(4), lng(4)
-                    if (packet.getPacket().getFrameLength() != EvpsProtocolConst.EVPS_HEAD_SIZE + EvpsProtocolConst.MIN_SERVICE_DATA_SIZE + reqRouteSize) {
-                        List<HashMap<String, Object>> lists = new ArrayList<>();
-                        for (int ii = 0; ii < routeCount; ii++) {
-
-                            int routeLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                            int routeLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-
-                            service.setArrLng(arrivalLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
-
-                            HashMap<String, Object> param = new HashMap<>();
-                            param.put("SERVICE_ID",  service.getServiceId());
-                            param.put("SEQ_NO",      ii+1);
-                            param.put("LAT",         routeLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
-                            param.put("LNG",         routeLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
-
-                            lists.add(param);
-                        }
-                        if (!lists.isEmpty()) {
-                            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_ROUTE, packet.getCenter(), lists));
-                        }
-                    }
-                }
-                else {
-                    // 패킷이 분할되서 온것
-                }
+                // 첫번째 프레임
+                // sequence 에 대항하는 서비스 정보를 메모리에 저장하고 서비스 ID에 대한 메모리 정보를 얻는다.
+                byte[] serviceIdArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), 0, EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
+                String serviceId = new String(serviceIdArr).trim();
+                EvpsSequenceDto sequenceDto = new EvpsSequenceDto();
+                sequenceDto.setSequence(sequence);
+                sequenceDto.setServiceId(serviceId);
+                packet.getCenter().getSequenceMap().put(sequence, sequenceDto); // SequenceMap 에 SequenceDto 를 저장한다.
+                // 서비스 정보를 메모리에서 얻어온다.
+                serviceDto = ApplicationRepository.serviceMap.get(serviceId);
             }
             else {
-                // 패킷이 분할되서 온것
-
-                if (packet.getPacket().getCurrent() == packet.getPacket().getTotal()) {
-                    // 마지막 패킷이 들어온것
+                // 분할된 프레임
+                // sequence 에 대한 정보를 메모리에서 구하고 얻어온 서비스 ID로 서비스 정보를 메모리에서 얻어온다.
+                EvpsSequenceDto sequenceDto = packet.getCenter().getSequenceMap().get(sequence);
+                if (sequenceDto != null) {
+                    // 서비스 정보를 메모리에서 얻어온다.
+                    serviceDto = ApplicationRepository.serviceMap.get(sequenceDto.getServiceId());
                 }
             }
+
+            if (serviceDto == null) {
+                // 서비스 정보를 메모리에서 얻어 오지 못한 경우.
+                log.error("[{}], EvpsService.response: Not Found Service Information. Sequence: {}, Curr: ({}), Tot: ({})",
+                        packet.getCenter().getLogKey(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
+                return false;
+            }
+
+            // 서비스 메모리에 교차로 정보 패킷을 순차적으로 적재
+            serviceDto.addNodeBuffer(packet.getPacket().getBuffer());
+            if (packet.getPacket().getCurrent() == packet.getPacket().getTotal()) {
+                // 분할된 프레임을 모두 받았음. 즉 마지막 프레임을 수신한 경우 데이터 처리
+                log.info("[{}], EvpsService.response: Recv All Frames. Service Id: {}, Sequence: {}, Curr: ({}), Tot: ({})",
+                        packet.getCenter().getLogKey(), serviceDto.getServiceId(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
+
+                // 저장한 프레임 전체를 이용해서 데이터 생성
+                result = makeData(packet.getCenter(), serviceDto.getNodeBuffer().array(), false);
+
+                // SequenceMap 에서 SequenceDto 를 제거한다.
+                packet.getCenter().getSequenceMap().remove(sequence);
+            }
         }
         catch (Exception e) {
             log.error("[{}], EvpsService.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
@@ -164,4 +113,114 @@ public class EvpsService implements EvpsCommResponse {
         return result;
     }
 
+    private boolean makeData(EvpsCenter center, byte[] buffer, boolean oneFrame) {
+        if (buffer == null || buffer.length < EvpsProtocolConst.MIN_SERVICE_DATA_SIZE) {
+            log.error("[{}], EvpsService.response: Data Length Error: Required minimum data length({}), Cur({}). will be closed.",
+                    center.getLogKey(), EvpsProtocolConst.MIN_SERVICE_DATA_SIZE, buffer == null ? 0 : buffer.length);
+            return false;
+        }
+        // 첫번째 패킷인 경우 서비스 정보를 메모리에 저장하고 데이터베이스에 저장한다.
+        // 만일 분할 된 패킷인 경우 패킷을 메노리에 저장하고 리턴
+        int idx = 0;
+
+        // 서비스ID
+        byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
+        idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
+        // 차량번호
+        byte[] vehNoArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE);
+        idx += EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE;
+        // 현재위치LAT
+        int currentLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 현재위치LNG
+        int currentLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 서비스명
+        byte[] serviceNameArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE);
+        idx += EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE;
+        // 도착위치LAT
+        int arrivalLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 도착위치LNG
+        int arrivalLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 차량길이
+        int vehicleLength = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 재난번호
+        byte[] ocrNoArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_OCR_NO_SIZE);
+        idx += EvpsProtocolConst.EVPS_OCR_NO_SIZE;
+        // 재난종별명
+        byte[] ocrTypeArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_OCR_TYPE_SIZE);
+        idx += EvpsProtocolConst.EVPS_OCR_TYPE_SIZE;
+        // 예상도착시각
+        int arrivalTime = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        // 거리
+        int distance = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+
+        // 서비스 시작 정보 입력
+        TbEvpService service = new TbEvpService();
+        service.setServiceId(new String(serviceIdArr).trim());
+        service.setEvNo(new String(vehNoArr).trim());
+        service.setCurLat(currentLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
+        service.setCurLng(currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
+        service.setServiceNm(new String(serviceNameArr).trim());
+        service.setArrLat(arrivalLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
+        service.setArrLng(arrivalLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
+        service.setVehLen(vehicleLength);
+        service.setOcrNo(new String(ocrNoArr).trim());
+        service.setOcrType(new String(ocrTypeArr).trim());
+        service.setArrTm(arrivalTime);
+        service.setServiceDist(distance);
+        service.setStatusCd(TbEvpService.SERVICE_START);
+
+        EvpsServiceDto serviceDto = new EvpsServiceDto(service.getServiceId());
+        serviceDto.setService(service);
+
+        if (oneFrame) {
+            ApplicationRepository.serviceMap.put(service.getServiceId(), serviceDto);
+
+            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_SERVICE, center, service));
+
+            // 이벤트 정보 입력(서비스 시작)
+            TbEvpEvent event = new TbEvpEvent(service.getServiceId(), TbEvpEvent.EVPS_EVENT_SERVICE_START);
+            event.setCurLat(service.getCurLat());
+            event.setCurLng(service.getCurLng());
+            event.setCurSpd(service.getCurSpd());
+            event.setRemDist(service.getServiceDist());
+            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_EVENT, center, event));
+            return true;
+        }
+
+        int routeCount = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+        int reqRouteSize = routeCount * 8;  // lat(4), lng(4)
+        int reqDataSize = EvpsProtocolConst.EVPS_HEAD_SIZE + EvpsProtocolConst.MIN_SERVICE_DATA_SIZE + reqRouteSize;
+        if (buffer.length != reqDataSize) {
+            log.error("[{}], EvpsService.response: Data Length Error: Required data length({}), Cur({}). will be closed.",
+                    center.getLogKey(), reqDataSize, buffer.length);
+            return false;
+        }
+
+        List<HashMap<String, Object>> lists = new ArrayList<>();
+        for (int ii = 0; ii < routeCount; ii++) {
+
+            int routeLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+            int routeLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+
+            service.setArrLng(arrivalLng / EvpsProtocolConst.EVPS_GEO_CORRECT);
+
+            HashMap<String, Object> param = new HashMap<>();
+            param.put("SERVICE_ID", service.getServiceId());
+            param.put("SEQ_NO", ii + 1);
+            param.put("LAT", routeLat / EvpsProtocolConst.EVPS_GEO_CORRECT);
+            param.put("LNG", routeLng / EvpsProtocolConst.EVPS_GEO_CORRECT);
+
+            lists.add(param);
+        }
+        if (!lists.isEmpty()) {
+            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_ROUTE, center, lists));
+        }
+
+        log.info("[{}], EvpsService.response: Service Route List {} EA.", center.getLogKey(), lists.size());
+
+        if (!lists.isEmpty()) {
+            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_NODE, center, lists));
+        }
+        return true;
+    }
 }

+ 71 - 83
src/main/java/com/evp/comm/server/xnet/server/process/response/EvpsServiceEnd.java

@@ -1,13 +1,37 @@
 package com.evp.comm.server.xnet.server.process.response;
 
+import com.evp.comm.server.dto.EvpsCenter;
+import com.evp.comm.server.dto.EvpsServiceDto;
+import com.evp.comm.server.entity.TbEvpEvent;
+import com.evp.comm.server.entity.TbEvpService;
+import com.evp.comm.server.process.dbms.DbmsData;
 import com.evp.comm.server.process.dbms.DbmsDataProcess;
+import com.evp.comm.server.repository.ApplicationRepository;
 import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.Arrays;
+
+/*
+serviceId       서비스ID        String      19
+reason          종료코드        Integer     4
+    1: 진행중 - 서비스 진행중
+    2: 정상종료 - 모든 교차로 제어 및 해제 완료
+    3: 취소 - 아직 통과하지 않은 교차로 존재
+    4: 센터강제종료 - 운영자가 서비스를 강제로 종료
+    5: 비정상종료 - 서비스가 존재하지 않음
+    6: 서비스시작실패 - 제어대상교차로가 없음
+    8: 비정상종료 - 앱서버에 에러 발생
+    9: 비정상종료 - 일정시간 앱에서 위치 및 속도 정보가 오지 않는 경우
+    10: 자동종료 - 경로이탈
+    11: 자동종료 - 경로진입 가능시간 초과
+    12: 자동종료 - 정차가능시간 초과
+    13: 취소 - 모든 교차로 제어및 해제 완료
+    14: 실패 - 서비스 제어 요청 실패
+    15: 실패 - 서비스 가능 교차로가 존재하지 않음
+    16: 자동종료 - 위치정보 수신 가능 시간 초과
+ */
 
 @Slf4j
 public class EvpsServiceEnd implements EvpsCommResponse {
@@ -22,89 +46,12 @@ public class EvpsServiceEnd implements EvpsCommResponse {
         boolean result = true;
         try {
             MDC.put("id", packet.getCenter().getLogKey());
-            log.info("[{}], SigTodPlan.response.", packet.getCenter().getLogKey());
+            log.info("[{}], EvpsServiceEnd.response.", packet.getCenter().getLogKey());
 
-            final int recordSize = 323; // 3+(20*16)
-            if (!packet.getPacket().checkDataLength(recordSize)) {
-                log.error("[{}], SigTodPlan.response: Data Length Error: Req({}), Cur({}). will be closed.",
-                        packet.getCenter().getLogKey(), packet.getPacket().getReqDataLength(recordSize), packet.getPacket().getCurDataLength());
-                return false;
-            }
-            List<HashMap<String, Object>> lists = new ArrayList<>();
-            String regionCd = packet.getCenter().getCenterId();
-            int idx = EvpsProtocolConst.EVPS_HEAD_SIZE;
-            byte[] buffer = packet.getPacket().getBuffer();
-            for (int ii = 0; ii < packet.getPacket().getCount(); ii++) {
-                int intNo = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
-                int planNo = (buffer[idx++] & 0xFF);
-
-                for (int jj = 0; jj < 16; jj++) {
-                    int hour   = (buffer[idx++] & 0xFF);
-                    int min    = (buffer[idx++] & 0xFF);
-                    int cycle  = (buffer[idx++] & 0xFF);
-                    int offset = (buffer[idx++] & 0xFF);
-
-                    int phaseA1 = (buffer[idx++] & 0xFF);
-                    int phaseB1 = (buffer[idx++] & 0xFF);
-
-                    int phaseA2 = (buffer[idx++] & 0xFF);
-                    int phaseB2 = (buffer[idx++] & 0xFF);
-
-                    int phaseA3 = (buffer[idx++] & 0xFF);
-                    int phaseB3 = (buffer[idx++] & 0xFF);
-
-                    int phaseA4 = (buffer[idx++] & 0xFF);
-                    int phaseB4 = (buffer[idx++] & 0xFF);
-
-                    int phaseA5 = (buffer[idx++] & 0xFF);
-                    int phaseB5 = (buffer[idx++] & 0xFF);
-
-                    int phaseA6 = (buffer[idx++] & 0xFF);
-                    int phaseB6 = (buffer[idx++] & 0xFF);
-
-                    int phaseA7 = (buffer[idx++] & 0xFF);
-                    int phaseB7 = (buffer[idx++] & 0xFF);
-
-                    int phaseA8 = (buffer[idx++] & 0xFF);
-                    int phaseB8 = (buffer[idx++] & 0xFF);
-
-                    HashMap<String, Object> param = new HashMap<>();
-
-                    param.put("REGION_CD",              regionCd);
-                    param.put("INT_NO",                 intNo);
-                    param.put("INT_PLAN_NO",            planNo);
-                    param.put("INT_PLAN_IDX_NO",        jj+1);
-
-                    param.put("OPER_PLAN_HH",           hour);
-                    param.put("OPER_PLAN_MI",           min);
-                    param.put("INT_OPER_CYCLE_VAL",     cycle);
-                    param.put("INT_OPER_OFFSET_VAL",    offset);
-
-                    param.put("A_RING_1_PHASE_VAL",     phaseA1);
-                    param.put("A_RING_2_PHASE_VAL",     phaseA2);
-                    param.put("A_RING_3_PHASE_VAL",     phaseA3);
-                    param.put("A_RING_4_PHASE_VAL",     phaseA4);
-                    param.put("A_RING_5_PHASE_VAL",     phaseA5);
-                    param.put("A_RING_6_PHASE_VAL",     phaseA6);
-                    param.put("A_RING_7_PHASE_VAL",     phaseA7);
-                    param.put("A_RING_8_PHASE_VAL",     phaseA8);
-                    param.put("B_RING_1_PHASE_VAL",     phaseB1);
-                    param.put("B_RING_2_PHASE_VAL",     phaseB2);
-                    param.put("B_RING_3_PHASE_VAL",     phaseB3);
-                    param.put("B_RING_4_PHASE_VAL",     phaseB4);
-                    param.put("B_RING_5_PHASE_VAL",     phaseB5);
-                    param.put("B_RING_6_PHASE_VAL",     phaseB6);
-                    param.put("B_RING_7_PHASE_VAL",     phaseB7);
-                    param.put("B_RING_8_PHASE_VAL",     phaseB8);
-
-                    lists.add(param);
-                }
-            }
-
-//            this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INT_OPER_PLAN, packet.getCenter(), false, lists));
+            return makeData(packet.getCenter(), packet.getPacket().getBuffer());
         }
         catch (Exception e) {
-            log.error("[{}], SigTodPlan.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
+            log.error("[{}], EvpsServiceEnd.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
             result = false;
         }
         finally {
@@ -114,4 +61,45 @@ public class EvpsServiceEnd implements EvpsCommResponse {
         return result;
     }
 
+    private boolean makeData(EvpsCenter center, byte[] buffer) {
+        if (buffer == null || buffer.length != EvpsProtocolConst.EVENT_SERVICE_END_SIZE) {
+            log.error("[{}], EvpsServiceEnd.response: Data Length Error: Required data length({}), Cur({}). will be closed.",
+                    center.getLogKey(), EvpsProtocolConst.EVENT_SERVICE_END_SIZE, buffer == null ? 0 : buffer.length);
+            return false;
+        }
+
+        int idx = 0;
+        // 서비스ID
+        byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
+        idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
+        // 종료코드
+        int reason = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
+
+        // 서비스 종료 정보 업데이트
+        TbEvpService service = new TbEvpService();
+        service.setServiceId(new String(serviceIdArr).trim());
+        service.setStatusCd(reason);
+        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_UPD_SERVICE, center, service));
+
+        // 이벤트 정보 입력(서비스 종료)
+        TbEvpEvent event = new TbEvpEvent(service.getServiceId(), TbEvpEvent.EVPS_EVENT_SERVICE_END);
+
+        EvpsServiceDto currService = ApplicationRepository.serviceMap.get(event.getServiceId());
+        if (currService == null) {
+            log.error("[{}], EvpsServiceEnd.response: Not Found Service Information. Service Id: {}", center.getLogKey(), event.getServiceId());
+        }
+        else {
+            event.setCurLat(currService.getService().getCurLat());
+            event.setCurLng(currService.getService().getCurLng());
+            event.setCurSpd(currService.getService().getCurSpd());
+            event.setRemDist(currService.getService().getServiceDist());
+        }
+
+        this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_EVENT, center, event));
+
+        // 서비스를 메모리에서 삭제한다.
+        ApplicationRepository.serviceMap.remove(service.getServiceId());
+        center.setCurrentServiceId("");
+        return true;
+    }
 }

+ 2 - 2
src/main/java/com/evp/comm/server/xnet/server/process/work/DataPacketProcess.java

@@ -65,8 +65,8 @@ public class DataPacketProcess {
                 case EVPS_SERVICE:
                     response = new EvpsService(this.dbmsDataProcess);
                     break;
-                case EVPS_ROUTE:
-                    response = new EvpsRoute(this.dbmsDataProcess);
+                case EVPS_NODE:
+                    response = new EvpsNode(this.dbmsDataProcess);
                     break;
                 case EVPS_EVENT:
                     response = new EvpsEvent(this.dbmsDataProcess);

+ 38 - 32
src/test/java/com/evp/comm/server/EvpCommServerApplicationTests.java

@@ -1,16 +1,17 @@
 package com.evp.comm.server;
 
 import com.evp.app.common.utils.ByteUtils;
-import com.evp.comm.server.dto.NetState;
+import com.evp.app.common.utils.SysUtils;
 import com.evp.comm.server.dto.EvpsCenter;
-import com.evp.comm.server.xnet.server.process.protocol.EvpsCommPacket;
-import com.evp.comm.server.xnet.server.process.response.RecvPacketDto;
+import com.evp.comm.server.dto.NetState;
+import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import java.util.HashMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -22,40 +23,45 @@ public class EvpCommServerApplicationTests {
 
     public static final EvpsCenter rCenter = EvpsCenter.builder()
             .idx(0)
-            .isDeleted(false)
             .centerId("L01")
             .centerNm("UTIC SIGNAL 센터")
             .ipAddress("127.0.0.1")
-            .loginId("")
-            .loginPswd("")
-            .fileUpdDt("")
-            .simulateFlag(false)
-            .regionId(7600)
-            .extYn(false)
-            .realtimeYn(false)
-            .dbaseYn(false)
-            .commHistYn(false)
-            .minIntNo(0)
-            .maxIntNo(65535)
-            .intCount(65535)
             .netState(new NetState())
-            .intMap(new HashMap<>())
+            .useYn(true)
             .dump(false)
             .build();
 
+    @Test
+    void test3() {
+        String data = "000102030405060708090A000102030405060708090A000102030405060708090A";
+        byte[] inBytes = ByteUtils.hexToByteArray(data);
+        ByteBuf byteBuf = Unpooled.copiedBuffer(inBytes);
+        log.info("readableBytes: {}", byteBuf.readableBytes());
+        log.info("readerIndex: {}", byteBuf.readerIndex());
+        byte[] buffer = new byte[EvpsProtocolConst.EVPS_HEAD_SIZE];
+        byteBuf.getBytes(0, buffer);
+        log.info("buffer: {}", SysUtils.byteArrayToHex(buffer));
+
+        byte[] buffer2 = new byte[inBytes.length - EvpsProtocolConst.EVPS_HEAD_SIZE];
+        byteBuf.getBytes(EvpsProtocolConst.EVPS_HEAD_SIZE, buffer2);
+        log.info("buffer: {}", SysUtils.byteArrayToHex(buffer2));
+
+        log.info("readableBytes: {}", byteBuf.readableBytes());
+        log.info("readerIndex: {}", byteBuf.readerIndex());
+    }
     @Test
     void testDecompress() {
         //ReadableBytes: 113 Bytes
         String data = "02C518081A01061A11571DB1020C00020003010004006C00001900C800400200140050088040000802A0040021001001408100020C10608000010808A0000000000000000000000000000000000000000000000000000000000000000000000000000001FFC234B7EEAFFBEBB2EDEFFF0C123C030A1E020307140203020C1B320203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003010104006C00008128084441200A0451508882401408A2A0000001001000400102021010808000040820A0000000000000000000000000000000000000000000000000000000000000000000000000000001FF020303030B0C5CEDAFBBFB3BFF0C123C030A1E03071403020C1B32020300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E803";
         byte[] inBytes = ByteUtils.hexToByteArray(data);
         log.error("Packet Length: {}", inBytes.length);
-        EvpsCommPacket evpsCommPacket = new EvpsCommPacket(rCenter, inBytes);
-        RecvPacketDto packet = RecvPacketDto.builder()
-                .recvTime(0)
-                .center(rCenter)
-                .packet(evpsCommPacket)
-                .build();
-        EvpsSignalMap response = new EvpsSignalMap(null);
+//        EvpsCommPacket evpsCommPacket = new EvpsCommPacket(rCenter, inBytes);
+//        RecvPacketDto packet = RecvPacketDto.builder()
+//                .recvTime(0)
+//                .center(rCenter)
+//                .packet(evpsCommPacket)
+//                .build();
+        //EvpsSignalMap response = new EvpsSignalMap(null);
 //        response.responseTEST(packet);
     }
 
@@ -72,13 +78,13 @@ public class EvpCommServerApplicationTests {
         String data = "02C518081901061911551DB1020C000200010200030036E04BC31020DDC10105E021C11020E030C80102D8C10105C2C10105E039C8010200555C9C2503000102090F3C090F3C010C1246006C2400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010201030025E041C80102E0B7C80102E021C5102000555C9C2503000102090F3C090F3C01040546003E450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB03";
         byte[] inBytes = ByteUtils.hexToByteArray(data);
         log.error("Packet Length: {}", inBytes.length);
-        EvpsCommPacket evpsCommPacket = new EvpsCommPacket(rCenter, inBytes);
-        RecvPacketDto packet = RecvPacketDto.builder()
-                .recvTime(0)
-                .center(rCenter)
-                .packet(evpsCommPacket)
-                .build();
-        EvpsSignalMap response = new EvpsSignalMap(null);
+//        EvpsCommPacket evpsCommPacket = new EvpsCommPacket(rCenter, inBytes);
+//        RecvPacketDto packet = RecvPacketDto.builder()
+//                .recvTime(0)
+//                .center(rCenter)
+//                .packet(evpsCommPacket)
+//                .build();
+//        EvpsSignalMap response = new EvpsSignalMap(null);
 //        response.responseTEST(packet);
     }