shjung 2 жил өмнө
parent
commit
0e33c60c7d
30 өөрчлөгдсөн 320 нэмэгдсэн , 135 устгасан
  1. 4 1
      src/main/java/com/its/dsrc/entity/TbRseCtlr.java
  2. 7 6
      src/main/java/com/its/dsrc/service/StatisticsServices.java
  3. 2 2
      src/main/java/com/its/dsrc/ui/CtlrSttsTableModel.java
  4. 39 0
      src/main/java/com/its/dsrc/ui/MainUI.java
  5. 6 8
      src/main/java/com/its/dsrc/xnettcp/dsrc/DsrcTcpCommServerInitializer.java
  6. 3 3
      src/main/java/com/its/dsrc/xnettcp/dsrc/DsrcTcpCommServerService.java
  7. 3 3
      src/main/java/com/its/dsrc/xnettcp/dsrc/codec/DsrcTcpServerDecoder.java
  8. 22 6
      src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerIdleStateConnectionHandler.java
  9. 1 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerIdleStatePacketHandler.java
  10. 29 10
      src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerLoginInboundHandler.java
  11. 2 8
      src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerPacketInboundHandler.java
  12. 14 10
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/TcpServerDataProcess.java
  13. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/AcceptResponse.java
  14. 3 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/DsrcAsn1Response.java
  15. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/FredResponse.java
  16. 5 2
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/InitiateResponse.java
  17. 4 4
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/LoginResponse.java
  18. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/LogoutResponse.java
  19. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/NullResponse.java
  20. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/PublicationResponse.java
  21. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/RejectResponse.java
  22. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/SubscriptionResponse.java
  23. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/TerminateResponse.java
  24. 2 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/TransferDoneResponse.java
  25. 1 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/service/ControlDeviceService.java
  26. 46 1
      src/main/java/com/its/dsrc/xnettcp/dsrc/process/service/LoginDeviceService.java
  27. 6 5
      src/main/resources/application.yml
  28. 5 5
      src/main/resources/logback-spring.xml
  29. 49 49
      src/main/resources/mybatis/mapper/RseStatMapper.xml
  30. 51 0
      src/test/java/com/its/app/DsrcCommServerApplicationTests.java

+ 4 - 1
src/main/java/com/its/dsrc/entity/TbRseCtlr.java

@@ -92,11 +92,14 @@ public class TbRseCtlr {
 	public String getID() {
 		return this.RSE_CTLR_NMBR;
 	}
+	public String getMcuID() {
+		return this.RSE_MCU_ID;
+	}
 	public String getRSE_ID() {
 		return this.RSE_CTLR_ID;
 	}
 	public String getLogKey() {
-		return this.RSE_CTLR_ID;
+		return this.RSE_MCU_ID;
 	}
 	public void resetConnectCount() {
 		if (this.netState == NET.CLOSED)

+ 7 - 6
src/main/java/com/its/dsrc/service/StatisticsServices.java

@@ -38,9 +38,9 @@ public class StatisticsServices {
         MDC.put("id", logKey);
         Elapsed elapsed = new Elapsed();
         voStatisticsTime statTime = new voStatisticsTime(statDt, fromDt, toDt);
-        log.info("CRT_TB_RSE_OBU_CLCT_STAT_HH :: start. [{}], {}", statTime.toString(), Thread.currentThread().getName());
+        log.info("CRT_RSE_OBU_CLCT_STAT_HH: start. [{}], {}", statTime, Thread.currentThread().getName());
         this.statMapper.CRT_TB_RSE_OBU_CLCT_STAT_HH(statTime);
-        log.info("CRT_TB_RSE_OBU_CLCT_STAT_HH :: ..end. [{}], {} ms. {}", statTime.toString(), elapsed.milliSeconds(), Thread.currentThread().getName());
+        log.info("CRT_RSE_OBU_CLCT_STAT_HH: ..end. [{}], {} ms. {}", statTime, elapsed.milliSeconds(), Thread.currentThread().getName());
         MDC.remove(logKey);
         MDC.clear();
     }
@@ -50,9 +50,9 @@ public class StatisticsServices {
         MDC.put("id", logKey);
         Elapsed elapsed = new Elapsed();
         voStatisticsTime statTime = new voStatisticsTime(statDt, fromDt, toDt);
-        log.info("CRT_TB_RSE_OBU_CLCT_STAT_DD :: start. [{}], {}", statTime.toString(), Thread.currentThread().getName());
+        log.info("CRT_RSE_OBU_CLCT_STAT_DD: start. [{}], {}", statTime, Thread.currentThread().getName());
         this.statMapper.CRT_TB_RSE_OBU_CLCT_STAT_DD(statTime);
-        log.info("CRT_TB_RSE_OBU_CLCT_STAT_DD :: ..end. [{}], {} ms. {}", statTime.toString(), elapsed.milliSeconds(), Thread.currentThread().getName());
+        log.info("CRT_RSE_OBU_CLCT_STAT_DD: ..end. [{}], {} ms. {}", statTime, elapsed.milliSeconds(), Thread.currentThread().getName());
         MDC.remove(logKey);
         MDC.clear();
     }
@@ -88,10 +88,11 @@ public class StatisticsServices {
         statTime.setB_FROM_DT(TimeUtils.getTime(dtStat, TimeUtils.TYPE_PRCS_30MIN));
         statTime.setB_TO_DT(TimeUtils.getToTime(statTime.getB_FROM_DT(), TimeUtils.TYPE_PRCS_30MIN));
         //log.info("{}", statTime);
-        log.info("CRT_TB_RSE_OD_STAT_HH :: start. [{}], {}", statTime.toString(), Thread.currentThread().getName());
+        log.info("------CRT_RSE_OD_STAT_HH: start. [{}], {}", statTime, Thread.currentThread().getName());
         this.statMapper.CRT_TB_RSE_OD_STAT_HH(statTime);
-        log.info("CRT_TB_RSE_OD_STAT_HH :: ..end. [{}], {} ms. {}", statTime.toString(), elapsed.milliSeconds(), Thread.currentThread().getName());
+        log.info("------CRT_RSE_OD_STAT_HH: ..end. [{}], {} ms. {}", statTime, elapsed.milliSeconds(), Thread.currentThread().getName());
         MDC.remove(logKey);
         MDC.clear();
     }
+
 }

+ 2 - 2
src/main/java/com/its/dsrc/ui/CtlrSttsTableModel.java

@@ -17,7 +17,7 @@ public class CtlrSttsTableModel extends AbstractTableModel {
     private final String[] columnNames = {
             "#",
             "번호",
-            "RSE ID",
+            "MCU ID",
             "명칭",
             "IP",
             "PORT",
@@ -116,7 +116,7 @@ public class CtlrSttsTableModel extends AbstractTableModel {
                     returnValue = info.getID();
                     break;
                 case 2:
-                    returnValue = info.getRSE_ID();
+                    returnValue = info.getRSE_MCU_ID();
                     break;
                 case 3:
                     returnValue = " " + info.getRSE_NM();

+ 39 - 0
src/main/java/com/its/dsrc/ui/MainUI.java

@@ -329,6 +329,13 @@ public class MainUI {
         }
         lblTotal.setText(" " + ctlrTotal + " ");
         lblError.setText(" " + ctlrError + " ");
+
+        if (this.isUpdatable) {
+            CtlrSttsTableModel tableModel = (CtlrSttsTableModel) tblCtlrList.getModel();
+            if (tableModel != null) {
+                tableModel.fireTableDataChanged();
+            }
+        }
     }
 
     public void LoadControllerInfo() {
@@ -364,6 +371,37 @@ public class MainUI {
         }
     }
 
+    public static void error(String msg) {
+        MainUI UI = MainUI.getInstance();
+        if (UI == null || UI.chkLogPause.isSelected()) {
+            return;
+        }
+        synchronized (UI.taLog) {
+            if (UI.taLog.getLineCount() > 2000) {
+                UI.taLog.setText(null);
+            }
+            UI.taLog.append(msg);
+            UI.taLog.setCaretPosition(UI.taLog.getDocument().getLength());
+        }
+    }
+
+    public static void info(String msg) {
+        MainUI UI = MainUI.getInstance();
+        if (UI == null || UI.chkLogPause.isSelected()) {
+            return;
+        }
+        synchronized (UI.taLog) {
+            synchronized (UI.taLog) {
+                if (UI.taLog.getLineCount() > 2000) {
+                    UI.taLog.setText(null);
+                }
+                UI.taLog.append(msg);
+                UI.taLog.setCaretPosition(UI.taLog.getDocument().getLength());
+            }
+        }
+    }
+
+
     {
 // GUI initializer generated by IntelliJ IDEA GUI Designer
 // >>> IMPORTANT!! <<<
@@ -590,4 +628,5 @@ public class MainUI {
     public JComponent $$$getRootComponent$$$() {
         return rootPanel;
     }
+
 }

+ 6 - 8
src/main/java/com/its/dsrc/xnettcp/dsrc/DsrcTcpCommServerInitializer.java

@@ -4,12 +4,10 @@ import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.xnettcp.dsrc.codec.DsrcTcpServerDecoder;
 import com.its.dsrc.xnettcp.dsrc.codec.DsrcTcpServerEncoder;
 import com.its.dsrc.xnettcp.dsrc.handler.DsrcAsn1ServerIdleStateConnectionHandler;
-import com.its.dsrc.xnettcp.dsrc.handler.DsrcAsn1ServerLoginInboundHandler;
+import com.its.dsrc.xnettcp.dsrc.handler.DsrcAsn1ServerPacketInboundHandler;
 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;
 
@@ -19,7 +17,7 @@ import java.util.concurrent.TimeUnit;
 public class DsrcTcpCommServerInitializer extends ChannelInitializer<Channel> {
 
     private final RunningConfig config;
-    private final DsrcAsn1ServerLoginInboundHandler dsrcAsn1ServerLoginInboundHandler;
+    private final DsrcAsn1ServerPacketInboundHandler dsrcAsn1ServerPacketInboundHandler;
     private final DsrcTcpServerEncoder dsrcTcpServerEncoder;
 
     @Override
@@ -33,12 +31,12 @@ public class DsrcTcpCommServerInitializer extends ChannelInitializer<Channel> {
         DsrcAsn1ServerIdleStateConnectionHandler connectionHandler = new DsrcAsn1ServerIdleStateConnectionHandler(this.config);
 
         ChannelPipeline pipeline = channel.pipeline();
-        pipeline.addLast(new LoggingHandler(LogLevel.WARN));
+        //pipeline.addLast(new LoggingHandler(LogLevel.WARN));
         pipeline.addLast("dsrcAsn1ServerConnectionIdleStateHandler", idleStateHandler);
         pipeline.addLast("dsrcAsn1ServerConnectionHandler", connectionHandler);
-        pipeline.addLast("dsrcAsn1ServerDecoder",      new DsrcTcpServerDecoder(this.config));  // Decoding handler
-        pipeline.addLast("dsrcAsn1ServerLoginInboundHandler", this.dsrcAsn1ServerLoginInboundHandler);   // login handler
-        pipeline.addLast("dsrcAsn1ServerEncoder",      this.dsrcTcpServerEncoder);  // Encoding handler
+        pipeline.addLast("dsrcAsn1ServerDecoder", new DsrcTcpServerDecoder(this.config));  // Decoding handler
+        pipeline.addLast("dsrcAsn1ServerPacketInboundHandler", this.dsrcAsn1ServerPacketInboundHandler); // packet distribute handler add
+        pipeline.addLast("dsrcAsn1ServerEncoder", this.dsrcTcpServerEncoder);  // Encoding handler
     }
 
 }

+ 3 - 3
src/main/java/com/its/dsrc/xnettcp/dsrc/DsrcTcpCommServerService.java

@@ -4,7 +4,7 @@ import com.its.app.utils.NettyUtils;
 import com.its.app.utils.OS;
 import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.xnettcp.dsrc.codec.DsrcTcpServerEncoder;
-import com.its.dsrc.xnettcp.dsrc.handler.DsrcAsn1ServerLoginInboundHandler;
+import com.its.dsrc.xnettcp.dsrc.handler.DsrcAsn1ServerPacketInboundHandler;
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelOption;
@@ -20,8 +20,8 @@ import org.springframework.stereotype.Service;
 public class DsrcTcpCommServerService {
 
     private final RunningConfig config;
-    private final DsrcAsn1ServerLoginInboundHandler dsrcAsn1ServerLoginInboundHandler;
     private final DsrcTcpServerEncoder dsrcTcpServerEncoder;
+    private final DsrcAsn1ServerPacketInboundHandler dsrcAsn1ServerPacketInboundHandler;
 
     private EventLoopGroup acceptGroups = null;
     private EventLoopGroup workerGroups = null;
@@ -100,7 +100,7 @@ public class DsrcTcpCommServerService {
 
         DsrcTcpCommServerInitializer dsrcTcpCommServerInitializer = new DsrcTcpCommServerInitializer(
                 this.config,
-                this.dsrcAsn1ServerLoginInboundHandler,
+                this.dsrcAsn1ServerPacketInboundHandler,
                 this.dsrcTcpServerEncoder
         );
         serverBootstrap.childHandler(dsrcTcpCommServerInitializer);

+ 3 - 3
src/main/java/com/its/dsrc/xnettcp/dsrc/codec/DsrcTcpServerDecoder.java

@@ -62,7 +62,7 @@ public class DsrcTcpServerDecoder extends ByteToMessageDecoder {
         if (this.runningConfig.isDumpRecv()) {
             byte[] debugBytes = new byte[byteBuf.readableBytes()];
             byteBuf.getBytes(byteBuf.readerIndex(), debugBytes);
-            log.info("RECV: [{}], {} Bytes. {}", ipAddress, debugBytes.length, SysUtils.byteArrayToHex(debugBytes));
+            log.debug("RECV: [{}], {} Bytes. {}", ipAddress, debugBytes.length, SysUtils.byteArrayToHex(debugBytes));
         }
 
         int pktLength = 0;
@@ -97,8 +97,8 @@ public class DsrcTcpServerDecoder extends ByteToMessageDecoder {
                 BerOctetString berOctetString = datexDataPacket.getDatexData();
                 C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
                 authLength = c2c.decode(new ByteArrayInputStream(berOctetString.value, 0, berOctetString.value.length));
-                log.info("RECV: Decoder: {}. ASN1 PACKET: {} Bytes, decodeLength: {} Bytes", ipAddress, pktLength, authLength);
-                log.debug("RECV: Decoder: {}, C2CAuth: {}", ipAddress, c2c.toString());
+                //log.info("RECV: Decoder: {}. ASN1 PACKET: {} Bytes, decodeLength: {} Bytes", ipAddress, pktLength, authLength);
+                log.info("RECV: Decoder: {}, C2CAuth: {}", ipAddress, c2c);
                 list.add(c2c);
 
                 readableBytes = byteBuf.readableBytes();

+ 22 - 6
src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerIdleStateConnectionHandler.java

@@ -1,5 +1,6 @@
 package com.its.dsrc.xnettcp.dsrc.handler;
 
+import com.beanit.asn1dsrc.util.DsrcAsn1Utils;
 import com.its.app.utils.NettyUtils;
 import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
@@ -15,6 +16,11 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 소켓 채널이 연결된 후 최소 데이터 송수신 까지의 타임아웃을 체크한다.
+ */
 @Slf4j
 @RequiredArgsConstructor
 public class DsrcAsn1ServerIdleStateConnectionHandler extends ChannelDuplexHandler {
@@ -84,18 +90,28 @@ public class DsrcAsn1ServerIdleStateConnectionHandler extends ChannelDuplexHandl
                     obj.getChannel().close();
                 }
                 catch(Exception e) {
-
                 }
             }
 
-//            // 채널에 대한 핸들러를 등록
-//            ctx.channel().pipeline().addLast("dsrcAsn1ServerDecoder",      (ChannelHandler)new DsrcTcpServerDecoder(this.config));  // Decoding handler
-//            ctx.channel().pipeline().addLast("dsrcAsn1ServerLoginInboundHandler", (ChannelHandler)new DsrcAsn1ServerLoginInboundHandler());   // login handler
-//            //ctx.channel().pipeline().addLast("dsrcAsn1ServerPacketInboundHandler", (ChannelHandler)new DsrcAsn1ServerPacketInboundHandler());  // Packet handler
-//            ctx.channel().pipeline().addLast("dsrcAsn1ServerEncoder",      (ChannelHandler)new DsrcTcpServerEncoder(this.config));  // Encoding handler
+            /**
+             * 1. 데이터 송수신 타임아웃 핸들러 등록
+             * 2. 현재 핸들러를 삭제한다.
+             */
+            int allIdleTimeSec = 120;   // 2분
+            DsrcAsn1ServerIdleStatePacketHandler dsrcAsn1ServerIdleStatePacketHandler = new DsrcAsn1ServerIdleStatePacketHandler(
+                    0,
+                    0,
+                    allIdleTimeSec,
+                    TimeUnit.SECONDS
+            );
+            ctx.channel().pipeline().addAfter("dsrcAsn1ServerConnectionIdleStateHandler","dsrcAsn1ServerIdleStateHandler", dsrcAsn1ServerIdleStatePacketHandler);    // packet idle handler add
+            ctx.channel().pipeline().remove("dsrcAsn1ServerConnectionIdleStateHandler");     // login idle handler remove
+            ctx.channel().pipeline().remove(this);                              // First packet recv/send timeout handler(dsrcAsn1ServerConnectionHandler)
 
             obj.setNetState(NET.LOGIN_REQ);
             obj.setChannel(ctx.channel());
+            obj.setHeaderOptions(DsrcAsn1Utils.getDefaultOptions());
+
             MDC.remove(obj.getLogKey());
             MDC.clear();
         }

+ 1 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerIdleStatePacketHandler.java

@@ -43,7 +43,7 @@ public class DsrcAsn1ServerIdleStatePacketHandler extends IdleStateHandler {
         TbRseCtlr obj = AppRepository.getInstance().getCtlrIpMap().get(ipAddress);
         if (obj == null) {
             log.error("DsrcAsn1ServerIdleStatePacketHandler.-------channelIdle: ALL_IDLE, {}, Unknown ip address, will be closed.", ipAddress);
-            DsrcAsn1ServerIdleStatePacketHandler.disconnectChannel(obj, ctx.channel());
+            DsrcAsn1ServerIdleStatePacketHandler.disconnectChannel(null, ctx.channel());
             return;
         }
 

+ 29 - 10
src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerLoginInboundHandler.java

@@ -1,29 +1,33 @@
 package com.its.dsrc.xnettcp.dsrc.handler;
 
 import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
+import com.beanit.asn1dsrc.enums.eAuthInfo;
 import com.its.app.utils.NettyUtils;
 import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.global.AppRepository;
+import com.its.dsrc.process.DbmsDataProcess;
+import com.its.dsrc.xnettcp.dsrc.process.response.InitiateResponse;
 import com.its.dsrc.xnettcp.dsrc.process.response.LoginResponse;
-import io.netty.channel.ChannelHandler;
+import com.its.dsrc.xnettcp.dsrc.process.service.LoginDeviceService;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
-import org.springframework.stereotype.Component;
 
 import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @RequiredArgsConstructor
-@Component
-@ChannelHandler.Sharable
+//@Component
+//@ChannelHandler.Sharable
 public class DsrcAsn1ServerLoginInboundHandler extends ChannelInboundHandlerAdapter {
 
     private final RunningConfig config;
     private final DsrcAsn1ServerPacketInboundHandler dsrcAsn1ServerPacketInboundHandler;
+    private final DbmsDataProcess dbmsDataProcess;
+    private final RunningConfig runningConfig;
 
 //    public DsrcAsn1ServerLoginInboundHandler() {
 //        super();
@@ -64,12 +68,27 @@ public class DsrcAsn1ServerLoginInboundHandler extends ChannelInboundHandlerAdap
             return;
         }
 
+        int allIdleTimeSec = 300;
         C2CAuthenticatedMessage c2c = (C2CAuthenticatedMessage)msg;
-        LoginResponse response = new LoginResponse(obj, ctx, c2c);
-        if (!response.response()) {
-            log.error("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}. login failed. will be closed.", ipAddress);
-            DsrcAsn1ServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
+        eAuthInfo cmd = eAuthInfo.getByValue(c2c.getDatexAuthenticationInfoText().value[0]);
+        if (cmd == eAuthInfo.AI_Initiate) {
+            InitiateResponse response = new InitiateResponse(obj, ctx, c2c);
+            if (!response.response(this.runningConfig)) {
+                log.error("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}. AI_Initiate failed. will be closed.", ipAddress);
+                DsrcAsn1ServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
+                return;
+            }
+            LoginDeviceService.getInstance().requestLogin(obj, ctx.channel(), this.runningConfig);
+        } else if (cmd == eAuthInfo.AI_Login)  {
+            LoginResponse response = new LoginResponse(obj, ctx, c2c);
+            if (!response.response(this.runningConfig)) {
+                log.error("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}. AI_Login failed. will be closed.", ipAddress);
+                DsrcAsn1ServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
+                return;
+            }
             return;
+        } else {
+            log.warn("DsrcAsn1ServerLoginInboundHandler: {}", cmd);
         }
 
         // 로그인이 성공하면
@@ -78,7 +97,7 @@ public class DsrcAsn1ServerLoginInboundHandler extends ChannelInboundHandlerAdap
         // 로그인 이전 네트워크 IDLE 체크 핸들러 삭제
         // 로그인 처리 핸들러 삭제
         // 로그인 패킷 처리 핸들러 삭제
-        int allIdleTimeSec = obj.getLogin().getDatexLoginHeartbeatDurationMaxQty().value.intValue()+5;
+        //int allIdleTimeSec = obj.getLogin().getDatexLoginHeartbeatDurationMaxQty().value.intValue()+5;
         log.info("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}, allIdleTimeSec: {} sec.", ipAddress, allIdleTimeSec);
         DsrcAsn1ServerIdleStatePacketHandler dsrcAsn1ServerIdleStatePacketHandler = new DsrcAsn1ServerIdleStatePacketHandler(
                 0,
@@ -87,7 +106,7 @@ public class DsrcAsn1ServerLoginInboundHandler extends ChannelInboundHandlerAdap
                 TimeUnit.SECONDS
         );
         ctx.channel().pipeline().addAfter("dsrcAsn1ServerConnectionIdleStateHandler","dsrcAsn1ServerIdleStateHandler", dsrcAsn1ServerIdleStatePacketHandler);    // packet idle handler add
-        ctx.channel().pipeline().addAfter("dsrcAsn1ServerLoginInboundHandler","DsrcAsn1ServerPacketInboundHandler", this.dsrcAsn1ServerPacketInboundHandler); // packet distribute handler add
+        ctx.channel().pipeline().addAfter("dsrcAsn1ServerLoginInboundHandler","dsrcAsn1ServerPacketInboundHandler", this.dsrcAsn1ServerPacketInboundHandler); // packet distribute handler add
         ctx.channel().pipeline().remove("dsrcAsn1ServerConnectionIdleStateHandler");      // login idle handler remove
         ctx.channel().pipeline().remove("dsrcAsn1ServerConnectionHandler");     // connection handler remove
         ctx.channel().pipeline().remove(this);                     // login handler remove

+ 2 - 8
src/main/java/com/its/dsrc/xnettcp/dsrc/handler/DsrcAsn1ServerPacketInboundHandler.java

@@ -19,19 +19,13 @@ public class DsrcAsn1ServerPacketInboundHandler extends ChannelInboundHandlerAda
 
     private final TcpServerDataProcess tcpServerDataProcess;
 
-//    public DsrcAsn1ServerPacketInboundHandler() {
-//        super();
-//        //this.dsrcServerConfig = (DsrcServerConfig) BeanUtils.getBean(DsrcServerConfig.class);
-//        this.tcpServerDataProcess = (TcpServerDataProcess) AppUtils.getBean(TcpServerDataProcess.class);
-//    }
-
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         if (!(msg instanceof C2CAuthenticatedMessage)) {
             log.error("{} | Received Data is not C2CAuthenticatedMessage", NettyUtils.getRemoteAddress(ctx.channel()));
             return;
         }
-        //C2CAuthenticatedMessage c2c = (C2CAuthenticatedMessage)msg;
-        //log.info("DsrcAsn1ServerPacketHandler: channelRead: {}, {}", NettyUtils.getRemoteAddress(ctx.channel()), c2c.toString());
+        C2CAuthenticatedMessage c2c = (C2CAuthenticatedMessage)msg;
+        log.info("DsrcAsn1ServerPacketHandler: channelRead: {}, {}", NettyUtils.getRemoteAddress(ctx.channel()), c2c);
         this.tcpServerDataProcess.add(new TcpServerData(TcpServerData.DATA_TYPE_PACKET, null, ctx, msg));
     }
 }

+ 14 - 10
src/main/java/com/its/dsrc/xnettcp/dsrc/process/TcpServerDataProcess.java

@@ -4,12 +4,14 @@ import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.beanit.asn1dsrc.enums.eAuthInfo;
 import com.its.app.AppUtils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.global.AppRepository;
 import com.its.dsrc.xnettcp.dsrc.handler.DsrcAsn1ServerIdleStatePacketHandler;
 import com.its.dsrc.xnettcp.dsrc.process.response.*;
 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;
@@ -20,9 +22,12 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 
 @Slf4j
+@RequiredArgsConstructor
 @Service
 public class TcpServerDataProcess {
 
+    private final RunningConfig runningConfig;
+
     public static LinkedBlockingQueue<TcpServerData> SERVER_DATA_QUEUE = new LinkedBlockingQueue<>(1000);
     private ThreadPoolExecutor taskExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(1);
     int MAX_CORE = Runtime.getRuntime().availableProcessors();
@@ -36,7 +41,7 @@ public class TcpServerDataProcess {
             this.MAX_CORE = 8;
         }
 //        ItsThreadPoolInitializer poolInitializer = (ItsThreadPoolInitializer) AppUtils.getBean(ItsThreadPoolInitializer.class);
-        int executePool = 9;//Math.max(this.MAX_CORE, poolInitializer.getThreadPoolWork());
+        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(() -> {
@@ -82,6 +87,13 @@ public class TcpServerDataProcess {
 
             DsrcAsn1Response response = null;
             switch (cmd) {
+                case AI_Initiate    :   //(0x01, "AI_Initiate"),           /* 초기 통신연결을 위한 개시 요청 데이터 패킷 */
+                    // 서버모드 처리내용 없음(평택 서버인데 클라이언트가 서버로 동작 => 로그인 요청해야함)
+                    response = new InitiateResponse(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;
@@ -112,21 +124,13 @@ public class TcpServerDataProcess {
                     // 처리내용 없음
                     response = new NullResponse(obj, ctx, c2c);
                     break;
-                case AI_Initiate    :   //(0x01, "AI_Initiate"),           /* 초기 통신연결을 위한 개시 요청 데이터 패킷 */
-                    // 처리내용 없음
-                    response = new InitiateResponse(obj, ctx, c2c);
-                    break;
-                case AI_Login       :   //(0x02, "AI_Login"),              /* 서버에 접속하기 위한 클라이언트의 로그인 데이터 패킷 */
-                    // 처리내용 없음(LoginHandler 따로 처리하는 경우
-                    response = new LoginResponse(obj, ctx, c2c);
-                    break;
                 default:
                     log.warn("{}. process: Unknown packet: {}, {}", ipAddress, cmd.toString(), obj.toString());
                     break;
             }
 
             if (response != null) {
-                if (!response.response()) {
+                if (!response.response(this.runningConfig)) {
                     log.error("TcpServerDataProcess.process: {}, response error. will be closed.", ipAddress);
                     DsrcAsn1ServerIdleStatePacketHandler.disconnectChannel(obj, ctx.channel());
                 }

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/AcceptResponse.java

@@ -5,6 +5,7 @@ import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.beanit.asn1dsrc.dsrc.PDUs;
 import com.its.app.AppUtils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.dao.mapper.RseCtlrMapper;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.entity.TbRseCtrlHs;
@@ -27,7 +28,7 @@ public class AcceptResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.debug("AcceptResponse.response: {}", ipAddress);
 

+ 3 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/DsrcAsn1Response.java

@@ -1,5 +1,7 @@
 package com.its.dsrc.xnettcp.dsrc.process.response;
 
+import com.its.dsrc.config.RunningConfig;
+
 public interface DsrcAsn1Response {
-    boolean response();
+    boolean response(RunningConfig runningConfig);
 }

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/FredResponse.java

@@ -7,6 +7,7 @@ import com.beanit.asn1dsrc.dsrc.PDUs;
 import com.beanit.asn1dsrc.enums.eAuthInfo;
 import com.beanit.asn1dsrc.util.DsrcAsn1Utils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
@@ -25,7 +26,7 @@ public class FredResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.debug("FredResponse.response: {}", ipAddress);
 

+ 5 - 2
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/InitiateResponse.java

@@ -2,7 +2,9 @@ package com.its.dsrc.xnettcp.dsrc.process.response;
 
 import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
+import com.its.dsrc.xnettcp.dsrc.process.service.LoginDeviceService;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
 
@@ -19,10 +21,11 @@ public class InitiateResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         // 처리내용 없음
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.info("InitiateResponse.response: {}", ipAddress);
-        return true;
+
+        return LoginDeviceService.getInstance().requestLogin(obj, this.ctx.channel(), runningConfig);
     }
 }

+ 4 - 4
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/LoginResponse.java

@@ -42,7 +42,7 @@ public class LoginResponse implements DsrcAsn1Response {
     }
 
      @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.info("LoginResponse.response: {}", ipAddress);
 
@@ -54,9 +54,9 @@ public class LoginResponse implements DsrcAsn1Response {
             return false;
         }
 
-        //log.info("LoginResponse.response: {}. AuthInfo: {}, PDUs: {}", ipAddress, cmd.toString(), pdu.toString());
+        log.info("LoginResponse.response: {}. AuthInfo: {}, PDUs: {}", ipAddress, cmd.toString(), pdu.toString());
         if (cmd != eAuthInfo.AI_Login || pdu != ePdusPr.PDUs_PR_login) {
-            log.error("LoginResponse.response: {}. LOGIN WAIT, Miss Matched Login Message. will be closed.", ipAddress);
+            log.error("LoginResponse.response: {}. LOGIN WAIT, Miss Matched Login Message. will be closed.v {}", ipAddress, cmd);
             return false;
         }
 
@@ -221,7 +221,7 @@ public class LoginResponse implements DsrcAsn1Response {
         loginUserName: AP,
         loginUserPswd: ATMS_RSE, durationMaxQty: 120, loginInitCd: 1, responseTimeout: 3, datagramSize: 2048
          */
-        log.debug("LoginResponse.response: {}. senderTxt: {}, destinationTxt: {}, loginUserName: {}, loginUserPswd: {}, durationMaxQty: {}, loginInitCd: {}, responseTimeout: {}, datagramSize: {}",
+        log.info("LoginResponse.response: {}. senderTxt: {}, destinationTxt: {}, loginUserName: {}, loginUserPswd: {}, durationMaxQty: {}, loginInitCd: {}, responseTimeout: {}, datagramSize: {}",
                 ipAddress, senderTxt, destinationTxt, loginUserName, loginUserPswd, durationMaxQty, loginInitCd, responseTimeout, datagramSize);
 
         return TbRseCtlrCnncHs.LOG_TYPE_LOGIN;

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/LogoutResponse.java

@@ -3,6 +3,7 @@ package com.its.dsrc.xnettcp.dsrc.process.response;
 import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.its.app.AppUtils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.entity.TbRseCtlrCnncHs;
 import com.its.dsrc.process.DbmsData;
@@ -27,7 +28,7 @@ public class LogoutResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.info("LogoutResponse.response: {}", ipAddress);
 

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/NullResponse.java

@@ -2,6 +2,7 @@ package com.its.dsrc.xnettcp.dsrc.process.response;
 
 import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +20,7 @@ public class NullResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         // 처리내용 없음. 여기들어오면 패킷이 잘못된 것임
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.info("NullResponse.response: {}", ipAddress);

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/PublicationResponse.java

@@ -5,6 +5,7 @@ import com.beanit.asn1dsrc.enums.eControlDevice;
 import com.beanit.asn1dsrc.enums.eObjectId;
 import com.beanit.asn1dsrc.util.DsrcAsn1Utils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.xnettcp.dsrc.process.service.ControlDeviceService;
 import com.its.dsrc.xnettcp.dsrc.process.service.OBUGatherInfoService;
@@ -29,7 +30,7 @@ public class PublicationResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
         log.debug("PublicationResponse.response: {}", ipAddress);
 

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/RejectResponse.java

@@ -6,6 +6,7 @@ import com.beanit.asn1dsrc.dsrc.Reject;
 import com.beanit.asn1dsrc.dsrc.RejectType;
 import com.its.app.AppUtils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.dao.mapper.RseCtlrMapper;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.entity.TbRseCtrlHs;
@@ -29,7 +30,7 @@ public class RejectResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.info("RejectResponse.response: {}", ipAddress);
 

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/SubscriptionResponse.java

@@ -6,6 +6,7 @@ import com.beanit.asn1dsrc.enums.eObjectId;
 import com.beanit.asn1dsrc.enums.eRejectSubscription;
 import com.beanit.asn1dsrc.util.DsrcAsn1Utils;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.xnettcp.dsrc.process.service.SubscriptionService;
 import com.its.dsrc.xnettcp.dsrc.process.service.impl.SubscriptionRegisterService;
@@ -27,7 +28,7 @@ public class SubscriptionResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.debug("SubscriptionResponse.response: {}", ipAddress);
 

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/TerminateResponse.java

@@ -3,6 +3,7 @@ package com.its.dsrc.xnettcp.dsrc.process.response;
 import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.beanit.asn1dsrc.enums.eTerminate;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import com.its.dsrc.xnettcp.dsrc.process.service.ControlDeviceService;
 import io.netty.channel.ChannelHandlerContext;
@@ -21,7 +22,7 @@ public class TerminateResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         if (this.obj == null) {
             return false;
         }

+ 2 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/response/TransferDoneResponse.java

@@ -2,6 +2,7 @@ package com.its.dsrc.xnettcp.dsrc.process.response;
 
 import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
 import com.its.app.utils.NettyUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
@@ -19,7 +20,7 @@ public class TransferDoneResponse implements DsrcAsn1Response {
     }
 
     @Override
-    public boolean response() {
+    public boolean response(RunningConfig runningConfig) {
         // 처리내용 없음.
         String ipAddress = NettyUtils.getRemoteIpAddress(this.ctx.channel());
         log.info("TransferDoneResponse.response: {}", ipAddress);

+ 1 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/service/ControlDeviceService.java

@@ -812,7 +812,7 @@ public class ControlDeviceService {
             }
         }
         catch(Exception e) {
-            log.error("ControlDeviceService.sendTerminate: {}, {}, reason: {}, Exception: {}", obj.getID(), obj.getRSE_ID(), reason, e.toString());
+            log.error("ControlDeviceService.sendTerminate: {}, {}, reason: {}, Exception: {}", obj.getID(), obj.getRSE_ID(), reason, e.getMessage());
             return false;
         }
         return true;

+ 46 - 1
src/main/java/com/its/dsrc/xnettcp/dsrc/process/service/LoginDeviceService.java

@@ -2,14 +2,16 @@ package com.its.dsrc.xnettcp.dsrc.process.service;
 
 import com.beanit.asn1bean.ber.ReverseByteArrayOutputStream;
 import com.beanit.asn1bean.ber.types.*;
+import com.beanit.asn1bean.ber.types.string.BerUTF8String;
 import com.beanit.asn1dsrc.dsrc.*;
 import com.beanit.asn1dsrc.enums.*;
 import com.beanit.asn1dsrc.util.DsrcAsn1Utils;
 import com.its.app.utils.NettyUtils;
 import com.its.app.utils.SysUtils;
+import com.its.dsrc.config.RunningConfig;
 import com.its.dsrc.entity.TbRseCtlr;
-import com.its.dsrc.global.AppRepository;
 import com.its.dsrc.entity.TbRseObuNonCrypt;
+import com.its.dsrc.global.AppRepository;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelFuture;
 import lombok.extern.slf4j.Slf4j;
@@ -283,4 +285,47 @@ public class LoginDeviceService {
         return true;
     }
 
+    public boolean requestLogin(TbRseCtlr obj, Channel channel, RunningConfig runningConfig) {
+
+        log.info("LoginResponse.requestLogin");
+
+        Login login = new Login();
+        login.setDatexSenderTxt(new BerUTF8String(runningConfig.getServerDomainName()));
+        login.setDatexDestinationTxt(new BerUTF8String(runningConfig.getServerDomainName()));
+        login.setDatexLoginUserNameTxt(new BerUTF8String(runningConfig.getServerAuthUser()));
+        login.setDatexLoginPasswordTxt(new BerUTF8String(runningConfig.getServerAuthPassword()));
+        login.setDatexLoginHeartbeatDurationMaxQty(new BerInteger(120));
+        login.setDatexLoginResponseTimeOutQty(new BerInteger(5));
+        login.setDatexLoginInitiatorCd(new BerEnum(1));
+        login.setDatexLoginDatagramSizeQty(new BerInteger(2048));
+        int[] encodingRules = {2, 1, 1};
+        Login.DatexLoginEncodingRulesId loginEncodingRulesId = new Login.DatexLoginEncodingRulesId();
+        loginEncodingRulesId.getBerObjectIdentifier().add(new BerObjectIdentifier(encodingRules));
+        login.setDatexLoginEncodingRulesId(loginEncodingRulesId);
+
+
+        byte[] auth = {(byte) eAuthInfo.AI_Login.getValue() };
+        PDUs loginPdu = new PDUs();
+        loginPdu.setLogin(login);
+
+        HeaderOptions headerOptions = DsrcAsn1Utils.getDefaultOptions();
+        C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
+        c2c.setDatexAuthenticationInfoText(new BerOctetString(auth));
+        c2c.setDatexDataPacketNumber(new BerInteger(obj.getSeq().nextValue()));
+        c2c.setDatexDataPacketPriorityNumber(new BerInteger(1));
+        c2c.setOptions(headerOptions);
+        c2c.setPdu(loginPdu);
+
+        obj.setHeaderOptions(DsrcAsn1Utils.swapHeaderOptions(headerOptions));
+
+        ChannelFuture f = channel.writeAndFlush(c2c);
+        f.awaitUninterruptibly();
+        if (f.isDone() || f.isSuccess()) {
+            log.info("LoginDeviceService.requestLogin: {}, {}, send ok", obj.getID(), obj.getRSE_ID());
+        } else {
+            log.error("LoginDeviceService.requestLogin: {}, {}, send failed.", obj.getID(), obj.getRSE_ID());
+        }
+        return true;
+    }
+
 }

+ 6 - 5
src/main/resources/application.yml

@@ -8,11 +8,12 @@ application:
 
 running:
   comm-binding-port: 3550
-  dump-recv: true
-  dump-send: true
-  server-domain-name: GJATMSSERVER
-  server-auth-user: test1
-  server-auth-password: test1
+  dump-recv: false
+  dump-send: false
+  #server-domain-name: GJATMSSERVER
+  server-domain-name: PTATMSSERVER
+  server-auth-user: PTATMS
+  server-auth-password: PTATMS
   server-sender-text: DSRC Center Unit
   publication-multimedia: false
   publication-non-crypt-obu: true

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

@@ -100,7 +100,7 @@
         <appender-ref ref="FILE_ERROR"/>
     </root>
 
-    <logger name="${APP_CLASS_PATH}.xnettcp" level="DEBUG" additivity="false">
+    <logger name="${APP_CLASS_PATH}.xnettcp" level="INFO" additivity="false">
         <appender-ref ref="FILE_PACKET"/>
         <appender-ref ref="FILE_ERROR"/>
     </logger>
@@ -118,7 +118,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="${APP_CLASS_PATH}.xnetudp" level="DEBUG" additivity="false">
+    <logger name="${APP_CLASS_PATH}.xnetudp" level="INFO" additivity="false">
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="CENTER_COMM"/>
         <appender-ref ref="FILE_ERROR"/>
@@ -137,7 +137,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="${APP_CLASS_PATH}.xnettcp" level="DEBUG" additivity="true">
+    <logger name="${APP_CLASS_PATH}.xnettcp" level="INFO" additivity="true">
         <appender-ref ref="FILE_SESSION"/>
         <appender-ref ref="FILE_ERROR"/>
     </logger>
@@ -155,7 +155,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="${APP_CLASS_PATH}.service.StatisticsServices" level="DEBUG" additivity="false">
+    <logger name="${APP_CLASS_PATH}.service.StatisticsServices" level="INFO" additivity="false">
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="FILE_STATISTICS"/>
         <appender-ref ref="FILE_ERROR"/>
@@ -174,7 +174,7 @@
         </rollingPolicy>
     </appender>
 
-    <logger name="${APP_CLASS_PATH}.scheduler" level="DEBUG" additivity="false">
+    <logger name="${APP_CLASS_PATH}.scheduler" level="INFO" additivity="false">
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="FILE_SCHEDULE"/>
         <appender-ref ref="FILE_ERROR"/>

+ 49 - 49
src/main/resources/mybatis/mapper/RseStatMapper.xml

@@ -25,56 +25,56 @@
     <update id="CRT_TB_RSE_OD_STAT_HH" parameterType="com.its.dsrc.vo.voStatisticsTime">
     <![CDATA[
         MERGE INTO TB_RSE_OD_STAT_HH L
-            USING (SELECT #{prcs.STAT_DT}        AS STAT_DT,
-                          F_RSE_CTLR_NMBR        AS F_RSE_CTLR_NMBR,
-                          T_RSE_CTLR_NMBR        AS T_RSE_CTLR_NMBR,
-                          #{prcs.DAY_TYPE_CD}    AS DAY_TYPE_CD,
-                          COUNT(1)               AS TFVL,
-                          ROUND(AVG(TRVL_HH), 0) AS TRVL_HH
-                   FROM (SELECT OBU_IDNT_NMBR, F_RSE_CTLR_NMBR, T_RSE_CTLR_NMBR, F_CLCT_DT, T_CLCT_DT,
-                                (TO_DATE(T_CLCT_DT, 'YYYYMMDDHH24MISS') - TO_DATE(F_CLCT_DT, 'YYYYMMDDHH24MISS')) * 86400 AS TRVL_HH
-                         FROM (SELECT OBU_IDNT_NMBR,
-                                      LAG(RSE_CTLR_NMBR) OVER (PARTITION BY OBU_IDNT_NMBR ORDER BY CLCT_DT) AS F_RSE_CTLR_NMBR,
-                                      RSE_CTLR_NMBR                                                         AS T_RSE_CTLR_NMBR,
-                                      LAG(CLCT_DT) OVER (PARTITION BY OBU_IDNT_NMBR ORDER BY CLCT_DT)       AS F_CLCT_DT,
-                                      CLCT_DT                                                               AS T_CLCT_DT
-                               FROM (SELECT OBU_IDNT_NMBR, CLCT_DT, RSE_CTLR_NMBR AS RSE_CTLR_NMBR
-                                     FROM TB_RSE_OBU_CLCT_HS
-                                     WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}
-                                     UNION ALL
-                                     SELECT OBU_IDNT_NMBR, CLCT_DT, RSE_CTLR_NMBR AS RSE_CTLR_NMBR
-                                     FROM TB_RSE_OBU_CLCT_HS
-                                     WHERE CLCT_DT BETWEEN #{prcs.B_FROM_DT} AND #{prcs.B_TO_DT}
-                                       AND (OBU_IDNT_NMBR, CLCT_DT) IN (SELECT OBU_IDNT_NMBR, MAX(CLCT_DT) AS CLCT_DT
-                                                                        FROM TB_RSE_OBU_CLCT_HS
-                                                                        WHERE CLCT_DT BETWEEN #{prcs.B_FROM_DT} AND #{prcs.B_TO_DT}
-                                                                        GROUP BY OBU_IDNT_NMBR)
-                                    )
-                              )
-                         WHERE F_RSE_CTLR_NMBR IS NOT NULL
-                           AND F_RSE_CTLR_NMBR <> T_RSE_CTLR_NMBR
-                        )
-                   GROUP BY F_RSE_CTLR_NMBR, T_RSE_CTLR_NMBR) M
-            ON ( L.STAT_DT         = M.STAT_DT
-             AND L.F_RSE_CTLR_NMBR = M.F_RSE_CTLR_NMBR
-             AND L.T_RSE_CTLR_NMBR = M.T_RSE_CTLR_NMBR )
-            WHEN MATCHED THEN
-                UPDATE SET L.DAY_TYPE_CD = M.DAY_TYPE_CD,
-                           L.TFVL        = M.TFVL
-            WHEN NOT MATCHED THEN
-                INSERT (
-                        L.STAT_DT,
-                        L.F_RSE_CTLR_NMBR,
-                        L.T_RSE_CTLR_NMBR,
-                        L.DAY_TYPE_CD,
-                        L.TFVL
-                    ) VALUES (
-                        M.STAT_DT,
-                        M.F_RSE_CTLR_NMBR,
-                        M.T_RSE_CTLR_NMBR,
-                        M.DAY_TYPE_CD,
-                        M.TFVL
+        USING (SELECT #{prcs.STAT_DT}        AS STAT_DT,
+                      F_RSE_CTLR_NMBR        AS F_RSE_CTLR_NMBR,
+                      T_RSE_CTLR_NMBR        AS T_RSE_CTLR_NMBR,
+                      #{prcs.DAY_TYPE_CD}    AS DAY_TYPE_CD,
+                      COUNT(1)               AS TFVL,
+                      ROUND(AVG(TRVL_HH), 0) AS TRVL_HH
+               FROM (SELECT OBU_IDNT_NMBR, F_RSE_CTLR_NMBR, T_RSE_CTLR_NMBR, F_CLCT_DT, T_CLCT_DT,
+                            (TO_DATE(T_CLCT_DT, 'YYYYMMDDHH24MISS') - TO_DATE(F_CLCT_DT, 'YYYYMMDDHH24MISS')) * 86400 AS TRVL_HH
+                     FROM (SELECT OBU_IDNT_NMBR,
+                                  LAG(RSE_CTLR_NMBR) OVER (PARTITION BY OBU_IDNT_NMBR ORDER BY CLCT_DT) AS F_RSE_CTLR_NMBR,
+                                  RSE_CTLR_NMBR                                                         AS T_RSE_CTLR_NMBR,
+                                  LAG(CLCT_DT) OVER (PARTITION BY OBU_IDNT_NMBR ORDER BY CLCT_DT)       AS F_CLCT_DT,
+                                  CLCT_DT                                                               AS T_CLCT_DT
+                           FROM (SELECT OBU_IDNT_NMBR, CLCT_DT, RSE_CTLR_NMBR AS RSE_CTLR_NMBR
+                                 FROM TB_RSE_OBU_CLCT_HS
+                                 WHERE CLCT_DT BETWEEN #{prcs.FROM_DT} AND #{prcs.TO_DT}
+                                 UNION ALL
+                                 SELECT OBU_IDNT_NMBR, CLCT_DT, RSE_CTLR_NMBR AS RSE_CTLR_NMBR
+                                 FROM TB_RSE_OBU_CLCT_HS
+                                 WHERE CLCT_DT BETWEEN #{prcs.B_FROM_DT} AND #{prcs.B_TO_DT}
+                                   AND (OBU_IDNT_NMBR, CLCT_DT) IN (SELECT OBU_IDNT_NMBR, MAX(CLCT_DT) AS CLCT_DT
+                                                                    FROM TB_RSE_OBU_CLCT_HS
+                                                                    WHERE CLCT_DT BETWEEN #{prcs.B_FROM_DT} AND #{prcs.B_TO_DT}
+                                                                    GROUP BY OBU_IDNT_NMBR)
+                                )
+                          )
+                     WHERE F_RSE_CTLR_NMBR IS NOT NULL
+                       AND F_RSE_CTLR_NMBR <> T_RSE_CTLR_NMBR
                     )
+               GROUP BY F_RSE_CTLR_NMBR, T_RSE_CTLR_NMBR) M
+        ON ( L.STAT_DT         = M.STAT_DT
+         AND L.F_RSE_CTLR_NMBR = M.F_RSE_CTLR_NMBR
+         AND L.T_RSE_CTLR_NMBR = M.T_RSE_CTLR_NMBR )
+        WHEN MATCHED THEN
+            UPDATE SET L.DAY_TYPE_CD = M.DAY_TYPE_CD,
+                       L.TFVL        = M.TFVL
+        WHEN NOT MATCHED THEN
+            INSERT (
+                    L.STAT_DT,
+                    L.F_RSE_CTLR_NMBR,
+                    L.T_RSE_CTLR_NMBR,
+                    L.DAY_TYPE_CD,
+                    L.TFVL
+                ) VALUES (
+                    M.STAT_DT,
+                    M.F_RSE_CTLR_NMBR,
+                    M.T_RSE_CTLR_NMBR,
+                    M.DAY_TYPE_CD,
+                    M.TFVL
+                )
         ]]>
     </update>
 

+ 51 - 0
src/test/java/com/its/app/DsrcCommServerApplicationTests.java

@@ -0,0 +1,51 @@
+package com.its.app;
+
+import com.beanit.asn1bean.ber.types.BerEnum;
+import com.beanit.asn1bean.ber.types.BerInteger;
+import com.beanit.asn1bean.ber.types.BerObjectIdentifier;
+import com.beanit.asn1bean.ber.types.BerOctetString;
+import com.beanit.asn1bean.ber.types.string.BerUTF8String;
+import com.beanit.asn1dsrc.dsrc.C2CAuthenticatedMessage;
+import com.beanit.asn1dsrc.dsrc.Login;
+import com.beanit.asn1dsrc.dsrc.PDUs;
+import com.beanit.asn1dsrc.enums.eAuthInfo;
+import com.beanit.asn1dsrc.util.DsrcAsn1Utils;
+import com.its.dsrc.DsrcCommServerApplication;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@Slf4j
+@SpringBootTest(classes = DsrcCommServerApplication.class)
+public class DsrcCommServerApplicationTests {
+
+    @Test
+    void test1() {
+        Login login = new Login();
+        login.setDatexSenderTxt(new BerUTF8String("GJATMSSERVER"));
+        login.setDatexDestinationTxt(new BerUTF8String("GJATMSSERVER"));
+        login.setDatexLoginUserNameTxt(new BerUTF8String("PTATMS"));
+        login.setDatexLoginPasswordTxt(new BerUTF8String("PTATMS"));
+        login.setDatexLoginHeartbeatDurationMaxQty(new BerInteger(120));
+        login.setDatexLoginResponseTimeOutQty(new BerInteger(5));
+        login.setDatexLoginInitiatorCd(new BerEnum(1));
+        login.setDatexLoginDatagramSizeQty(new BerInteger(2048));
+        int[] encodingRules = {2, 1, 1};
+        Login.DatexLoginEncodingRulesId loginEncodingRulesId = new Login.DatexLoginEncodingRulesId();
+        loginEncodingRulesId.getBerObjectIdentifier().add(new BerObjectIdentifier(encodingRules));
+        login.setDatexLoginEncodingRulesId(loginEncodingRulesId);
+
+        byte[] auth = {(byte) eAuthInfo.AI_Login.getValue() };
+        PDUs loginPdu = new PDUs();
+        loginPdu.setLogin(login);
+
+        C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
+        c2c.setDatexAuthenticationInfoText(new BerOctetString(auth));
+        c2c.setDatexDataPacketNumber(new BerInteger(1234));
+        c2c.setDatexDataPacketPriorityNumber(new BerInteger(1));
+        c2c.setOptions(DsrcAsn1Utils.getDefaultOptions());
+        c2c.setPdu(loginPdu);
+
+        log.error("{}", c2c);
+    }
+}