shjung 11 meses atrás
pai
commit
d55d7a5c98
30 arquivos alterados com 511 adições e 918 exclusões
  1. 8 4
      src/main/java/com/beanit/utils/ItsAsn.java
  2. 1 1
      src/main/java/com/beanit/utils/ItsAsnSequence.java
  3. 1 1
      src/main/java/com/its/rota/server/ItsRotaServerApplication.java
  4. 7 3
      src/main/java/com/its/rota/server/config/SchedulingConfig.java
  5. 128 106
      src/main/java/com/its/rota/server/dto/CenterDto.java
  6. 0 1
      src/main/java/com/its/rota/server/entity/TbSndLog.java
  7. 12 23
      src/main/java/com/its/rota/server/process/dbms/DbmsData.java
  8. 56 63
      src/main/java/com/its/rota/server/process/dbms/DbmsDataProcess.java
  9. 0 8
      src/main/java/com/its/rota/server/process/dbms/DbmsDataType.java
  10. 1 1
      src/main/java/com/its/rota/server/repository/ApplicationRepository.java
  11. 37 0
      src/main/java/com/its/rota/server/scheduler/ApplicationScheduler.java
  12. 49 33
      src/main/java/com/its/rota/server/service/ItsRotaServerService.java
  13. 1 3
      src/main/java/com/its/rota/server/xnet/server/ItsAsnCommServerInitializer.java
  14. 2 1
      src/main/java/com/its/rota/server/xnet/server/codec/ItsAsnServerDecoder.java
  15. 1 0
      src/main/java/com/its/rota/server/xnet/server/codec/ItsAsnServerEncoder.java
  16. 0 185
      src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerIdleStateConnectionHandler.java
  17. 0 156
      src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerIdleStatePacketHandler.java
  18. 0 147
      src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerLoginInboundHandler.java
  19. 2 2
      src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerPacketInboundHandler.java
  20. 80 0
      src/main/java/com/its/rota/server/xnet/server/process/request/AiPublicationIncidentCondition.java
  21. 80 0
      src/main/java/com/its/rota/server/xnet/server/process/request/AiPublicationTraffic.java
  22. 20 0
      src/main/java/com/its/rota/server/xnet/server/process/response/AcceptResponse.java
  23. 0 103
      src/main/java/com/its/rota/server/xnet/server/process/response/DsrcAsn1Accept.java
  24. 0 60
      src/main/java/com/its/rota/server/xnet/server/process/response/DsrcAsn1Reject.java
  25. 8 10
      src/main/java/com/its/rota/server/xnet/server/process/response/PublicationResponse.java
  26. 1 3
      src/main/java/com/its/rota/server/xnet/server/process/response/RejectResponse.java
  27. 1 1
      src/main/java/com/its/rota/server/xnet/server/process/work/DataPacketProcess.java
  28. 1 1
      src/main/java/com/its/rota/server/xnet/server/process/work/DataPacketWorker.java
  29. 6 1
      src/main/resources/application.yml
  30. 8 1
      src/main/resources/mybatis/mapper/SndLogMapper.xml

+ 8 - 4
src/main/java/com/beanit/utils/ItsAsn.java

@@ -8,13 +8,17 @@ public class ItsAsn {
 
     public static final int SERVER_MAX_RETRY_COUNT = 3;
 
-    public static final int DATEX_MAX_STATE_COUNT = 1000;   /* max current link state count */
-    public static final int DATEX_MAX_EVENT_COUNT = 32;     /* max event identity count */
-    public static final int DATEX_MAX_INC_COUNT = 32;       /* max incident identity count */
-    public static final int DATEX_MAX_CON_COUNT = 32;       /* max incident conditions count */
+    public static final int DATEX_MAX_TRAFFIC_COUNT = 1000;             /* max current link state count */
+    public static final int DATEX_MAX_IDENTITY_COUNT = 32;              /* max event identity count */
+    public static final int DATEX_MAX_INCIDENT_IDENTITY_COUNT = 32;     /* max incident identity count */
+    public static final int DATEX_MAX_INCIDENT_CONDITION_COUNT = 32;    /* max incident conditions count */
 
     public static final String DATEX_LINK_TEXT = "0000000000";
     public static final String DATEX_NODE_TEXT = "0000000000";
     public static final String DATEX_DEFAULT_TEXT = " ";
 
+    public static final int ITS_ASN_DATEX_MAX_SEQUENCE = 60000;
+    public static final int ITS_ASN_DATEX_INCIDENT_SEQUENCE = 61000;
+    public static final int ITS_ASN_DATEX_TRAFFIC_SEQUENCE = 62000;
+
 }

+ 1 - 1
src/main/java/com/beanit/utils/ItsAsnSequence.java

@@ -13,7 +13,7 @@ public class ItsAsnSequence {
 
     public int nextValue() {
         synchronized (this.seq) {
-            if (this.seq.intValue() == 65535) {
+            if (this.seq.intValue() == ItsAsn.ITS_ASN_DATEX_MAX_SEQUENCE) {
                 this.seq = Integer.valueOf(1);
             } else {
                 this.seq = Integer.valueOf(this.seq.intValue() + 1);

+ 1 - 1
src/main/java/com/its/rota/server/ItsRotaServerApplication.java

@@ -2,7 +2,7 @@ package com.its.rota.server;
 
 import com.its.rota.server.common.SpringUtils;
 import com.its.rota.server.process.dbms.DbmsDataProcess;
-import com.its.rota.server.process.work.DataPacketProcess;
+import com.its.rota.server.xnet.server.process.work.DataPacketProcess;
 import com.its.rota.server.repository.ApplicationRepository;
 import com.its.rota.server.service.UnitSystService;
 import com.its.rota.server.xnet.server.ItsAsnCommServerService;

+ 7 - 3
src/main/java/com/its/rota/server/config/SchedulingConfig.java

@@ -2,6 +2,8 @@ package com.its.rota.server.config;
 
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.SchedulingConfigurer;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@@ -10,18 +12,20 @@ import javax.annotation.PostConstruct;
 
 @Slf4j
 @Data
-//@Configuration
-//@ConfigurationProperties(prefix = "application.scheduling")
+@Configuration
+@ConfigurationProperties(prefix = "application.scheduler")
 public class SchedulingConfig implements SchedulingConfigurer {
 
     private int poolSize = 0;
+    private boolean useSndIncident = true;
+    private boolean useSndLog = true;
 
     @PostConstruct
     private void init() {
         log.info("[{}] ------------", this.getClass().getSimpleName());
         if (this.poolSize == 0) {
             log.warn("[{}] poolSize size set as default: {} EA.", this.getClass().getSimpleName(), this.poolSize);
-            this.poolSize = 20;
+            this.poolSize = 10;
         }
         log.info("[{}] poolCore: {} EA.", this.getClass().getSimpleName(), this.poolSize);
     }

+ 128 - 106
src/main/java/com/its/rota/server/dto/CenterDto.java

@@ -1,20 +1,29 @@
 package com.its.rota.server.dto;
 
-import com.beanit.asn1bean.ber.ReverseByteArrayOutputStream;
-import com.beanit.asn1bean.ber.types.*;
+import com.beanit.asn1bean.ber.types.BerBitString;
+import com.beanit.asn1bean.ber.types.BerEnum;
+import com.beanit.asn1bean.ber.types.BerInteger;
 import com.beanit.asn1bean.ber.types.string.BerUTF8String;
-import com.beanit.enums.eAuthInfo;
 import com.beanit.its.*;
 import com.beanit.utils.ItsAsn;
 import com.beanit.utils.ItsAsnSequence;
+import com.its.app.common.utils.SysUtils;
+import com.its.rota.server.common.SpringUtils;
 import com.its.rota.server.entity.TbSndIncident;
+import com.its.rota.server.entity.TbSndLog;
+import com.its.rota.server.entity.TbTrafficCenter;
+import com.its.rota.server.process.dbms.DbmsData;
+import com.its.rota.server.process.dbms.DbmsDataProcess;
 import com.its.rota.server.repository.ApplicationRepository;
+import com.its.rota.server.xnet.server.process.request.AiPublicationIncidentCondition;
+import com.its.rota.server.xnet.server.process.request.AiPublicationTraffic;
 import io.netty.channel.ChannelFuture;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.scheduling.annotation.Async;
 
 import java.io.Serializable;
@@ -87,118 +96,131 @@ public class CenterDto implements Serializable {
 
     @Async("jobDataExecutor")
     public void executeSendIncident() {
-        sendIncident();
+        AiPublicationIncidentCondition.run(this);
     }
 
-    public void sendIncident() {
-        try {
-            if (!channelOpened()) {
-                return;
+    public IncidentConditionsList getIncidentConditionsList() {
+        IncidentConditionsList lists = new IncidentConditionsList();
+        if (!channelOpened()) {
+            return lists;
+        }
+        if (this.incident.getSendIdx() > 0 && this.incident.getSendIdx() >= this.incident.getIncidents().size()) {
+            // 모든 돌발 정보를 전송하였다.
+            DbmsDataProcess dbmsDataProcess = SpringUtils.getBean(DbmsDataProcess.class);
+            TbSndLog log = TbSndLog.builder()
+                    .logDate(SysUtils.getSysTime())
+                    .infoKind(DbmsData.D_KIND_INC)
+                    .fromCenterId(ApplicationRepository.center.getCenterId())
+                    .toCenterId(this.getCenterId())
+                    .dataCnt(this.incident.getIncidents().size())
+                    .build();
+            dbmsDataProcess.add(new DbmsData(this, DbmsData.DBMS_DATA_LOG_INCIDENT, log));
+            return lists;
+        }
+
+        int start = this.incident.getSendIdx();
+        int end = Math.min(start + ItsAsn.DATEX_MAX_INCIDENT_CONDITION_COUNT, this.incident.getIncidents().size());
+
+        for (int ii = start; ii < end; ii++) {
+            TbSndIncident data = this.incident.getIncidents().get(ii);
+            if (data.getNodeId() == null || data.getNodeId().isEmpty()) {
+                data.setNodeId(ItsAsn.DATEX_NODE_TEXT);
             }
-            if (this.incident.getSendIdx() > 0 && this.incident.getSendIdx() == this.incident.getIncidents().size()) {
-                // 모든 돌발 정보를 전송하였다.
-                return;
+            if (data.getLinkId() == null || data.getLinkId().isEmpty()) {
+                data.setLinkId(ItsAsn.DATEX_LINK_TEXT);
             }
-
-            int start = this.incident.getSendIdx();
-            int end = Math.min(start + ItsAsn.DATEX_MAX_INC_COUNT, this.incident.getIncidents().size());
-            if (start == end) {
-                return;
+            if (data.getContactOrganizationNameText() == null || data.getContactOrganizationNameText().isEmpty()) {
+                data.setContactOrganizationNameText(ItsAsn.DATEX_DEFAULT_TEXT);
             }
-
-            IncidentConditionsList lists = new IncidentConditionsList();
-            for (int ii = start; ii < end; ii++) {
-                TbSndIncident data = this.incident.getIncidents().get(ii);
-                if (data.getNodeId() == null || data.getNodeId().isEmpty()) {
-                    data.setNodeId(ItsAsn.DATEX_NODE_TEXT);
-                }
-                if (data.getLinkId() == null || data.getLinkId().isEmpty()) {
-                    data.setLinkId(ItsAsn.DATEX_LINK_TEXT);
-                }
-                if (data.getContactOrganizationNameText() == null || data.getContactOrganizationNameText().isEmpty()) {
-                    data.setContactOrganizationNameText(ItsAsn.DATEX_DEFAULT_TEXT);
-                }
-                if (data.getDescriptionTypeIncidentOther() == null || data.getDescriptionTypeIncidentOther().isEmpty()) {
-                    data.setDescriptionTypeIncidentOther(ItsAsn.DATEX_DEFAULT_TEXT);
-                }
-                if (data.getIncidentVehiclesInvolvedOther() == null || data.getIncidentVehiclesInvolvedOther().isEmpty()) {
-                    data.setIncidentVehiclesInvolvedOther(ItsAsn.DATEX_DEFAULT_TEXT);
-                }
-                if (data.getIncidentStatusOther() == null || data.getIncidentStatusOther().isEmpty()) {
-                    data.setIncidentStatusOther(ItsAsn.DATEX_DEFAULT_TEXT);
-                }
-                if (data.getUpdateTypeOther() == null || data.getUpdateTypeOther().isEmpty()) {
-                    data.setUpdateTypeOther(ItsAsn.DATEX_DEFAULT_TEXT);
-                }
-
-                IncidentConditions cond = new IncidentConditions();
-
-                cond.setNodeNodeIdNumber(new BerUTF8String(data.getNodeId()));
-                cond.setLinkLinkIdNumber(new BerUTF8String(data.getLinkId()));
-                cond.setOrgnContactOrganizationNameText(new BerUTF8String(data.getContactOrganizationNameText()));
-                cond.setEvntDescriptionTypeIncidentCode(new BerEnum(data.getDescriptionTypeIncidentCode()));
-                cond.setEvntDescriptionTypeIncidentOther(new BerUTF8String(data.getDescriptionTypeIncidentOther()));
-
-                byte[] bitData = new byte[1];
-                bitData[0] = (byte) (data.getIncidentVehiclesInvolvedCode() & 0xFF);
-                cond.setEvntIncidentVehiclesInvolvedCode(new BerBitString(bitData, 8));
-
-                cond.setEvntIncidentVehiclesInvolvedOther(new BerUTF8String(data.getIncidentVehiclesInvolvedOther()));
-                cond.setEvntIncidentStatusCode(new BerEnum(data.getIncidentStatusCode()));
-                cond.setEvntIncidentStatusOther(new BerUTF8String(data.getIncidentStatusOther()));
-                cond.setEvntUpdateTypeCode(new BerEnum(data.getUpdateTypeCode()));
-                cond.setEvntUpdateTypeOther(new BerUTF8String(data.getUpdateTypeOther()));
-
-                lists.getIncidentConditions().add(cond);
+            if (data.getDescriptionTypeIncidentOther() == null || data.getDescriptionTypeIncidentOther().isEmpty()) {
+                data.setDescriptionTypeIncidentOther(ItsAsn.DATEX_DEFAULT_TEXT);
             }
-
-            if (lists.getIncidentConditions().isEmpty()) {
-                return;
+            if (data.getIncidentVehiclesInvolvedOther() == null || data.getIncidentVehiclesInvolvedOther().isEmpty()) {
+                data.setIncidentVehiclesInvolvedOther(ItsAsn.DATEX_DEFAULT_TEXT);
             }
-            EndApplicationMessage endMsg =  new EndApplicationMessage();
-            int[] messageId = {1, 0, 14827, 1, 1, 4};
-            ReverseByteArrayOutputStream msgBuff = new ReverseByteArrayOutputStream(ItsAsn.ITS_ASN_PACKET_MAX_SIZE);
-            lists.encode(msgBuff);
-            endMsg.setEndApplicationMessageId(new BerObjectIdentifier(messageId));
-            endMsg.setEndApplicationMessageMsg(new BerAny(msgBuff.getArray()));
-
-            byte[] auth = { eAuthInfo.AI_IncidentConditions.getValue() };
-            int packetNmbr = this.seq.nextValue();
-
-            PublicationType publicationType = new PublicationType();
-            publicationType.setDatexPublishData(endMsg);
-
-            PublicationData publicationData = new PublicationData();
-            publicationData.setDatexPublishSubscribeSerialNbr(new BerInteger(packetNmbr));  // 요청 serial nmbr
-            publicationData.setDatexPublishSerialNbr(new BerInteger(packetNmbr));           // 생성 serial nmbr
-            publicationData.setDatexPublishLatePublicationFlag(new BerBoolean(true));
-            publicationData.setDatexPublishType(publicationType);
-
-            PublishFormat.DatexPublishData publishData = new PublishFormat.DatexPublishData();
-            publishData.getPublicationData().add(publicationData);
-
-            PublishFormat publishFormat = new PublishFormat();
-            publishFormat.setDatexPublishData(publishData);
-
-            Publication publication = new Publication();
-            publication.setDatexPublishFormat(publishFormat);
-            publication.setDatexPublishGuaranteedBool(new BerBoolean(true));
-
-            C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
-            PDUs pdus = new PDUs();
-            pdus.setPublication(publication);
-            c2c.setDatexDataPacketNumber(new BerInteger(packetNmbr));
-            c2c.setDatexDataPacketPriorityNumber(new BerInteger(1));
-            c2c.setDatexAuthenticationInfoText(new BerOctetString(auth));
-            c2c.setOptions(ApplicationRepository.getHeaderOptions(this));
-            c2c.setPdu(pdus);
-
-            sendData(c2c, "AI_IncidentConditions");
-            this.incident.setSendIdx(end);
+            if (data.getIncidentStatusOther() == null || data.getIncidentStatusOther().isEmpty()) {
+                data.setIncidentStatusOther(ItsAsn.DATEX_DEFAULT_TEXT);
+            }
+            if (data.getUpdateTypeOther() == null || data.getUpdateTypeOther().isEmpty()) {
+                data.setUpdateTypeOther(ItsAsn.DATEX_DEFAULT_TEXT);
+            }
+
+            IncidentConditions cond = new IncidentConditions();
+
+            cond.setNodeNodeIdNumber(new BerUTF8String(data.getNodeId()));
+            cond.setLinkLinkIdNumber(new BerUTF8String(data.getLinkId()));
+            cond.setOrgnContactOrganizationNameText(new BerUTF8String(data.getContactOrganizationNameText()));
+            cond.setEvntDescriptionTypeIncidentCode(new BerEnum(data.getDescriptionTypeIncidentCode()));
+            cond.setEvntDescriptionTypeIncidentOther(new BerUTF8String(data.getDescriptionTypeIncidentOther()));
+
+            byte[] bitData = new byte[1];
+            bitData[0] = (byte) (data.getIncidentVehiclesInvolvedCode() & 0xFF);
+            cond.setEvntIncidentVehiclesInvolvedCode(new BerBitString(bitData, 8));
+
+            cond.setEvntIncidentVehiclesInvolvedOther(new BerUTF8String(data.getIncidentVehiclesInvolvedOther()));
+            cond.setEvntIncidentStatusCode(new BerEnum(data.getIncidentStatusCode()));
+            cond.setEvntIncidentStatusOther(new BerUTF8String(data.getIncidentStatusOther()));
+            cond.setEvntUpdateTypeCode(new BerEnum(data.getUpdateTypeCode()));
+            cond.setEvntUpdateTypeOther(new BerUTF8String(data.getUpdateTypeOther()));
+
+            lists.getIncidentConditions().add(cond);
+        }
+        this.incident.setSendIdx(end);
+        return lists;
+    }
+
+    @Async("jobDataExecutor")
+    public void executeSendTraffic() {
+        AiPublicationTraffic.run(this);
+    }
+
+    public CurrentLinkStateList getCurrentLinkStateList() {
+        CurrentLinkStateList lists = new CurrentLinkStateList();
+        if (!channelOpened()) {
+            return lists;
         }
-        catch (Exception e) {
-            log.error("INCIDENT: [{}, {}]. Incident Data Send Exception. {}", this.centerId, this.ipAddress, e.getMessage());
+        if (this.traffic.getSendIdx() > 0 && this.traffic.getSendIdx() >= ApplicationRepository.traffics.size()) {
+            // 모든 교통 정보를 전송하였다.
+            DbmsDataProcess dbmsDataProcess = SpringUtils.getBean(DbmsDataProcess.class);
+            TbSndLog log = TbSndLog.builder()
+                    .logDate(SysUtils.getSysTime())
+                    .infoKind(DbmsData.D_KIND_TRAF)
+                    .fromCenterId(ApplicationRepository.center.getCenterId())
+                    .toCenterId(this.getCenterId())
+                    .dataCnt(ApplicationRepository.traffics.size())
+                    .build();
+            dbmsDataProcess.add(new DbmsData(this, DbmsData.DBMS_DATA_LOG_TRAFFIC, log));
+            return lists;
         }
+
+        int start = this.traffic.getSendIdx();
+        int end = Math.min(start + ItsAsn.DATEX_MAX_TRAFFIC_COUNT, ApplicationRepository.traffics.size());
+
+        for (int ii = start; ii < end; ii++) {
+            CurrentLinkState traf = getCurrentLinkState(ii);
+            lists.getCurrentLinkState().add(traf);
+        }
+        this.traffic.setSendIdx(end);
+        return lists;
     }
 
+    @NotNull
+    private static CurrentLinkState getCurrentLinkState(int ii) {
+        TbTrafficCenter data = ApplicationRepository.traffics.get(ii);
+        if (data.getLinkId() == null || data.getLinkId().isEmpty()) {
+            data.setLinkId(ItsAsn.DATEX_LINK_TEXT);
+        }
+
+        CurrentLinkState traf = new CurrentLinkState();
+
+        traf.setLinkLinkIdNumber(new BerUTF8String(data.getLinkId()));
+        traf.setLinkSpeedRate(new BerInteger(data.getSpeed()));
+        traf.setLinkVolumeRate(new BerInteger(0));
+        traf.setLinkDensityRate(new BerInteger(data.getTrafficGrade()));
+        traf.setLinkTravelTimeQuantity(new BerInteger(data.getTravelTime()));
+        traf.setLinkDelayQuanity(new BerInteger(data.getDataResType()));
+        traf.setTfdtVehicleQueueLengthQuantity(new BerInteger(0));
+        traf.setTfdtOccupancyPercent(new BerInteger(0));
+        return traf;
+    }
 }

+ 0 - 1
src/main/java/com/its/rota/server/entity/TbSndLog.java

@@ -15,7 +15,6 @@ public class TbSndLog {
     private String infoKind;
     private String toCenterId;
     private String fromCenterId;
-//    private String infoType;
     private int dataCnt;
 
 }

+ 12 - 23
src/main/java/com/its/rota/server/process/dbms/DbmsData.java

@@ -8,34 +8,23 @@ import lombok.Setter;
 @Setter
 public class DbmsData {
 
+    public static final String D_KIND_TRAF = "T";
+    public static final String D_KIND_INC = "I";
+
+    public static final int DBMS_DATA_PROCESS_STTS = 0;
+    public static final int DBMS_DATA_LOG_INCIDENT = 1;
+    public static final int DBMS_DATA_LOG_TRAFFIC = 2;
+
+    private long      timestamp;
     private CenterDto center;
-    private int          qIdx;
-    private long         timestamp;
-    private long         popTimestamp;
-    private long         parseTimestamp;
-    private String       regionCd;
-    private int          regionId;
-    private DbmsDataType type;
-    private boolean      isHistory;
-    private Object       data;
+    private int       type;
+    private Object    data;
 
-    public DbmsData(CenterDto center, int qIdx, long timestamp, long popTimestamp, long parseTimestamp, String regionCd, int regionId, DbmsDataType type, boolean isHistory, Object data) {
+    public DbmsData(CenterDto center, int type, Object data) {
         this.center = center;
-        this.qIdx = qIdx;
-        this.timestamp = timestamp;
-        this.popTimestamp = popTimestamp;
-        this.parseTimestamp = parseTimestamp;
-        this.regionCd = regionCd;
-        this.regionId = regionId;
+        this.timestamp = System.currentTimeMillis();
         this.type      = type;
-        this.isHistory = isHistory;
         this.data      = data;
     }
 
-    public long getPopTimestamp() {
-        return this.popTimestamp - this.timestamp;
-    }
-    public long getParsingTimestamp() {
-        return this.parseTimestamp - this.popTimestamp;
-    }
 }

+ 56 - 63
src/main/java/com/its/rota/server/process/dbms/DbmsDataProcess.java

@@ -1,12 +1,16 @@
 package com.its.rota.server.process.dbms;
 
+import com.its.app.common.utils.Elapsed;
 import com.its.rota.server.common.SpringUtils;
 import com.its.rota.server.config.ThreadPoolInitializer;
+import com.its.rota.server.dao.mapper.IncidentMapper;
 import com.its.rota.server.dao.mapper.ProcessMapper;
-import com.its.rota.server.dao.mapper.batch.ItsRotaDao;
+import com.its.rota.server.dao.mapper.SndLogMapper;
 import com.its.rota.server.entity.TbProcessState;
+import com.its.rota.server.entity.TbSndLog;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
 import org.springframework.stereotype.Service;
 
 import java.util.concurrent.Executors;
@@ -23,7 +27,8 @@ public class DbmsDataProcess {
 
     private final DbmsDataAsyncTask asyncTask;
     private final ProcessMapper processMapper;
-    private final ItsRotaDao itsRotaDao;
+    private final IncidentMapper incidentMapper;
+    private final SndLogMapper sndLogMapper;
 
     private int maxCore = Runtime.getRuntime().availableProcessors();
 
@@ -41,8 +46,7 @@ public class DbmsDataProcess {
                 while (isRunning) {
                     try {
                         DbmsData data = dbmsDataBlockingQueue.take();
-                        asyncTask.run(this, data);
-//                        runJob(data);
+                        this.asyncTask.run(this, data);
                     }
                     catch (Exception e) {
                         log.error("DbmsDataProcess.Task: Exception: {}", e.getMessage(), e);
@@ -57,68 +61,57 @@ public class DbmsDataProcess {
     }
 
     public void runJob(DbmsData data) {
-        if (data.getType() == DbmsDataType.DBMS_DATA_PROCESS_STTS) {
-            TbProcessState stts = (TbProcessState) data.getData();
-            if (TbProcessState.PROCESS_START.equals(stts.getRunState())) {
-                this.processMapper.updProcessStateStart(stts);
-            }
-            else if (TbProcessState.PROCESS_STOP.equals(stts.getRunState())) {
-                this.processMapper.updProcessStateStop(stts);
-            }
-            else {
-                this.processMapper.updProcessState(stts);
-            }
-            stts = null;
-        }
-        else {
-            process(data);
-        }
+        process(data);
     }
 
     public void process(DbmsData data) {
-        int cnt = 0;
-        long start = System.currentTimeMillis();
-//        try {
-//            DbmsDataType type = data.getType();
-//            switch(type) {
-//                case DBMS_DATA_INT_STATUS_UPDATE:
-//                    RegionCenter center = data.getCenter();
-//                    if (center == null) {
-//                        log.error("RegionCenter is null");
-//                        return;
-//                    }
-//                    List<IntStatusDto> intStatusLists = (List<IntStatusDto>)data.getData();
-//                    cnt = this.sigIntDao.updateStatus(intStatusLists);
-//                    log.info("INT_STATUS_UPDATE: [{}, {}], {}",
-//                            data.getRegionCd(), data.getRegionId(),
-//                            String.format("%4d/%4d EA. Pop(%5d)/Parsing(%5d)/Dbms(%5d)/Total(%5d) ms.",
-//                                    intStatusLists.size(), cnt,
-//                                    data.getPopTimestamp(), data.getParsingTimestamp(),
-//                                    System.currentTimeMillis() - start,
-//                                    System.currentTimeMillis() - data.getTimestamp()));
-//
-//                    intStatusLists.clear();
-//                    break;
-//                case DBMS_DATA_CENTER_STTS:
-//                    TbRegionCenterComm stts = (TbRegionCenterComm) data.getData();
-//                    if (TbRegionCenterComm.CENTER_COMM_START.equals(stts.getCommState())) {
-//                        this.centerMapper.updateCommStateConnect(stts);
-//                    }
-//                    else if (TbRegionCenterComm.CENTER_COMM_STOP.equals(stts.getCommState())) {
-//                        this.centerMapper.updateCommStateDisconnect(stts);
-//                    }
-//                    else {
-//                        this.centerMapper.updateCommState(stts);
-//                    }
-//                    stts = null;
-//                    break;
-//                default:
-//                    log.error("DbmsDataProcess.process: Unknown Request {}.", type);
-//                    break;
-//            }
-//        } catch (Exception e) {
-//            log.error("DbmsDataProcess.process: Exception: {}", e.toString());
-//        }
+        int type = data.getType();
+        try {
+            MDC.put("id", data.getCenter().getLogKey());
+            Elapsed elapsed1 = new Elapsed();
+            switch(type) {
+                case DbmsData.DBMS_DATA_PROCESS_STTS:
+                    TbProcessState stts = (TbProcessState) data.getData();
+                    if (TbProcessState.PROCESS_START.equals(stts.getRunState())) {
+                        this.processMapper.updProcessStateStart(stts);
+                    }
+                    else if (TbProcessState.PROCESS_STOP.equals(stts.getRunState())) {
+                        this.processMapper.updProcessStateStop(stts);
+                    }
+                    else {
+                        this.processMapper.updProcessState(stts);
+                    }
+                    break;
+                case DbmsData.DBMS_DATA_LOG_INCIDENT:
+                    TbSndLog incLog = (TbSndLog) data.getData();
+                    this.sndLogMapper.insSndLog(incLog);
+                    if (DbmsData.D_KIND_INC.equals(incLog.getInfoKind())) {
+                        this.incidentMapper.updSndIncident(incLog);
+                        incLog.setInfoKind("E1");
+                        this.sndLogMapper.insSndLog(incLog);
+                    }
+                    break;
+                case DbmsData.DBMS_DATA_LOG_TRAFFIC:
+                    TbSndLog trfLog = (TbSndLog) data.getData();
+                    this.sndLogMapper.insSndLog(trfLog);
+                    if (DbmsData.D_KIND_TRAF.equals(trfLog.getInfoKind())) {
+                        trfLog.setInfoKind("R1");
+                        this.sndLogMapper.insSndLog(trfLog);
+                    }
+                    break;
+                default:
+                    log.error("DbmsDataProcess.process: Unknown Request {}.", type);
+                    break;
+            }
+            log.info("AiPublicationTraffic.run: [{}, {}]. {}, {}",
+                    data.getCenter().getLogKey(), data.getCenter().getIpAddress(), type, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
+        }
+        catch (Exception e) {
+            log.error("DbmsDataProcess.process: Exception: {}", e.toString());
+        }
+        finally {
+            MDC.clear();
+        }
     }
 
     /*

+ 0 - 8
src/main/java/com/its/rota/server/process/dbms/DbmsDataType.java

@@ -1,8 +0,0 @@
-package com.its.rota.server.process.dbms;
-
-public enum DbmsDataType {
-
-    DBMS_DATA_PROCESS_STTS,
-    DBMS_DATA_CENTER_STTS,
-    DBMS_DATA_INT_STATUS_UPDATE,
-}

+ 1 - 1
src/main/java/com/its/rota/server/repository/ApplicationRepository.java

@@ -103,7 +103,7 @@ public class ApplicationRepository {
             for (TbCenter entity : lists) {
                 log.info("ApplicationRepository.loadCenterInfo: {}.", entity);
                 CenterDto dto = entity.toDto();
-                if (dto.getResTime() < 5) {
+                if (dto.getResTime() < 10) {
                     dto.setResTime(10);
                 }
                 if (dto.getHeartBeat() < 30) {

+ 37 - 0
src/main/java/com/its/rota/server/scheduler/ApplicationScheduler.java

@@ -1,6 +1,7 @@
 package com.its.rota.server.scheduler;
 
 import com.its.app.common.utils.Elapsed;
+import com.its.rota.server.config.SchedulingConfig;
 import com.its.rota.server.service.ItsRotaServerService;
 import com.its.rota.server.service.UnitSystService;
 import lombok.RequiredArgsConstructor;
@@ -19,6 +20,7 @@ import javax.annotation.PreDestroy;
 public class ApplicationScheduler {
 
     private final UnitSystService unitSystService;
+    private final SchedulingConfig config;
     private final ItsRotaServerService itsRotaServerService;
 
     @PreDestroy
@@ -39,6 +41,41 @@ public class ApplicationScheduler {
 //            log.error("ApplicationScheduler.unitSystSchedule: Exception {}", e.getMessage());
 //        }
     }
+
+    @Async
+    @Scheduled(cron = "${application.scheduler.delete-snd-incident:0/40 3 * * * *}")
+    public void deleteSndIncident() {
+        if (!this.config.isUseSndIncident()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("ApplicationScheduler.deleteSndIncident: start.");
+        try {
+            //this.deleteService.deleteSndIncident();
+            log.info("ApplicationScheduler.deleteSndIncident: {}", Elapsed.elapsedTimeStr(elapsed.nanoSeconds()));
+        }
+        catch(Exception e) {
+            log.error("ApplicationScheduler.deleteSndIncident: Exception {}", e.getMessage());
+        }
+    }
+
+    @Async
+    @Scheduled(cron = "${application.scheduler.delete-snd-log:0/40 3 * * * *}")
+    public void deleteSndLog() {
+        if (!this.config.isUseSndLog()) {
+            return;
+        }
+        Elapsed elapsed = new Elapsed();
+        log.info("ApplicationScheduler.deleteSndLog: start.");
+        try {
+//            this.deleteService.deleteSndLog();
+            log.info("ApplicationScheduler.deleteSndLog: {}", Elapsed.elapsedTimeStr(elapsed.nanoSeconds()));
+        }
+        catch(Exception e) {
+            log.error("ApplicationScheduler.deleteSndLog: Exception {}", e.getMessage());
+        }
+    }
+
     @Async
     @Scheduled(cron = "0 * * * * *")  // 1분 주기 작업 실행
     public void checkSendIncident() {

+ 49 - 33
src/main/java/com/its/rota/server/service/ItsRotaServerService.java

@@ -82,6 +82,16 @@ public class ItsRotaServerService {
                     this.checkTrafficTime = trafficTime;
 
                     ApplicationRepository.traffics = traffics;
+
+                    List<String> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
+                    Collections.sort(keySet);
+                    for (String key : keySet) {
+                        CenterDto center = this.repo.getCenterMap().get(key);
+                        if (center == null) {
+                            continue;
+                        }
+                        center.executeSendTraffic();
+                    }
                 }
             }
         }
@@ -104,7 +114,9 @@ public class ItsRotaServerService {
         try {
             Elapsed elapsed1 = new Elapsed();
             int deletes = this.incidentMapper.delCheckIncident();
-            log.info("ItsRotaServerService.checkSendIncident: delCheckIncident {} EA. {}", deletes, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
+            if (deletes > 0) {
+                log.info("ItsRotaServerService.checkSendIncident: delCheckIncident {} EA. {}", deletes, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
+            }
 
             long baseTime = System.currentTimeMillis();
             List<String> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
@@ -122,44 +134,48 @@ public class ItsRotaServerService {
 
                 elapsed1.reset();
                 int inserts = this.incidentMapper.insSndIncident(incident);
-                log.info("ItsRotaServerService.checkSendIncident: insSndIncident {}, {} EA. {}", center.getCenterId(), inserts, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
+                if (inserts > 0) {
+                    log.info("ItsRotaServerService.checkSendIncident: insSndIncident {}, {} EA. {}", center.getCenterId(), inserts, Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
+                }
                 // 지역센터에 전송할 돌발정보를 메모리에 저장하고 지역센터에 전송하여야 한다.
                 List<TbSndIncident> result = this.incidentMapper.selSndIncident(incident);
-                if ("L99".equals(center.getCenterId())) {
-                    TbSndIncident data = TbSndIncident.builder()
-                            .linkId("1111111111")
-                            .nodeId("1111111111")
-                            .contactOrganizationNameText("1111111111")
-                            .descriptionTypeIncidentCode(1)
-                            .descriptionTypeIncidentOther("1111111111")
-                            .incidentVehiclesInvolvedCode(1)
-                            .incidentVehiclesInvolvedOther("1111111111")
-                            .incidentStatusCode(1)
-                            .incidentStatusOther(" 127.787941624999 37.7560849154680")
-                            .updateTypeCode(1)
-                            .updateTypeOther("202408081639002024080812170020240808124700")
-                            .build();
-                    result.add(data);
-                    TbSndIncident data1 = TbSndIncident.builder()
-                            .linkId("2222222222")
-                            .nodeId("2222222222")
-                            .contactOrganizationNameText("2222222222")
-                            .descriptionTypeIncidentCode(2)
-                            .descriptionTypeIncidentOther("2222222222")
-                            .incidentVehiclesInvolvedCode(2)
-                            .incidentVehiclesInvolvedOther("2222222222")
-                            .incidentStatusCode(2)
-                            .incidentStatusOther(" 127.787941624999 37.7560849154680")
-                            .updateTypeCode(2)
-                            .updateTypeOther("202408081639002024080812170020240808124700")
-                            .build();
-                    result.add(data1);
-                }
+
+//                if ("L99".equals(center.getCenterId())) {
+//                    TbSndIncident data = TbSndIncident.builder()
+//                            .linkId("1111111111")
+//                            .nodeId("1111111111")
+//                            .contactOrganizationNameText("1111111111")
+//                            .descriptionTypeIncidentCode(1)
+//                            .descriptionTypeIncidentOther("1111111111")
+//                            .incidentVehiclesInvolvedCode(1)
+//                            .incidentVehiclesInvolvedOther("1111111111")
+//                            .incidentStatusCode(1)
+//                            .incidentStatusOther(" 127.787941624999 37.7560849154680")
+//                            .updateTypeCode(1)
+//                            .updateTypeOther("202408081639002024080812170020240808124700")
+//                            .build();
+//                    result.add(data);
+//                    TbSndIncident data1 = TbSndIncident.builder()
+//                            .linkId("2222222222")
+//                            .nodeId("2222222222")
+//                            .contactOrganizationNameText("2222222222")
+//                            .descriptionTypeIncidentCode(2)
+//                            .descriptionTypeIncidentOther("2222222222")
+//                            .incidentVehiclesInvolvedCode(2)
+//                            .incidentVehiclesInvolvedOther("2222222222")
+//                            .incidentStatusCode(2)
+//                            .incidentStatusOther(" 127.787941624999 37.7560849154680")
+//                            .updateTypeCode(2)
+//                            .updateTypeOther("202408081639002024080812170020240808124700")
+//                            .build();
+//                    result.add(data1);
+//                }
+
                 center.getIncident().init(baseTime, result);
                 if (!result.isEmpty()) {
+                    log.info("ItsRotaServerService.checkSendIncident: selSndIncident {}, {} EA. {}", center.getCenterId(), result.size(), Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
                     center.executeSendIncident();
                 }
-                log.info("ItsRotaServerService.checkSendIncident: selSndIncident {}, {} EA. {}", center.getCenterId(), result.size(), Elapsed.elapsedTimeStr(elapsed1.nanoSeconds()));
             }
         }
         catch (Exception e) {

+ 1 - 3
src/main/java/com/its/rota/server/xnet/server/ItsAsnCommServerInitializer.java

@@ -10,8 +10,6 @@ import com.its.rota.server.xnet.server.handler.ItsAsnServerPacketInboundHandler;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelPipeline;
-import io.netty.handler.logging.LogLevel;
-import io.netty.handler.logging.LoggingHandler;
 import io.netty.handler.timeout.IdleStateHandler;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -54,7 +52,7 @@ public class ItsAsnCommServerInitializer extends ChannelInitializer<Channel> {
 
         IdleStateHandler idleStateHandler = new IdleStateHandler(center.getResTime(), 0,0, TimeUnit.SECONDS);
         ChannelPipeline pipeline = channel.pipeline();
-        pipeline.addLast(new LoggingHandler(LogLevel.INFO));
+//        pipeline.addLast(new LoggingHandler(LogLevel.INFO));
         pipeline.addLast("itsAsnIdleStateHandler", idleStateHandler);
         pipeline.addLast("itsAsnServerDecoder", this.itsAsnServerDecoder);  // Decoding handler
         pipeline.addLast("itsAsnServerPacketInboundHandler", this.itsAsnServerPacketInboundHandler); // packet distribute handler add

+ 2 - 1
src/main/java/com/its/rota/server/xnet/server/codec/ItsAsnServerDecoder.java

@@ -98,7 +98,7 @@ public class ItsAsnServerDecoder extends MessageToMessageDecoder<ByteBuf> {
 
                 C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
                 c2c.decode(new ByteArrayInputStream(berOctetString.value, 0, berOctetString.value.length));
-                log.info("RECV: [{}, {}]. C2C: {}", center.getLogKey(), center.getIpAddress(), c2c);
+//                log.info("RECV: [{}, {}]. C2C: {}", center.getLogKey(), center.getIpAddress(), c2c);
                 center.getNetState().setLastRecvTime();
 
                 RecvPacketDto packet = RecvPacketDto.builder()
@@ -107,6 +107,7 @@ public class ItsAsnServerDecoder extends MessageToMessageDecoder<ByteBuf> {
                         .c2c(c2c)
                         .build();
 
+                center.getNetState().setLastRecvTime();
                 list.add(packet);
 
                 readableBytes = byteBuf.readableBytes();

+ 1 - 0
src/main/java/com/its/rota/server/xnet/server/codec/ItsAsnServerEncoder.java

@@ -59,6 +59,7 @@ public class ItsAsnServerEncoder extends MessageToByteEncoder<Object> {
                 dataPkt.encode(pktBuff);
                 byteBuf.writeBytes(pktBuff.getArray());
                 center.getNetState().setLastSendTime();
+                log.info("SEND: [{}, {}], {} Bytes.", center.getLogKey(), center.getIpAddress(), pktBuff.getArray().length);
                 if (center.isCommLogging()) {
                     byte[] debugBytes = new byte[byteBuf.readableBytes()];
                     byteBuf.getBytes(byteBuf.readerIndex(), debugBytes);

+ 0 - 185
src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerIdleStateConnectionHandler.java

@@ -1,185 +0,0 @@
-package com.its.rota.server.xnet.server.handler;
-
-import com.its.app.common.utils.NettyUtils;
-import com.its.rota.server.dto.CenterDto;
-import com.its.rota.server.repository.ApplicationRepository;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelDuplexHandler;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.timeout.IdleState;
-import io.netty.handler.timeout.IdleStateEvent;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * 소켓 채널이 연결된 후 최소 데이터 송수신 까지의 타임아웃을 체크한다.
- */
-@Slf4j
-@RequiredArgsConstructor
-public class ItsAsnServerIdleStateConnectionHandler extends ChannelDuplexHandler {
-
-    private final ApplicationRepository repo;
-    @Override
-    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-        if (evt instanceof IdleStateEvent) {
-            IdleStateEvent e = (IdleStateEvent) evt;
-
-            if (e.state() == IdleState.READER_IDLE) {
-                // 최초 통신 연결후 어떠한 데이터의 수신이 없는 경우 해당 채널 Close.
-                String ipAddress  = NettyUtils.getRemoteIpAddress(ctx.channel());
-                CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-                if (obj != null) {
-                    MDC.put("id", obj.getLogKey());
-                }
-                log.error("ItsAsnServerIdleStateConnectionHandler.userEventTriggered, ----READER_IDLE: {},  will be closed.", ipAddress);
-                ctx.channel().disconnect();
-                ctx.channel().close();
-                if (obj != null) {
-                    MDC.remove(obj.getLogKey());
-                    MDC.clear();
-                }
-            }
-            else if (e.state() == IdleState.WRITER_IDLE) {
-            }
-        }
-    }
-
-    @Override
-    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
-        // 클라이언트 접속시 이벤트 발생(1)
-        // 활성화된 채널의 디비 등록여부에 따라 열결을 활성화 하거나 종료시킨다.
-        super.handlerAdded(ctx);    // channelActive 이벤트 발생시킴
-    }
-
-    @Override
-    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
-        // channelInactive 이벤트 다음에 발생(2)
-        // 이곳 핸들러에서 종료되는 경우는 채널연결이 인증되지 않는 경우이므로 그냥 종료시키면 된다.
-        super.handlerRemoved(ctx);
-    }
-
-    @Override
-    public void channelActive(ChannelHandlerContext ctx) throws Exception {
-        // handlerAdded 다음 이벤트 발생(2)
-        // 클라이언트 접속 요청 처리, 활성화된 채널의 디비 등록여부에 따라 열결을 활성화 하거나 종료시킨다.
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (obj == null) {
-            log.error("ItsAsnServerIdleStateConnectionHandler.----channelActive: {}, Unknown ip address. will be closed.", ipAddress);
-            ItsAsnServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
-        }
-        else {
-            MDC.put("id", obj.getLogKey());
-//            log.info("ItsAsnServerIdleStateConnectionHandler.----channelActive: {}, ID: {}, {}, {}", ipAddress, obj.getID(), obj.getRSE_ID(), ctx.channel().toString());
-
-//            if (obj.getChannel() != null) {
-//                try {
-//                    //log.error("ItsAsnServerIdleStateConnectionHandler.----channelActive: Old Connection Active: {}, ID: {}, {}, {}", ipAddress, obj.getID(), obj.getRSE_ID(), obj.getChannel().toString());
-//                    obj.getChannel().disconnect();
-//                    obj.getChannel().close();
-//                }
-//                catch(Exception e) {
-//                }
-//            }
-
-            /**
-             * 1. 데이터 송수신 타임아웃 핸들러 등록
-             * 2. 현재 핸들러를 삭제한다.
-             */
-            int allIdleTimeSec = 120;   // 2분
-            ItsAsnServerIdleStatePacketHandler itsAsnServerIdleStatePacketHandler = new ItsAsnServerIdleStatePacketHandler(
-                    0,
-                    0,
-                    allIdleTimeSec,
-                    TimeUnit.SECONDS
-            );
-            ctx.channel().pipeline().addAfter("dsrcAsn1ServerConnectionIdleStateHandler","dsrcAsn1ServerIdleStateHandler", itsAsnServerIdleStatePacketHandler);    // 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.setConnectTm(SysUtils.getSysTimeStr());
-//            obj.setChannel(ctx.channel());
-//            obj.setHeaderOptions(DsrcAsn1Utils.getDefaultOptions());
-//            obj.setLastRecvTime();
-
-            MDC.remove(obj.getLogKey());
-            MDC.clear();
-        }
-    }
-
-    @Override
-    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
-        // 클라이언트 연결 종료시 이벤트 발생(1)
-        // 이곳 핸들러에서 종료되는 경우는 채널연결이 인증되지 않는 경우이므로 그냥 종료시키면 된다.
-        // 채널이 이미 연결 종료된 상태에서의 이벤트 수신
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (obj != null) {
-            MDC.put("id", obj.getLogKey());
-        }
-        log.error("ItsAsnServerIdleStateConnectionHandler.--channelInactive: {}, {}", ipAddress, ctx.channel().toString());
-
-        super.channelInactive(ctx); // handlerRemoved 이벤트 발생 시킴
-
-        try {
-            ctx.channel().close();
-        }
-        catch(Exception e) {
-        }
-
-        if (obj != null) {
-            MDC.remove(obj.getLogKey());
-            MDC.clear();
-        }
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-        // 이곳 핸들러에서 종료되는 경우는 채널연결이 인증되지 않는 경우이므로 그냥 종료시키면 된다.
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (obj != null) {
-            MDC.put("id", obj.getLogKey());
-        }
-        log.error("ItsAsnServerIdleStateConnectionHandler.--exceptionCaught: {}, {}, Exception: {}", ipAddress, ctx.channel().toString(), cause);
-        ItsAsnServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
-        //super.exceptionCaught(ctx, cause);
-        if (obj != null) {
-            MDC.remove(obj.getLogKey());
-            MDC.clear();
-        }
-    }
-
-    public static void disconnectChannel(Channel channel) {
-        // 로그인 하지 않은 또는 비정상 접속 네트워크 세션 종료(로그인 처리를 수행하지 않은 세션에 대한 종료)
-        String ipAddress = NettyUtils.getRemoteIpAddress(channel);
-        CenterDto obj = null;//this.repo.getIpAddressMap().get(ipAddress);
-        if (obj != null) {
-            MDC.put("id", obj.getLogKey());
-        }
-        try {
-            log.error("ItsAsnServerIdleStateConnectionHandler.disconnectChannel: {}, {}", ipAddress, channel.toString());
-            if (!channel.isActive()) {
-                log.error("ItsAsnServerIdleStateConnectionHandler.disconnectChannel: {}, channel already closed.", ipAddress);
-            }
-
-            channel.flush();
-            ChannelFuture f = channel.disconnect().awaitUninterruptibly();  // channelInactive event fire
-            if (!f.isDone() || !f.isSuccess()) {
-                log.error("ItsAsnServerIdleStateConnectionHandler.disconnectChannel: {}, isDone: {}, isSuccess: {}", ipAddress, f.isDone(), f.isSuccess());
-            }
-        }
-        catch(Exception e) {
-        }
-
-        if (obj != null) {
-            MDC.remove(obj.getLogKey());
-            MDC.clear();
-        }
-    }
-}

+ 0 - 156
src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerIdleStatePacketHandler.java

@@ -1,156 +0,0 @@
-package com.its.rota.server.xnet.server.handler;
-
-import com.its.app.common.utils.NettyUtils;
-import com.its.rota.server.common.SpringUtils;
-import com.its.rota.server.dto.CenterDto;
-import com.its.rota.server.process.dbms.DbmsDataProcess;
-import com.its.rota.server.repository.ApplicationRepository;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.timeout.IdleState;
-import io.netty.handler.timeout.IdleStateEvent;
-import io.netty.handler.timeout.IdleStateHandler;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-
-import java.util.concurrent.TimeUnit;
-
-@Slf4j
-public class ItsAsnServerIdleStatePacketHandler extends IdleStateHandler {
-
-    private final ApplicationRepository repo;
-    private final DbmsDataProcess dbmsDataProcess;
-
-    public ItsAsnServerIdleStatePacketHandler(long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit) {
-        super(readerIdleTime, writerIdleTime, allIdleTime, unit);
-        this.dbmsDataProcess = SpringUtils.getBean(DbmsDataProcess.class);
-        this.repo = SpringUtils.getBean(ApplicationRepository.class);
-    }
-
-    @Override
-    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (obj == null) {
-            log.error("ItsAsnServerIdleStatePacketHandler.-------channelIdle: ALL_IDLE, {}, Unknown ip address, will be closed.", ipAddress);
-            ItsAsnServerIdleStatePacketHandler.disconnectChannel(null, ctx.channel());
-            return;
-        }
-
-        MDC.put("id", obj.getLogKey());
-
-        if (evt.state() == IdleState.ALL_IDLE) {
-//            log.error("ItsAsnServerIdleStatePacketHandler.-------channelIdle: ALL_IDLE, {}, ID: {}, {}, {}", ipAddress, obj.getID(), obj.getRSE_ID(), ctx.channel().toString());
-            // 클라이언트로 종료 메시지를 전송한다.(AI_Terminate)
-//           ControlDeviceService.getInstance().sendTerminate(obj, ctx.channel(), eTerminate.Terminate_ClientCommProblesm.getValue());
-            ItsAsnServerIdleStatePacketHandler.disconnectChannel(obj, ctx.channel());
-        }
-        else if (evt.state() == IdleState.READER_IDLE) {
-//            log.warn("ItsAsnServerIdleStatePacketHandler.-------channelIdle: READER_IDLE, {}, ID: {}, {}", ipAddress, obj.getID(), obj.getRSE_ID());
-        }
-        else if (evt.state() == IdleState.WRITER_IDLE) {
-//            log.warn("ItsAsnServerIdleStatePacketHandler.-------channelIdle: WRITER_IDLE, {}, ID: {}, {}", ipAddress, obj.getID(), obj.getRSE_ID());
-        }
-        MDC.remove(obj.getLogKey());
-        MDC.clear();
-    }
-
-    @Override
-    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (obj != null) {
-            MDC.put("id", obj.getLogKey());
-        }
-        log.error("ItsAsnServerIdleStatePacketHandler.---channelInactive: {}, {}", ipAddress, ctx.channel().toString());
-
-        Channel oldChannel = null;
-        if (obj != null) {
-
-//            oldChannel = obj.getChannel();
-
-//            if (!obj.isDupCon()) {
-//                // Duplication connection 인 경우 다른 채널이 통신을 대신하므로
-//                // 네트워크 상태를 변경시키지 않기 위함.
-//                obj.channelLogout();
-//
-//                String logId = obj.getLOG_ID();
-//                if (logId == null || logId.equals("")) {
-//                    logId = "Unknown";
-//                }
-//                TbRseCtlrCnncHs voLog = new TbRseCtlrCnncHs();
-//                voLog.setRSE_CTLR_NMBR(obj.getID());
-//                voLog.setLOG_ID(logId);
-//                voLog.setLOG_ADDRESS(NettyUtils.getRemoteIpAddress(ctx.channel()));
-//                voLog.setLOG_TYPE(Integer.toString(TbRseCtlrCnncHs.LOG_TYPE_LOGOUT));
-//                voLog.setCLCT_DT(SysUtils.getSysTime());
-//
-//                log.debug("ItsAsnServerIdleStatePacketHandler.---channelInactive: {}. {}", ipAddress, voLog.toString());
-//                this.dbmsDataProcess.add(new DbmsData(DbmsDataType.DBMS_DATA_LOG_HS, false, voLog));
-//            }
-//            obj.setDupCon(false);
-        }
-        super.channelInactive(ctx);
-        try {
-            ctx.channel().close();
-//            if (oldChannel != null) {
-//                log.error("ItsAsnServerIdleStatePacketHandler.---channelInactive: {}, old: {}, curr: {}", ipAddress, obj.getChannel().toString(), ctx.channel().toString());
-//                if (ctx.channel() != oldChannel && oldChannel.isActive()) {
-//                    log.error("ItsAsnServerIdleStatePacketHandler.---channelInactive: {}, close, old: {}, curr: {}", ipAddress, obj.getChannel().toString(), ctx.channel().toString());
-//                    oldChannel.close();
-//                }
-//            }
-        }
-        catch (Exception e) {
-        }
-
-        if (obj != null) {
-            MDC.remove(obj.getLogKey());
-            MDC.clear();
-        }
-    }
-
-    public static void disconnectChannel(CenterDto obj, Channel channel) {
-        // 로그인 한 세션에 대한 종료처리를 수행
-        String ipAddress = NettyUtils.getRemoteIpAddress(channel);
-        if (obj != null) {
-            MDC.put("id", obj.getLogKey());
-        }
-
-        try {
-            log.error("ItsAsnServerIdleStatePacketHandler.-disconnectChannel: {}, {}", ipAddress, channel.toString());
-            if (!channel.isActive()) {
-                log.error("ItsAsnServerIdleStatePacketHandler.-disconnectChannel: {}, channel already closed.", ipAddress);
-            }
-
-            channel.flush();
-            ChannelFuture f = channel.disconnect().awaitUninterruptibly();  // channelInactive event fire
-            if (!f.isDone() || !f.isSuccess()) {
-                log.error("ItsAsnServerIdleStatePacketHandler.-disconnectChannel: {}, isDone: {}, isSuccess: {}", ipAddress, f.isDone(), f.isSuccess());
-            }
-        }
-        catch(Exception e) {
-        }
-
-        if (obj != null) {
-            MDC.remove(obj.getLogKey());
-        }
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (obj != null) {
-            MDC.put("id", obj.getLogKey());
-        }
-        log.error("ItsAsnServerIdleStatePacketHandler.---exceptionCaught: {}, {}, Exception: {}", ipAddress, ctx.channel().toString(), cause);
-        ItsAsnServerIdleStatePacketHandler.disconnectChannel(obj, ctx.channel());
-        super.exceptionCaught(ctx, cause);
-        if (obj != null) {
-            MDC.remove(obj.getLogKey());
-        }
-    }
-
-}

+ 0 - 147
src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerLoginInboundHandler.java

@@ -1,147 +0,0 @@
-package com.its.rota.server.xnet.server.handler;
-
-import com.beanit.its.C2CAuthenticatedMessage;
-import com.its.app.common.utils.NettyUtils;
-import com.its.rota.server.dto.CenterDto;
-import com.its.rota.server.repository.ApplicationRepository;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-
-import java.util.concurrent.TimeUnit;
-
-@Slf4j
-@RequiredArgsConstructor
-//@Component
-//@ChannelHandler.Sharable
-public class ItsAsnServerLoginInboundHandler extends ChannelInboundHandlerAdapter {
-
-    private final ApplicationRepository repo;
-    private final ItsAsnServerPacketInboundHandler itsAsnServerPacketInboundHandler;
-
-    @Override
-    public void channelActive(ChannelHandlerContext ctx) throws Exception {
-        super.channelActive(ctx);
-    }
-
-    @Override
-    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
-        super.channelInactive(ctx);
-    }
-
-    /*
-     * 통신 연결 후 최초 로그인 패킷 처리를 위한 핸들러
-     */
-    public void channelRead(ChannelHandlerContext ctx, Object msg) {
-
-        //String tcpAddress = NettyUtils.getTcpAddress(ctx.channel());    // local/remote address 를 폼함한 문자열
-        String ipAddress = NettyUtils.getRemoteIpAddress(ctx.channel());
-        CenterDto obj = this.repo.getIpAddressMap().get(ipAddress);
-        if (null == obj) {
-            log.error("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}. Unknown controller. will be closed.", ipAddress);
-            ItsAsnServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
-            return;
-        }
-
-        MDC.put("id", obj.getLogKey());
-
-        log.info("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}", ipAddress);
-
-        if (!(msg instanceof C2CAuthenticatedMessage)) {
-            log.error("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}. Unknown message. will be closed.", ipAddress);
-            ItsAsnServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
-            return;
-        }
-
-        int allIdleTimeSec = 300;
-        C2CAuthenticatedMessage c2c = (C2CAuthenticatedMessage)msg;
-//        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);
-//                ItsAsnServerIdleStateConnectionHandler.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);
-//                ItsAsnServerIdleStateConnectionHandler.disconnectChannel(ctx.channel());
-//                return;
-//            }
-//            return;
-//        } else {
-//            log.warn("DsrcAsn1ServerLoginInboundHandler: {}", cmd);
-//        }
-
-        // 로그인이 성공하면
-        // 통신 IDLE 시 네트워크 체크 확인 패킷전송을 위한 핸들러를 추가한다.
-        // 패킷 처리 용 핸들러를 추가한다.
-        // 로그인 이전 네트워크 IDLE 체크 핸들러 삭제
-        // 로그인 처리 핸들러 삭제
-        // 로그인 패킷 처리 핸들러 삭제
-        //int allIdleTimeSec = obj.getLogin().getDatexLoginHeartbeatDurationMaxQty().value.intValue()+5;
-        log.info("DsrcAsn1ServerLoginInboundHandler.-----------channelRead: {}, allIdleTimeSec: {} sec.", ipAddress, allIdleTimeSec);
-        ItsAsnServerIdleStatePacketHandler itsAsnServerIdleStatePacketHandler = new ItsAsnServerIdleStatePacketHandler(
-                0,
-                0,
-                allIdleTimeSec,
-                TimeUnit.SECONDS
-        );
-        ctx.channel().pipeline().addAfter("dsrcAsn1ServerConnectionIdleStateHandler","dsrcAsn1ServerIdleStateHandler", itsAsnServerIdleStatePacketHandler);    // packet idle handler add
-        ctx.channel().pipeline().addAfter("dsrcAsn1ServerLoginInboundHandler","dsrcAsn1ServerPacketInboundHandler", this.itsAsnServerPacketInboundHandler); // 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
-
-        MDC.remove(obj.getLogKey());
-        MDC.clear();
-    }
-
-    @Override
-    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-        log.warn("DsrcAsn1ServerLoginInboundHandler.----userEventTriggered");
-        super.userEventTriggered(ctx, evt);
-    }
-
-    @Override
-    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
-        log.warn("DsrcAsn1ServerLoginInboundHandler.---channelReadComplete");
-        super.channelReadComplete(ctx);
-    }
-
-    @Override
-    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
-        log.warn("DsrcAsn1ServerLoginInboundHandler.-----channelRegistered");
-        super.channelRegistered(ctx);
-    }
-
-    @Override
-    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
-        log.warn("DsrcAsn1ServerLoginInboundHandler.---channelUnregistered");
-        super.channelUnregistered(ctx);
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-        log.error("DsrcAsn1ServerLoginInboundHandler.-------exceptionCaught: {}", cause.toString());
-        ItsAsnServerIdleStatePacketHandler.disconnectChannel(null, ctx.channel());
-        super.exceptionCaught(ctx, cause);
-    }
-
-    @Override
-    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
-        //log.warn("DsrcAsn1ServerLoginInboundHandler.----------handlerAdded");
-        super.handlerAdded(ctx);
-    }
-
-    @Override
-    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
-        //log.warn("DsrcAsn1ServerLoginInboundHandler.--------handlerRemoved");
-        super.handlerRemoved(ctx);
-    }
-}

+ 2 - 2
src/main/java/com/its/rota/server/xnet/server/handler/ItsAsnServerPacketInboundHandler.java

@@ -5,7 +5,7 @@ import com.its.app.common.utils.NettyUtils;
 import com.its.rota.server.dto.CenterDto;
 import com.its.rota.server.dto.NET;
 import com.its.rota.server.dto.RecvPacketDto;
-import com.its.rota.server.process.work.DataPacketProcess;
+import com.its.rota.server.xnet.server.process.work.DataPacketProcess;
 import com.its.rota.server.repository.ApplicationRepository;
 import com.its.rota.server.xnet.server.process.request.AiInitialize;
 import io.netty.channel.ChannelHandler;
@@ -59,7 +59,7 @@ public class ItsAsnServerPacketInboundHandler extends SimpleChannelInboundHandle
 
         if (e instanceof IdleStateEvent) {
             IdleStateEvent evt = (IdleStateEvent) e;
-            log.info("{}.++userEventTriggered: {}. {}", this.getClass().getSimpleName(), NettyUtils.getAddress(ctx.channel()), evt.state());
+//            log.info("{}.++userEventTriggered: {}. {}", this.getClass().getSimpleName(), NettyUtils.getAddress(ctx.channel()), evt.state());
 
             // 연결이 완료된 후 송수신 데이터가 일정시간 동안 없을 경우 이곳에서 처리
             if (evt.state() == IdleState.READER_IDLE) {

+ 80 - 0
src/main/java/com/its/rota/server/xnet/server/process/request/AiPublicationIncidentCondition.java

@@ -0,0 +1,80 @@
+package com.its.rota.server.xnet.server.process.request;
+
+import com.beanit.asn1bean.ber.ReverseByteArrayOutputStream;
+import com.beanit.asn1bean.ber.types.*;
+import com.beanit.enums.eAuthInfo;
+import com.beanit.its.*;
+import com.beanit.utils.ItsAsn;
+import com.its.rota.server.dto.CenterDto;
+import com.its.rota.server.repository.ApplicationRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+
+@Slf4j
+public class AiPublicationIncidentCondition {
+
+    public static boolean run(CenterDto center) {
+        boolean result;
+        try {
+            MDC.put("id", center.getLogKey());
+            log.info("AiPublicationIncidentCondition.run: [{}, {}].", center.getLogKey(), center.getIpAddress());
+
+            IncidentConditionsList lists = center.getIncidentConditionsList();
+            if (lists.getIncidentConditions().isEmpty()) {
+                return true;
+            }
+
+            EndApplicationMessage endMsg =  new EndApplicationMessage();
+            int[] messageId = {1, 0, 14827, 1, 1, 4};
+            ReverseByteArrayOutputStream msgBuff = new ReverseByteArrayOutputStream(ItsAsn.ITS_ASN_PACKET_MAX_SIZE);
+            lists.encode(msgBuff);
+            endMsg.setEndApplicationMessageId(new BerObjectIdentifier(messageId));
+            endMsg.setEndApplicationMessageMsg(new BerAny(msgBuff.getArray()));
+
+            byte[] auth = { eAuthInfo.AI_IncidentConditions.getValue() };
+            int packetNmbr = ItsAsn.ITS_ASN_DATEX_INCIDENT_SEQUENCE;
+
+            PublicationType publicationType = new PublicationType();
+            publicationType.setDatexPublishData(endMsg);
+
+            PublicationData publicationData = new PublicationData();
+            publicationData.setDatexPublishSubscribeSerialNbr(new BerInteger(packetNmbr));  // 요청 serial nmbr
+            publicationData.setDatexPublishSerialNbr(new BerInteger(packetNmbr));           // 생성 serial nmbr
+            publicationData.setDatexPublishLatePublicationFlag(new BerBoolean(true));
+            publicationData.setDatexPublishType(publicationType);
+
+            PublishFormat.DatexPublishData publishData = new PublishFormat.DatexPublishData();
+            publishData.getPublicationData().add(publicationData);
+
+            PublishFormat publishFormat = new PublishFormat();
+            publishFormat.setDatexPublishData(publishData);
+
+            Publication publication = new Publication();
+            publication.setDatexPublishFormat(publishFormat);
+            publication.setDatexPublishGuaranteedBool(new BerBoolean(true));
+
+            C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
+            PDUs pdus = new PDUs();
+            pdus.setPublication(publication);
+            c2c.setDatexDataPacketNumber(new BerInteger(packetNmbr));
+            c2c.setDatexDataPacketPriorityNumber(new BerInteger(1));
+            c2c.setDatexAuthenticationInfoText(new BerOctetString(auth));
+            c2c.setOptions(ApplicationRepository.getHeaderOptions(center));
+            c2c.setPdu(pdus);
+
+            result = center.sendData(c2c, "AI_Publication-IncidentConditions");
+        }
+        catch (Exception e) {
+            log.error("AiPublicationIncidentCondition.run: [{}, {}]. Packet send Exception. will be closed. {}", center.getLogKey(), center.getIpAddress(), e.getMessage());
+            result = false;
+        }
+        finally {
+            MDC.clear();
+        }
+
+        if (!result) {
+            ApplicationRepository.closeChannel(center, center.getNetState().getChannel());
+        }
+        return result;
+    }
+}

+ 80 - 0
src/main/java/com/its/rota/server/xnet/server/process/request/AiPublicationTraffic.java

@@ -0,0 +1,80 @@
+package com.its.rota.server.xnet.server.process.request;
+
+import com.beanit.asn1bean.ber.ReverseByteArrayOutputStream;
+import com.beanit.asn1bean.ber.types.*;
+import com.beanit.enums.eAuthInfo;
+import com.beanit.its.*;
+import com.beanit.utils.ItsAsn;
+import com.its.rota.server.dto.CenterDto;
+import com.its.rota.server.repository.ApplicationRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+
+@Slf4j
+public class AiPublicationTraffic {
+
+    public static boolean run(CenterDto center) {
+        boolean result;
+        try {
+            MDC.put("id", center.getLogKey());
+            log.info("AiPublicationTraffic.run: [{}, {}].", center.getLogKey(), center.getIpAddress());
+
+            CurrentLinkStateList lists = center.getCurrentLinkStateList();
+            if (lists.getCurrentLinkState().isEmpty()) {
+                return true;
+            }
+
+            EndApplicationMessage endMsg =  new EndApplicationMessage();
+            int[] messageId = {1, 0, 14827, 1, 1, 1};
+            ReverseByteArrayOutputStream msgBuff = new ReverseByteArrayOutputStream(ItsAsn.ITS_ASN_PACKET_MAX_SIZE);
+            lists.encode(msgBuff);
+            endMsg.setEndApplicationMessageId(new BerObjectIdentifier(messageId));
+            endMsg.setEndApplicationMessageMsg(new BerAny(msgBuff.getArray()));
+
+            byte[] auth = { eAuthInfo.AI_CurrentLinkState.getValue() };
+            int packetNmbr = ItsAsn.ITS_ASN_DATEX_TRAFFIC_SEQUENCE;
+
+            PublicationType publicationType = new PublicationType();
+            publicationType.setDatexPublishData(endMsg);
+
+            PublicationData publicationData = new PublicationData();
+            publicationData.setDatexPublishSubscribeSerialNbr(new BerInteger(packetNmbr));  // 요청 serial nmbr
+            publicationData.setDatexPublishSerialNbr(new BerInteger(packetNmbr));           // 생성 serial nmbr
+            publicationData.setDatexPublishLatePublicationFlag(new BerBoolean(true));
+            publicationData.setDatexPublishType(publicationType);
+
+            PublishFormat.DatexPublishData publishData = new PublishFormat.DatexPublishData();
+            publishData.getPublicationData().add(publicationData);
+
+            PublishFormat publishFormat = new PublishFormat();
+            publishFormat.setDatexPublishData(publishData);
+
+            Publication publication = new Publication();
+            publication.setDatexPublishFormat(publishFormat);
+            publication.setDatexPublishGuaranteedBool(new BerBoolean(true));
+
+            C2CAuthenticatedMessage c2c = new C2CAuthenticatedMessage();
+            PDUs pdus = new PDUs();
+            pdus.setPublication(publication);
+            c2c.setDatexDataPacketNumber(new BerInteger(packetNmbr));
+            c2c.setDatexDataPacketPriorityNumber(new BerInteger(1));
+            c2c.setDatexAuthenticationInfoText(new BerOctetString(auth));
+            c2c.setOptions(ApplicationRepository.getHeaderOptions(center));
+            c2c.setPdu(pdus);
+
+            result = center.sendData(c2c, "AI_Publication-CurrentLinkState");
+        }
+        catch (Exception e) {
+            log.error("AiPublicationTraffic.run: [{}, {}]. Packet send Exception. will be closed. {}", center.getLogKey(), center.getIpAddress(), e.getMessage());
+            result = false;
+        }
+        finally {
+            MDC.clear();
+        }
+
+        if (!result) {
+            ApplicationRepository.closeChannel(center, center.getNetState().getChannel());
+        }
+        return result;
+    }
+}

+ 20 - 0
src/main/java/com/its/rota/server/xnet/server/process/response/AcceptResponse.java

@@ -1,7 +1,12 @@
 package com.its.rota.server.xnet.server.process.response;
 
+import com.beanit.its.Accept;
 import com.beanit.its.C2CAuthenticatedMessage;
+import com.beanit.its.PDUs;
+import com.beanit.utils.ItsAsn;
 import com.its.rota.server.dto.CenterDto;
+import com.its.rota.server.xnet.server.process.request.AiPublicationIncidentCondition;
+import com.its.rota.server.xnet.server.process.request.AiPublicationTraffic;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 
@@ -21,6 +26,21 @@ public class AcceptResponse implements ItsAsnResponse {
         try {
             MDC.put("id", this.center.getLogKey());
             log.info("AcceptResponse.response: [{}, {}].", this.center.getLogKey(), this.center.getIpAddress());
+
+            PDUs pdus = this.c2c.getPdu();
+            Accept accept = pdus.getAccept();
+            if (accept == null) {
+                log.info("AcceptResponse.response: [{}, {}]. accept data null. will be closed.", this.center.getLogKey(), this.center.getIpAddress());
+                return false;
+            }
+            Long acceptPacketNmbr = accept.getDatexAcceptPacketNbr().value.longValue();
+            log.info("AcceptResponse.response: [{}, {}]. Accept packet number {}.", this.center.getLogKey(), this.center.getIpAddress(), acceptPacketNmbr);
+            if (acceptPacketNmbr == ItsAsn.ITS_ASN_DATEX_INCIDENT_SEQUENCE) {
+                AiPublicationIncidentCondition.run(this.center);
+            }
+            else if (acceptPacketNmbr == ItsAsn.ITS_ASN_DATEX_TRAFFIC_SEQUENCE) {
+                AiPublicationTraffic.run(this.center);
+            }
         }
         catch (Exception e) {
             log.error("AcceptResponse.response: [{}, {}]. Packet send Exception. will be closed. {}", this.center.getLogKey(), this.center.getIpAddress(), e.getMessage());

+ 0 - 103
src/main/java/com/its/rota/server/xnet/server/process/response/DsrcAsn1Accept.java

@@ -1,103 +0,0 @@
-package com.its.rota.server.xnet.server.process.response;
-
-import com.beanit.its.C2CAuthenticatedMessage;
-import com.beanit.its.PDUs;
-import com.its.app.common.utils.NettyUtils;
-import com.its.rota.server.dto.CenterDto;
-import io.netty.channel.Channel;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class DsrcAsn1Accept {
-
-    static C2CAuthenticatedMessage makeC2CAuthenticatedMessage(CenterDto obj, Channel channel, C2CAuthenticatedMessage c2c) {
-        if (obj == null || channel == null || c2c == null) {
-            log.info("{}. {} {}, {}", "makeC2CAuthenticatedMessage", obj, channel, c2c);
-            return null;
-        }
-
-        String ipAddress = NettyUtils.getRemoteIpAddress(channel);
-        C2CAuthenticatedMessage resC2c = null;
-        PDUs pdus = c2c.getPdu();
-//        ePdusPr pdu = DsrcAsn1Utils.getPduChoice(pdus);
-//
-//        byte[] accept = { (byte) eAuthInfo.AI_Accept.getValue() };
-//        PDUs resPdus = new PDUs();
-//        Accept acpt = new Accept();
-//        Accept.DatexAcceptType acptType = new Accept.DatexAcceptType();
-//
-//        log.debug("DsrcAsn1Accept.makeC2CAuthenticatedMessage: {}, {}", ipAddress, pdu.toString());
-//
-//        switch(pdu) {
-//        case PDUs_PR_login:
-//            resC2c = new C2CAuthenticatedMessage();
-//            Login login = pdus.getLogin();
-//            acptType.setLogIn(login.getDatexLoginEncodingRulesId().getBerObjectIdentifier().get(0));
-//            break;
-//        case PDUs_PR_subscripiton:
-//            resC2c = new C2CAuthenticatedMessage();
-//            Subscription subscription = c2c.getPdu().getSubscription();
-//            SubscriptionType subscriptionType = subscription.getDatexSubscribeType();
-//            BerEnum cancelReasonCd = subscriptionType.getDatexSubscribeCancelReasonCd();
-//            if (subscriptionType != null) {
-//                // Subscription
-//                SubscriptionData subscriptionData = subscriptionType.getSubscription();
-//                SubscriptionMode subscriptionMode = subscriptionData.getDatexSubscribeMode();
-//                BerNull single = subscriptionMode.getSingle();
-//                Registered eventDriven = subscriptionMode.getEventDriven();
-//                Registered periodic = subscriptionMode.getPeriodic();
-//
-//                if (single != null) {
-//                    acptType.setSingleSubscription(new BerNull());
-//                }
-//                else if (eventDriven != null) {
-//                    Registered.Continuous cont = eventDriven.getContinuous();
-//                    if (cont != null) {
-//                        acptType.setRegisteredSubscription(cont.getDatexRegisteredUpdateDelayQty());
-//                    }
-//                    else {
-//                        acptType.setRegisteredSubscription(subscription.getDatexSubscribeSerialNbr());
-//                    }
-//                }
-//                else if (periodic != null) {
-//                    Registered.Continuous cont = periodic.getContinuous();
-//                    if (cont != null) {
-//                        acptType.setRegisteredSubscription(cont.getDatexRegisteredUpdateDelayQty());
-//                    }
-//                    else {
-//                        acptType.setRegisteredSubscription(subscription.getDatexSubscribeSerialNbr());
-//                    }
-//                }
-//                else {
-//                    return null;
-//                }
-//            }
-//            else if (cancelReasonCd != null) {
-//                // Cancel
-//                acptType.setRegisteredSubscription(subscription.getDatexSubscribeSerialNbr());
-//            }
-//            break;
-//        case PDUs_PR_publication:
-//            resC2c = new C2CAuthenticatedMessage();
-//            BerNull berNull = new BerNull();
-//            acptType.setPublication(berNull);
-//            break;
-//        default:
-//            break;
-//        }
-//
-//        if (resC2c != null) {
-//            acpt.setDatexAcceptPacketNbr(c2c.getDatexDataPacketNumber());
-//            acpt.setDatexAcceptType(acptType);
-//            resPdus.setAccept(acpt);
-//
-//            resC2c.setDatexAuthenticationInfoText(new BerOctetString(accept));
-//            resC2c.setDatexDataPacketNumber(new BerInteger(obj.getSeq().nextValue()));
-//            resC2c.setDatexDataPacketPriorityNumber(new BerInteger(0));
-//            //resC2c.setOptions(DsrcAsn1Utils.swapHeaderOptions(c2c.getOptions()));
-//            resC2c.setOptions(DsrcAsn1Utils.swapHeaderOptions(obj.getHeaderOptions()));
-//            resC2c.setPdu(resPdus);
-//        }
-        return resC2c;
-    }
-}

+ 0 - 60
src/main/java/com/its/rota/server/xnet/server/process/response/DsrcAsn1Reject.java

@@ -1,60 +0,0 @@
-package com.its.rota.server.xnet.server.process.response;
-
-import com.beanit.its.C2CAuthenticatedMessage;
-import com.its.app.common.utils.NettyUtils;
-import com.its.rota.server.dto.CenterDto;
-import io.netty.channel.Channel;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class DsrcAsn1Reject {
-
-    static C2CAuthenticatedMessage makeC2CAuthenticatedMessage(CenterDto obj, Channel channel, C2CAuthenticatedMessage c2c, int rejectType) {
-        if (obj == null || channel == null || c2c == null) {
-            log.info("{}. {} {}, {}", "makeC2CAuthenticatedMessage", obj, channel, c2c);
-            return null;
-        }
-
-        String ipAddress = NettyUtils.getRemoteIpAddress(channel);
-        log.info("DsrcAsn1Reject.makeC2CAuthenticatedMessage: {}", ipAddress);
-
-        C2CAuthenticatedMessage resC2c = null;
-//        ePdusPr pdu = DsrcAsn1Utils.getPduChoice(c2c.getPdu());
-//
-//        byte[] reject = { (byte) eAuthInfo.AI_Reject.getValue() };
-//        PDUs resPdus = new PDUs();
-//        Reject rjt = new Reject();
-//        RejectType rjtType = new RejectType();
-//
-//        switch(pdu) {
-//            case PDUs_PR_login:
-//                resC2c = new C2CAuthenticatedMessage();
-//                rjtType.setDatexRejectLoginCd(new BerEnum(rejectType));
-//               break;
-//            case PDUs_PR_subscripiton:
-//                resC2c = new C2CAuthenticatedMessage();
-//                rjtType.setDatexRejectSubscriptionCd(new BerEnum(rejectType));
-//                break;
-//            case PDUs_PR_publication:
-//                resC2c = new C2CAuthenticatedMessage();
-//                rjtType.setDatexRejectPublicationCd(new BerEnum(rejectType));
-//                break;
-//            default:
-//                break;
-//        }
-//
-//        if (resC2c != null) {
-//            rjt.setDatexRejectPacketNbr(c2c.getDatexDataPacketNumber());
-//            rjt.setDatexRejectType(rjtType);
-//            resPdus.setReject(rjt);
-//
-//            resC2c.setDatexAuthenticationInfoText(new BerOctetString(reject));
-//            resC2c.setDatexDataPacketNumber(new BerInteger(obj.getSeq().nextValue()));
-//            resC2c.setDatexDataPacketPriorityNumber(new BerInteger(1));
-//            //resC2c.setOptions(DsrcAsn1Utils.swapHeaderOptions(c2c.getOptions()));
-//            resC2c.setOptions(DsrcAsn1Utils.swapHeaderOptions(obj.getHeaderOptions()));
-//            resC2c.setPdu(resPdus);
-//        }
-        return resC2c;
-    }
-}

+ 8 - 10
src/main/java/com/its/rota/server/xnet/server/process/response/PublicationResponse.java

@@ -2,9 +2,7 @@ package com.its.rota.server.xnet.server.process.response;
 
 import com.beanit.its.*;
 import com.its.app.common.utils.NettyUtils;
-import com.its.rota.server.config.ApplicationConfig;
 import com.its.rota.server.dto.CenterDto;
-import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
 
@@ -56,14 +54,14 @@ public class PublicationResponse implements ItsAsnResponse {
 
         if (guaranteed) {
             //log.info("PublicationResponse.response: {}. guaranteed: true", ipAddress);
-            C2CAuthenticatedMessage resC2c = DsrcAsn1Accept.makeC2CAuthenticatedMessage(this.obj, this.ctx.channel(), this.c2c);
-            if (resC2c != null) {
-                ChannelFuture f = this.ctx.channel().writeAndFlush(resC2c);
-                f.awaitUninterruptibly();
-                if (!f.isDone() || !f.isSuccess()) {
-                    log.info("PublicationResponse.response: {}. guaranteed: response send failed.", ipAddress);
-                }
-            }
+//            C2CAuthenticatedMessage resC2c = DsrcAsn1Accept.makeC2CAuthenticatedMessage(this.obj, this.ctx.channel(), this.c2c);
+//            if (resC2c != null) {
+//                ChannelFuture f = this.ctx.channel().writeAndFlush(resC2c);
+//                f.awaitUninterruptibly();
+//                if (!f.isDone() || !f.isSuccess()) {
+//                    log.info("PublicationResponse.response: {}. guaranteed: response send failed.", ipAddress);
+//                }
+//            }
         }
         return true;
     }

+ 1 - 3
src/main/java/com/its/rota/server/xnet/server/process/response/RejectResponse.java

@@ -6,10 +6,8 @@ import com.beanit.its.Reject;
 import com.beanit.its.RejectType;
 import com.its.app.common.utils.NettyUtils;
 import com.its.rota.server.common.SpringUtils;
-import com.its.rota.server.config.ApplicationConfig;
 import com.its.rota.server.dto.CenterDto;
 import com.its.rota.server.process.dbms.DbmsDataProcess;
-import com.its.rota.server.xnet.server.handler.ItsAsnServerIdleStatePacketHandler;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
 
@@ -49,7 +47,7 @@ public class RejectResponse implements ItsAsnResponse {
             rejectCode = rejectType.getDatexRejectLoginCd().value.intValue();
             log.error("RejectResponse.response: {}. RejectLoginCd: dataPacketNmbr: {}, rejectPacketNmbr: {}, rejectCode: {}", ipAddress, dataPacketNmbr, rejectPacketNmbr, rejectCode);
             // TODO: 클라이언트와의 연결을 종료한다.
-            ItsAsnServerIdleStatePacketHandler.disconnectChannel(this.obj, this.ctx.channel());
+            //ItsAsnServerIdleStatePacketHandler.disconnectChannel(this.obj, this.ctx.channel());
         }
         else if (rejectType.getDatexRejectSubscriptionCd() != null) {
             rejectCode = rejectType.getDatexRejectSubscriptionCd().value.intValue();

+ 1 - 1
src/main/java/com/its/rota/server/process/work/DataPacketProcess.java → src/main/java/com/its/rota/server/xnet/server/process/work/DataPacketProcess.java

@@ -1,4 +1,4 @@
-package com.its.rota.server.process.work;
+package com.its.rota.server.xnet.server.process.work;
 
 import com.its.rota.server.config.ApplicationConfig;
 import com.its.rota.server.process.AbstractAppProcess;

+ 1 - 1
src/main/java/com/its/rota/server/process/work/DataPacketWorker.java → src/main/java/com/its/rota/server/xnet/server/process/work/DataPacketWorker.java

@@ -1,4 +1,4 @@
-package com.its.rota.server.process.work;
+package com.its.rota.server.xnet.server.process.work;
 
 import com.beanit.enums.eAuthInfo;
 import com.beanit.its.C2CAuthenticatedMessage;

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

@@ -35,7 +35,6 @@ management:
         include: health, metrics
 
 application:
-  ggits-server-ip: 192.168.24.22
   process-id: 81010
   packet-workers: 30
   packet-queue-size: 0
@@ -44,6 +43,12 @@ application:
   thread-pool:
     dbms: 0
     work: 60
+  scheduler:
+    poolSize: 10
+    use-snd-incident: true
+    use-snd-log: true
+    delete-snd-incident: 0 6 * * * *
+    delete-snd-log: 0 8 * * * *
 
 ---
 spring:

+ 8 - 1
src/main/resources/mybatis/mapper/SndLogMapper.xml

@@ -10,11 +10,18 @@
         ]]>
     </insert>
 
-    <insert id="insCenterSend" parameterType="com.its.rota.server.entity.TbSndLog">
+    <insert id="insCenterSendx" parameterType="com.its.rota.server.entity.TbSndLog">
         <![CDATA[
         INSERT INTO CENTER_SEND@UTISDB(logdate, centerid, infotype, datacnt)
         VALUES(SYSDATE, #{obj.toCenterId}, #{obj.infoKind}, #{obj.dataCnt})
         ]]>
     </insert>
 
+    <insert id="insCenterSend" parameterType="com.its.rota.server.entity.TbSndLog">
+        <![CDATA[
+        INSERT INTO UTIADMIN_CENTER_SEND(logdate, centerid, infotype, datacnt)
+        VALUES(SYSDATE, #{obj.toCenterId}, #{obj.infoKind}, #{obj.dataCnt})
+        ]]>
+    </insert>
+
 </mapper>