shjung 3 rokov pred
rodič
commit
93e470032a
27 zmenil súbory, kde vykonal 705 pridanie a 168 odobranie
  1. 2 1
      src/main/java/com/its/api/config/CenterCommConfig.java
  2. 1 1
      src/main/java/com/its/api/config/JobConfig.java
  3. 4 3
      src/main/java/com/its/api/config/VdsServerConfig.java
  4. 4 3
      src/main/java/com/its/api/config/VmsServerConfig.java
  5. 13 3
      src/main/java/com/its/api/its/controller/vms/VmsControlController.java
  6. 4 4
      src/main/java/com/its/api/its/global/CctvManager.java
  7. 41 0
      src/main/java/com/its/api/its/global/UnitSystManager.java
  8. 4 4
      src/main/java/com/its/api/its/global/VdsManager.java
  9. 4 4
      src/main/java/com/its/api/its/global/VmsManager.java
  10. 40 47
      src/main/java/com/its/api/its/model/dto/vms/VmsControlDto.java
  11. 20 6
      src/main/java/com/its/api/its/service/vms/VmsControlService.java
  12. 2 5
      src/main/java/com/its/api/scheduler/ItsApiScheduler.java
  13. 15 0
      src/main/java/com/its/api/utils/SysUtils.java
  14. 15 7
      src/main/java/com/its/api/xnettcp/client/service/VdsCommClientService.java
  15. 16 56
      src/main/java/com/its/api/xnetudp/CenterCommUdpServer.java
  16. 66 0
      src/main/java/com/its/api/xnetudp/codec/VmsServerRequestEncoder.java
  17. 2 1
      src/main/java/com/its/api/xnetudp/protocol/CENTER_COMM_DEFINE.java
  18. 4 3
      src/main/java/com/its/api/xnetudp/protocol/CENTER_COMM_MESSAGE.java
  19. 156 0
      src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_COMM_MESSAGE.java
  20. 64 0
      src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_COMMON.java
  21. 8 0
      src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_LUMINANCE.java
  22. 70 0
      src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_PARAM.java
  23. 8 0
      src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_POWER.java
  24. 8 0
      src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_RESET.java
  25. 126 0
      src/main/java/com/its/api/xnetudp/service/VmsServerRequestSender.java
  26. 0 11
      src/main/resources/application-dev.yml
  27. 8 9
      src/main/resources/application.yml

+ 2 - 1
src/main/java/com/its/api/config/CenterCommConfig.java

@@ -17,6 +17,7 @@ import javax.annotation.PostConstruct;
 @ConfigurationProperties(prefix = "application.center-comm")
 public class CenterCommConfig {
 
+    private String  processId;
     private String bindingAddr = "";
     private int bindingPort = 4602;
     private boolean dump = false;
@@ -25,6 +26,6 @@ public class CenterCommConfig {
     @PostConstruct
     private void init() {
         if (this.bindingAddr.equals("")) this.bindingAddr = "0.0.0.0";
-        log.info("{}", this);
+        //log.info("{}", this);
     }
 }

+ 1 - 1
src/main/java/com/its/api/config/JobConfig.java

@@ -14,7 +14,7 @@ import javax.annotation.PostConstruct;
 @Setter
 @ToString
 @Configuration
-@ConfigurationProperties(prefix = "application.job")
+@ConfigurationProperties(prefix = "application.job-schedule")
 public class JobConfig {
 
     private boolean cctvPreset = false;

+ 4 - 3
src/main/java/com/its/api/config/VdsConfig.java → src/main/java/com/its/api/config/VdsServerConfig.java

@@ -14,16 +14,17 @@ import javax.annotation.PostConstruct;
 @Setter
 @ToString
 @Configuration
-@ConfigurationProperties(prefix = "application.vds")
-public class VdsConfig {
+@ConfigurationProperties(prefix = "application.vds-server")
+public class VdsServerConfig {
 
     private boolean enabled = true;
+    private String  processId;
     private String  ipAddress;
     private int     port;
     private int     reconnectTime = 30; // 재접속 seconds
 
     @PostConstruct
     private void init() {
-        log.info("{}", this);
+        //log.info("{}", this);
     }
 }

+ 4 - 3
src/main/java/com/its/api/config/VmsConfig.java → src/main/java/com/its/api/config/VmsServerConfig.java

@@ -14,15 +14,16 @@ import javax.annotation.PostConstruct;
 @Setter
 @ToString
 @Configuration
-@ConfigurationProperties(prefix = "application.vms")
-public class VmsConfig {
+@ConfigurationProperties(prefix = "application.vms-server")
+public class VmsServerConfig {
 
     private boolean enabled = true;
+    private String  processId;
     private String  ipAddress;
     private int     port;
 
     @PostConstruct
     private void init() {
-        log.info("{}", this);
+        //log.info("{}", this);
     }
 }

+ 13 - 3
src/main/java/com/its/api/its/controller/vms/VmsControlController.java

@@ -23,7 +23,7 @@ public class VmsControlController {
     @ApiOperation(value = "VMS 제어기 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/reset/{id}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlReset(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+            @ApiParam(name = "id", value = "제어기번호", example = "10021", required = true)
             @PathVariable("id") Long id,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlReq req) {
@@ -33,7 +33,7 @@ public class VmsControlController {
     @ApiOperation(value = "VMS 제어기 전광판 ON/OFF 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/power/{id}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlPower(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+            @ApiParam(name = "id", value = "제어기번호", example = "10021", required = true)
             @PathVariable("id") Long id,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlReq req) {
@@ -43,11 +43,21 @@ public class VmsControlController {
     @ApiOperation(value = "VMS 제어기 휘도 제어", response = VmsControlDto.VmsControlRes.class)
     @PostMapping(value = "/luminance/{id}", produces = {"application/json; charset=utf8"})
     public VmsControlDto.VmsControlRes controlLuminance(
-            @ApiParam(name = "id", value = "제어기번호", example = "1", required = true)
+            @ApiParam(name = "id", value = "제어기번호", example = "10021", required = true)
             @PathVariable("id") Long id,
             @ApiParam(name = "req", value = "VMS 제어기 제어 정보", example = "[ADMIN]", required = true)
             @RequestBody @Valid final VmsControlDto.VmsControlReq req) {
         return this.service.controlLuminance(id, req);
     }
 
+    @ApiOperation(value = "VMS 제어기 파라미터 설정", response = VmsControlDto.VmsControlRes.class)
+    @PostMapping(value = "/param/{id}", produces = {"application/json; charset=utf8"})
+    public VmsControlDto.VmsControlRes controlLuminance(
+            @ApiParam(name = "id", value = "제어기번호", example = "10021", required = true)
+            @PathVariable("id") Long id,
+            @ApiParam(name = "req", value = "VMS 제어기 파라미터 설정 정보", example = "[ADMIN]", required = true)
+            @RequestBody @Valid final VmsControlDto.VmsControlParamReq req) {
+        return this.service.controlParam(id, req);
+    }
+
 }

+ 4 - 4
src/main/java/com/its/api/its/global/CctvManager.java

@@ -19,7 +19,7 @@ public class CctvManager {
 
     private final TbCctvCtlrRepository repo;
 
-    private static final ConcurrentHashMap<Long, TbCctvCtlr> facility = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<Long, TbCctvCtlr> objMap = new ConcurrentHashMap<>();
 
     @PostConstruct
     void init() {
@@ -30,12 +30,12 @@ public class CctvManager {
 
         List<TbCctvCtlr> objList = repo.findAll();
         objList.forEach(obj -> {
-            facility.put(obj.getCctvMngmNmbr(), obj);
+            objMap.put(obj.getCctvMngmNmbr(), obj);
         });
-        log.info("=== {}", facility);
+        log.info("=== {}", objMap);
     }
 
     public static TbCctvCtlr get(Long id) {
-        return facility.get(id);
+        return objMap.get(id);
     }
 }

+ 41 - 0
src/main/java/com/its/api/its/global/UnitSystManager.java

@@ -0,0 +1,41 @@
+package com.its.api.its.global;
+
+import com.its.api.its.model.entity.unit.TbUnitSyst;
+import com.its.api.its.repository.unit.TbUnitSystRepository;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@RequiredArgsConstructor
+@Getter
+@Component
+public class UnitSystManager {
+
+    private final TbUnitSystRepository repo;
+
+    private static final ConcurrentHashMap<String, TbUnitSyst> objMap = new ConcurrentHashMap<>();
+
+    @PostConstruct
+    void init() {
+        load();
+    }
+
+    public void load() {
+
+        List<TbUnitSyst> objList = repo.findAll();
+        objList.forEach(obj -> {
+            objMap.put(obj.getSystId(), obj);
+        });
+        log.info("=== {}", objMap);
+    }
+
+    public static TbUnitSyst get(String id) {
+        return objMap.get(id);
+    }
+}

+ 4 - 4
src/main/java/com/its/api/its/global/VdsManager.java

@@ -19,7 +19,7 @@ public class VdsManager {
 
     private final TbVdsCtlrRepository repo;
 
-    private static final ConcurrentHashMap<String, TbVdsCtlr> facility = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<String, TbVdsCtlr> objMap = new ConcurrentHashMap<>();
 
     @PostConstruct
     void init() {
@@ -30,12 +30,12 @@ public class VdsManager {
 
         List<TbVdsCtlr> objList = repo.findAll();
         objList.forEach(obj -> {
-            facility.put(obj.getCtlrMngmNmbr(), obj);
+            objMap.put(obj.getCtlrMngmNmbr(), obj);
         });
-        log.info("=== {}", facility);
+        log.info("=== {}", objMap);
     }
 
     public static TbVdsCtlr get(String id) {
-        return facility.get(id);
+        return objMap.get(id);
     }
 }

+ 4 - 4
src/main/java/com/its/api/its/global/VmsManager.java

@@ -19,7 +19,7 @@ public class VmsManager {
 
     private final TbVmsCtlrRepository repo;
 
-    private static final ConcurrentHashMap<Long, TbVmsCtlr> facility = new ConcurrentHashMap<>();
+    private static final ConcurrentHashMap<Long, TbVmsCtlr> objMap = new ConcurrentHashMap<>();
 
     @PostConstruct
     void init() {
@@ -30,12 +30,12 @@ public class VmsManager {
 
         List<TbVmsCtlr> objList = repo.findAll();
         objList.forEach(obj -> {
-            facility.put(obj.getVmsCtlrNmbr(), obj);
+            objMap.put(obj.getVmsCtlrNmbr(), obj);
         });
-        log.info("=== {}", facility);
+        log.info("=== {}", objMap);
     }
 
     public static TbVmsCtlr get(Long id) {
-        return facility.get(id);
+        return objMap.get(id);
     }
 }

+ 40 - 47
src/main/java/com/its/api/its/model/dto/vms/VmsControlDto.java

@@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 
-import javax.validation.constraints.PositiveOrZero;
 import java.io.Serializable;
 
 /**
@@ -38,67 +37,65 @@ public class VmsControlDto implements Serializable {
             this.value = value;
         }
     }
-
-    @ApiModel("VmsControlRes(VMS 제어기 제어 응답)")
+    @ApiModel("VmsControlParamReq(VDS 제어기 파라미터설정)")
     @Getter
     @Setter
     @ToString
     @NoArgsConstructor(access = AccessLevel.PROTECTED)
-    public static class VmsControlRes {
+    public static class VmsControlParamReq {
 
-        @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
-        @JsonProperty("error")
-        private Integer error;
+        @ApiModelProperty("로그인 사용자 ID")
+        @JsonProperty("user_id")
+        private String userId;
 
-        @ApiModelProperty("제어결과메시지")
-        @JsonProperty("message")
-        private String message;
+        @ApiModelProperty("계획된 메시지 동작시간")
+        @JsonProperty("sch_msg_time")
+        private Integer schMsgTime;
 
-        public void setResult(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-        @Builder
-        public VmsControlRes(Integer error, String message) {
-            this.error = error;
-            this.message = message;
-        }
-    }
+        @ApiModelProperty("모듈전원 OFF 온도")
+        @JsonProperty("module_temp")
+        private Integer moduleTemp;
 
-    @ApiModel("VmsControlStopImageReq(VMS 영상정보 요청)")
-    @Getter
-    @Setter
-    @ToString
-    @NoArgsConstructor(access = AccessLevel.PROTECTED)
-    public static class VmsControlStopImageReq {
+        @ApiModelProperty("Fan 동작 기준온도")
+        @JsonProperty("fan_temp")
+        private Integer fanTemp;
 
-        @ApiModelProperty("카메라번호(기본:1)")
-        @JsonProperty("camera_no")
-        @PositiveOrZero
-        private Integer cameraNo;
+        @ApiModelProperty("Heater 동작 기준온도")
+        @JsonProperty("heater_temp")
+        private Integer heaterTemp;
 
-        @ApiModelProperty("프레임번호(무조건:0)")
-        @JsonProperty("frame_no")
-        @PositiveOrZero
-        private Integer frameNo;
+        @ApiModelProperty("모듈장애 판단율")
+        @JsonProperty("module_fail")
+        private Integer moduleFail;
 
-        @ApiModelProperty("로그인 사용자 ID")
-        @JsonProperty("user_id")
-        private String userId;
+        @ApiModelProperty("재시도 횟수")
+        @JsonProperty("retry_count")
+        private Integer retryCount;
+
+        @ApiModelProperty("최대응답대기시간")
+        @JsonProperty("timeout")
+        private Integer timeOut;
 
         @Builder
-        public VmsControlStopImageReq(Integer camera_no, String user_id) {
-            this.cameraNo = camera_no;
+        public VmsControlParamReq(String user_id, Integer sch_msg_time, Integer module_temp, Integer fan_temp, Integer heater_temp, Integer module_fail, Integer retry_count, Integer timeout) {
             this.userId = user_id;
+            this.schMsgTime = sch_msg_time;
+            this.moduleTemp = module_temp;
+            this.fanTemp = fan_temp;
+            this.heaterTemp = heater_temp;
+            this.moduleFail = module_fail;
+            this.retryCount = retry_count;
+            this.timeOut = timeout;
         }
+
     }
 
-    @ApiModel("VmsControlStopImageRes(VMS 영상정보 요청 응답)")
+    @ApiModel("VmsControlRes(VMS 제어기 제어 응답)")
     @Getter
     @Setter
     @ToString
     @NoArgsConstructor(access = AccessLevel.PROTECTED)
-    public static class VmsControlStopImageRes {
+    public static class VmsControlRes {
 
         @ApiModelProperty("제어결과(0: 성공, 기타: 오류")
         @JsonProperty("error")
@@ -108,19 +105,15 @@ public class VmsControlDto implements Serializable {
         @JsonProperty("message")
         private String message;
 
-        @ApiModelProperty("영상이미지")
-        @JsonProperty("image")
-        private byte[] image;
-
         public void setResult(Integer error, String message) {
             this.error = error;
             this.message = message;
         }
         @Builder
-        public VmsControlStopImageRes(Integer error, String message, byte[] image) {
+        public VmsControlRes(Integer error, String message) {
             this.error = error;
             this.message = message;
-            this.image = image;
         }
     }
+
 }

+ 20 - 6
src/main/java/com/its/api/its/service/vms/VmsControlService.java

@@ -2,7 +2,7 @@ package com.its.api.its.service.vms;
 
 import com.its.api.its.model.dto.vms.VmsControlDto;
 import com.its.api.its.repository.vms.TbVmsCtlrRepository;
-import com.its.api.xnetudp.CenterCommUdpServer;
+import com.its.api.xnetudp.service.VmsServerRequestSender;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class VmsControlService {
 
-    private final CenterCommUdpServer centerCommUdpServer;
+    private final VmsServerRequestSender vmsServerRequestSender;
     private final TbVmsCtlrRepository repo;
 
     /**
@@ -22,7 +22,8 @@ public class VmsControlService {
      * @return
      */
     public VmsControlDto.VmsControlRes controlReset(Long id, VmsControlDto.VmsControlReq req) {
-        boolean isSendMsg = this.centerCommUdpServer.requestReset(id, req);
+        log.error("controlReset: {}, {}", id, req);
+        boolean isSendMsg = this.vmsServerRequestSender.requestReset(id, req);
         if (isSendMsg) {
             return new VmsControlDto.VmsControlRes(0, "success");
         }
@@ -33,11 +34,10 @@ public class VmsControlService {
      * VMS 제어기 전광판 On/Off 제어
      * @param id
      * @param req
-     * @param isOn
      * @return
      */
     public VmsControlDto.VmsControlRes controlPower(Long id, VmsControlDto.VmsControlReq req) {
-        boolean isSendMsg = this.centerCommUdpServer.requestPowerControl(id, req);
+        boolean isSendMsg = this.vmsServerRequestSender.requestPowerControl(id, req);
         if (isSendMsg) {
             return new VmsControlDto.VmsControlRes(0, "success");
         }
@@ -51,7 +51,21 @@ public class VmsControlService {
      * @return
      */
     public VmsControlDto.VmsControlRes controlLuminance(Long id, VmsControlDto.VmsControlReq req) {
-        boolean isSendMsg = this.centerCommUdpServer.controlLuminance(id, req);
+        boolean isSendMsg = this.vmsServerRequestSender.controlLuminance(id, req);
+        if (isSendMsg) {
+            return new VmsControlDto.VmsControlRes(0, "success");
+        }
+        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
+    }
+
+    /**
+     * VMS 제어기 파라미터 설정
+     * @param id
+     * @param req
+     * @return
+     */
+    public VmsControlDto.VmsControlRes controlParam(Long id, VmsControlDto.VmsControlParamReq req) {
+        boolean isSendMsg = this.vmsServerRequestSender.controlParam(id, req);
         if (isSendMsg) {
             return new VmsControlDto.VmsControlRes(0, "success");
         }

+ 2 - 5
src/main/java/com/its/api/scheduler/ItsApiScheduler.java

@@ -35,7 +35,6 @@ public class ItsApiScheduler {
     @Scheduled(cron = "0 * * * * *")  // 1분 주기 작업 실행
     public void jobCctvPsetScnr() {
         if (this.jobConfig.isCctvPreset()) {
-            log.info("START CctvPsetScnrJob");
             this.cctvPsetScnrThread.run();
         }
     }
@@ -46,20 +45,18 @@ public class ItsApiScheduler {
     @Async
     @Scheduled(cron = "20 * * * * *")  // 60초 주기 작업 실행
     public void pollingFcltStts() {
-        log.info("START FcltSttsJob");
         this.fcltSttsJobThread.run();
     }
 
     @Async
     @Scheduled(cron = "10 * * * * *")  // 60초 주기 작업 실행
     public void pollingUnitStts() {
-        log.info("START UnitSttsJob");
         this.unitSttsJobThread.run();
     }
 
-    @Async
+    /*@Async
     @Scheduled(cron = "0/2 * * * * *")  // 2초 주기 작업 실행
     public void checkKafkaServerAlive() {
-    }
+    }*/
 
 }

+ 15 - 0
src/main/java/com/its/api/utils/SysUtils.java

@@ -90,6 +90,21 @@ public final class SysUtils
 		return -1;
 	}
 
+	public static byte[] stringToByteArray(String data) {
+		byte[] byteData = data.getBytes();
+		return byteData;
+	}
+	public static void copyStringToByteArray(byte[] dest, int length, String data) {
+		byte[] byteData = data.getBytes();
+		int size = dest.length;
+		int ii;
+		for (ii = 0; ii < byteData.length && ii < size; ii++) {
+			dest[ii] = byteData[ii];
+		}
+		for (int jj = ii; jj < size; jj++) {
+			dest[jj] = 0x00;
+		}
+	}
 	public static String byteArrayToString(byte[] data) {
 		StringBuilder sb = new StringBuilder(data.length);
 		for (int ii = 0; ii < data.length; ++ ii) {

+ 15 - 7
src/main/java/com/its/api/xnettcp/client/service/VdsCommClientService.java

@@ -1,6 +1,8 @@
 package com.its.api.xnettcp.client.service;
 
-import com.its.api.config.VdsConfig;
+import com.its.api.config.VdsServerConfig;
+import com.its.api.its.global.UnitSystManager;
+import com.its.api.its.model.entity.unit.TbUnitSyst;
 import com.its.api.xnettcp.client.NettyTcpClient;
 import com.its.api.xnettcp.client.NettyTcpClientBootstrapFactory;
 import lombok.Getter;
@@ -22,10 +24,10 @@ import java.util.concurrent.Future;
 @Service
 public class VdsCommClientService {
 
-    private final VdsConfig vdsConfig;
+    private final VdsServerConfig vdsServerConfig;
     private NettyTcpClient vdsClient;
     private ExecutorService executorService= Executors.newFixedThreadPool(1);
-    private List clientTasks = Collections.synchronizedList(new ArrayList());
+    private List<NettyTcpClient> clientTasks = Collections.synchronizedList(new ArrayList());
 
     @PostConstruct
     void init() {
@@ -34,11 +36,17 @@ public class VdsCommClientService {
 
     public void run() {
         log.info("VdsCommClientService.run: Start.");
+        TbUnitSyst vdsServer = UnitSystManager.get(this.vdsServerConfig.getProcessId());
+        if (vdsServer != null) {
+            this.vdsServerConfig.setIpAddress(vdsServer.getSystIp1().trim());
+            this.vdsServerConfig.setPort(Integer.parseInt(vdsServer.getPrgmPort().trim()));
+        }
+        log.info("{}", this.vdsServerConfig);
 
-        this.vdsClient = new NettyTcpClient(vdsConfig.getIpAddress(), vdsConfig.getPort(), vdsConfig.getReconnectTime(), new NettyTcpClientBootstrapFactory(1, 5));
+        this.vdsClient = new NettyTcpClient(vdsServerConfig.getIpAddress(), vdsServerConfig.getPort(), vdsServerConfig.getReconnectTime(), new NettyTcpClientBootstrapFactory(1, 5));
         this.clientTasks.add(this.vdsClient);
         try {
-            List<Future> futures = this.executorService.invokeAll(this.clientTasks);
+            List<Future<Object>> futures = this.executorService.invokeAll(this.clientTasks);
             log.info("VdsCommClientService.run: {}", futures);
         } catch(InterruptedException e) {
             log.error("Exception: {}", e.getMessage());
@@ -46,8 +54,8 @@ public class VdsCommClientService {
 
         log.info("===============================================================");
         log.info("=  VDS Communication Client Start.......................");
-        log.info("=  ipAddress: {}", vdsConfig.getIpAddress());
-        log.info("=       port: {}", vdsConfig.getPort());
+        log.info("=  ipAddress: {}", this.vdsServerConfig.getIpAddress());
+        log.info("=       port: {}", this.vdsServerConfig.getPort());
         log.info("===============================================================");
 
         log.info("VdsCommClientService.run: ..End. {}", toString());

+ 16 - 56
src/main/java/com/its/api/xnetudp/CenterCommUdpServer.java

@@ -1,12 +1,10 @@
 package com.its.api.xnetudp;
 
 import com.its.api.config.CenterCommConfig;
-import com.its.api.config.VmsConfig;
-import com.its.api.its.model.dto.vms.VmsControlDto;
+import com.its.api.its.global.UnitSystManager;
+import com.its.api.its.model.entity.unit.TbUnitSyst;
 import com.its.api.xnetudp.codec.CenterCommServerDecoder;
 import com.its.api.xnetudp.handler.CenterCommServerPacketHandler;
-import com.its.api.xnetudp.protocol.CENTER_COMM_DEFINE;
-import com.its.api.xnetudp.protocol.CENTER_COMM_MESSAGE;
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.*;
 import io.netty.channel.nio.NioEventLoopGroup;
@@ -22,8 +20,7 @@ import org.springframework.stereotype.Component;
 @Component
 public class CenterCommUdpServer {
 
-    private final VmsConfig vmsConfig;
-    private final CenterCommConfig serverConfig;
+    private final CenterCommConfig centerCommConfig;
 
     private EventLoopGroup nioEventLoopGroup;
     private Bootstrap bootstrap;
@@ -32,6 +29,12 @@ public class CenterCommUdpServer {
     public void run() {
         log.info("UdpServerCenterComm.run: Start.");
 
+        TbUnitSyst oper00 = UnitSystManager.get(this.centerCommConfig.getProcessId());
+        if (oper00 != null) {
+            this.centerCommConfig.setBindingPort(Integer.parseInt(oper00.getPrgmPort().trim()));
+        }
+        log.info("{}", this.centerCommConfig);
+
         try {
             this.nioEventLoopGroup = new NioEventLoopGroup();
             this.bootstrap = new Bootstrap();
@@ -57,25 +60,25 @@ public class CenterCommUdpServer {
 
         log.info("===============================================================");
         log.info("=  UDP Center Communication Server Start.......................");
-        log.info("=  bindAddress: {}", serverConfig.getBindingAddr());
-        log.info("=     bindPort: {}", serverConfig.getBindingPort());
+        log.info("=  bindAddress: {}", this.centerCommConfig.getBindingAddr());
+        log.info("=     bindPort: {}", this.centerCommConfig.getBindingPort());
         log.info("===============================================================");
 
         try {
-            if (this.serverConfig.getBindingAddr().equals("0.0.0.0")) {
+            if (this.centerCommConfig.getBindingAddr().equals("0.0.0.0")) {
                 if (isThreadRunning) {
-                    this.bootstrap.bind(this.serverConfig.getBindingPort()).sync().channel().closeFuture().await();
+                    this.bootstrap.bind(this.centerCommConfig.getBindingPort()).sync().channel().closeFuture().await();
                 }
                 else {
-                    this.bootstrap.bind(this.serverConfig.getBindingPort());
+                    this.bootstrap.bind(this.centerCommConfig.getBindingPort());
                 }
             }
             else {
                 if (isThreadRunning) {
-                    this.bootstrap.bind(this.serverConfig.getBindingAddr(), serverConfig.getBindingPort()).sync().channel().closeFuture().await();
+                    this.bootstrap.bind(this.centerCommConfig.getBindingAddr(), centerCommConfig.getBindingPort()).sync().channel().closeFuture().await();
                 }
                 else {
-                    this.bootstrap.bind(this.serverConfig.getBindingAddr(), serverConfig.getBindingPort());
+                    this.bootstrap.bind(this.centerCommConfig.getBindingAddr(), centerCommConfig.getBindingPort());
                 }
             }
         }
@@ -94,47 +97,4 @@ public class CenterCommUdpServer {
         log.info("UdpServerCenterComm.run: ..End. {}", toString());
     }
 
-    /**
-     * VMS 서버로 리셋 명령 전송
-     * @param id
-     * @param req
-     * @return
-     */
-    public boolean requestReset(Long id, VmsControlDto.VmsControlReq req) {
-        byte msgSeq = (byte)0x20;
-        int reqSize = CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME + CENTER_COMM_DEFINE.INT_VMS_MAX_ID + CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID;
-        int length = reqSize + 1;
-        CENTER_COMM_MESSAGE commMsg = new CENTER_COMM_MESSAGE(CENTER_COMM_DEFINE.INT_ID_VMS_SERVER, CENTER_COMM_DEFINE.INT_OP_VMS_RESET, length, msgSeq);
-        return true;
-    }
-
-    /**
-     * VMS 서버로 전광판 On/Off 명령 전송
-     * @param id
-     * @param req
-     * @return
-     */
-    public boolean requestPowerControl(Long id, VmsControlDto.VmsControlReq req) {
-        byte msgSeq = (byte)0x20;
-        int reqSize = CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME + CENTER_COMM_DEFINE.INT_VMS_MAX_ID + CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID;
-        int length = reqSize + 1;
-        byte command = req.getValue() == 0 ? (byte)0x00 : (byte)0x01;
-        CENTER_COMM_MESSAGE commMsg = new CENTER_COMM_MESSAGE(CENTER_COMM_DEFINE.INT_ID_VMS_SERVER, CENTER_COMM_DEFINE.INT_OP_VMS_POWER_CTL, length, msgSeq);
-        return true;
-    }
-
-    /**
-     * VMS 서버로 휘도제어 명령 전송
-     * @param id
-     * @param req
-     * @return
-     */
-    public boolean controlLuminance(Long id, VmsControlDto.VmsControlReq req) {
-        byte msgSeq = (byte)0x20;
-        int reqSize = CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME + CENTER_COMM_DEFINE.INT_VMS_MAX_ID + CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID;
-        int length = reqSize + 1;
-        byte luminance = (byte)req.getValue().intValue();
-        CENTER_COMM_MESSAGE commMsg = new CENTER_COMM_MESSAGE(CENTER_COMM_DEFINE.INT_ID_VMS_SERVER, CENTER_COMM_DEFINE.INT_OP_VMS_LUMINANCE_CTL, length, msgSeq);
-        return true;
-    }
 }

+ 66 - 0
src/main/java/com/its/api/xnetudp/codec/VmsServerRequestEncoder.java

@@ -0,0 +1,66 @@
+package com.its.api.xnetudp.codec;
+
+import com.its.api.utils.SysUtils;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.socket.DatagramPacket;
+import io.netty.handler.codec.MessageToMessageEncoder;
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+@Slf4j
+public class VmsServerRequestEncoder extends MessageToMessageEncoder<Object> {
+
+	private String remoteIpAddr;
+	private int remotePort;
+
+	public VmsServerRequestEncoder(String hostIp, int hostPort) {
+		this.remoteIpAddr = hostIp;
+		this.remotePort = hostPort;
+	}
+
+	@Override
+	protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
+
+		Channel channel = ctx.channel();
+		if (!channel.isOpen()) {
+			log.error("SEND: Channel Closed.");
+		}
+		if (!channel.isActive()) {
+			log.error("SEND: Channel InActive.");
+			channel.flush();
+			return;
+		}
+
+		if (!(msg instanceof ByteBuffer)) {
+			log.error("SEND: Encoding Data source Unknown Type.");
+			return;
+		}
+
+		int sendBytes = ((ByteBuffer) msg).array().length;
+		if (this.remoteIpAddr == null) {
+			log.error("SEND: [ERROR], RemoteAddress null, {} Bytes.", sendBytes);
+			return;
+		}
+		else {
+			log.info("SEND: [{}:{}], {} Bytes.", this.remoteIpAddr, this.remotePort, sendBytes);
+		}
+
+		log.info("SEND DUMP: {}", SysUtils.byteArrayToHex(((ByteBuffer) msg).array()));
+
+		try {
+			ByteBuf byteBuf = Unpooled.buffer(sendBytes);
+			byteBuf.writeBytes(((ByteBuffer) msg).array());
+			InetSocketAddress addr = new InetSocketAddress(this.remoteIpAddr, this.remotePort);
+			DatagramPacket packet = new DatagramPacket(byteBuf, addr);
+			out.add(packet);
+		} catch (Exception e) {
+			log.error("SEND: [{}:{}], {} Bytes. Failed. Exception: {}", this.remoteIpAddr, this.remotePort, sendBytes, e.getMessage());
+		}
+	}
+}

+ 2 - 1
src/main/java/com/its/api/xnetudp/protocol/CENTER_COMM_DEFINE.java

@@ -66,7 +66,8 @@ public class CENTER_COMM_DEFINE {
 	//public static final int INT_OP_VMS_POWER_CTL            = 0x23;        /* VMS 통신 서버, VMS 전광판 On/Off 제어 */
 	//public static final int INT_OP_VMS_LUMINANCE_CTL        = 0x24;        /* VMS 통신 서버, VMS 휘도 제어 */
 
-	public static final int INT_OP_VMS_PARA_SET             = 0x25;        /* VMS 통신 서버, VMS 환경설정정보 전송 */
+	public static final int INT_OP_VMS_PARA_SET             = 0x08;        /* VMS 통신 서버, VMS 환경설정정보 전송 */
+	//public static final int INT_OP_VMS_PARA_SET             = 0x25;        /* VMS 통신 서버, VMS 환경설정정보 전송 */
 	public static final int INT_OP_VMS_PARA_SET2            = 0x26;        /* VMS 통신 서버, VMS 환경설정정보 전송(For Pasig) */
 	//public static final int INT_OP_VMS_RESET                = 0x27;        /* VMS 통신 서버, VMS 제어기 리셋 전송 */
 	public static final int INT_OP_VMS_RESET                = 0x09;        /* VMS 통신 서버, VMS 제어기 리셋 전송 */

+ 4 - 3
src/main/java/com/its/api/xnetudp/protocol/CENTER_COMM_MESSAGE.java

@@ -27,15 +27,16 @@ public class CENTER_COMM_MESSAGE {
 	public CENTER_COMM_MESSAGE() {
 
 	}
-	public CENTER_COMM_MESSAGE(int senderId, int opCode, int length, byte msgSeq) {
-		this.sendId       = (byte)senderId;
-		this.recvId       = (byte) CENTER_COMM_DEFINE.INT_ID_MAIN_OPER;
+	public CENTER_COMM_MESSAGE(int recvId, int opCode, int length, byte msgSeq) {
+		this.sendId       = (byte)CENTER_COMM_DEFINE.INT_ID_MAIN_OPER;
+		this.recvId       = (byte)recvId;
 		this.totalFrame   = 1;
 		this.currentFrame = 1;
 		this.msgSeq       = msgSeq;
 		this.opCode       = (byte)opCode;
 		this.length       = length;
 	}
+
 	public CENTER_COMM_MESSAGE(byte[] buffer, InetSocketAddress inetSocketAddress) {
 
 		this.sender = inetSocketAddress;

+ 156 - 0
src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_COMM_MESSAGE.java

@@ -0,0 +1,156 @@
+package com.its.api.xnetudp.protocol;
+
+import com.its.api.utils.SysUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+@Slf4j
+public class CENTER_VMS_COMM_MESSAGE {
+
+	public static int CENTER_HEADER_SIZE = 10;
+
+	private InetSocketAddress sender;
+
+	private byte sendId;
+	private byte recvId;
+	private byte totalFrame;
+	private byte currentFrame;
+	private byte reserved;		// reserved
+	private byte opCode;
+	private int  length;		// 4byte unsigned short
+
+	private byte intOpCode;
+	private byte intMsgSeq;
+	private byte[] body;
+
+	public CENTER_VMS_COMM_MESSAGE() {
+	}
+	public CENTER_VMS_COMM_MESSAGE(int recvId, int opCode, int length, byte msgSeq) {
+		this.sendId       = (byte)CENTER_COMM_DEFINE.INT_ID_MAIN_OPER;
+		this.recvId       = (byte)recvId;
+		this.totalFrame   = 1;
+		this.currentFrame = 1;
+		this.reserved     = 0x00;
+		this.opCode       = (byte)0xFF;
+		this.length       = length+2;
+		this.intOpCode    = (byte)opCode;
+		this.intMsgSeq    = msgSeq;
+	}
+
+	public CENTER_VMS_COMM_MESSAGE(byte[] buffer, InetSocketAddress inetSocketAddress) {
+
+		this.sender = inetSocketAddress;
+
+		ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
+		byteBuffer.order(ByteOrder.BIG_ENDIAN);
+
+		this.sendId       = byteBuffer.get();
+		this.recvId       = byteBuffer.get();
+		this.totalFrame   = byteBuffer.get();
+		this.currentFrame = byteBuffer.get();
+		this.reserved     = byteBuffer.get();
+		this.opCode       = byteBuffer.get();
+		int  length       = byteBuffer.getInt();
+		this.intOpCode    = byteBuffer.get();
+		this.intMsgSeq    = byteBuffer.get();
+		this.length = byteBuffer.array().length - 10;
+		if (this.length > 0) {
+			this.body = new byte[this.length];
+			byteBuffer.get(this.body);
+
+			if (length != this.length) {
+				log.error("######################################################################");
+				log.error("######################################################################");
+				log.error("######################################################################, Length Error: {}, {}, {}", length, this.length, buffer.length);
+				log.error("VMS PACKET: {}", SysUtils.byteArrayToHex(buffer));
+			}
+		}
+	}
+
+	public String getSenderIp() {
+		return this.sender.getAddress().getHostAddress();
+	}
+	public int getSenderPort() {
+		return this.sender.getPort();
+	}
+	
+	public byte getOpCode() {
+		return this.opCode;
+	}
+	public void setOpCode(byte opCode) {
+		this.opCode = opCode;
+	}
+	
+	public int getLength() {
+		return this.length;
+	}
+	public void setLength(int length) {
+		this.length = length;
+	}
+	public InetSocketAddress getSender() {
+		return sender;
+	}
+
+	public void setSender(InetSocketAddress sender) {
+		this.sender = sender;
+	}
+
+	public byte getSendId() {
+		return sendId;
+	}
+
+	public void setSendId(byte sendId) {
+		this.sendId = sendId;
+	}
+
+	public byte getRecvId() {
+		return recvId;
+	}
+
+	public void setRecvId(byte recvId) {
+		this.recvId = recvId;
+	}
+
+	public byte getTotalFrame() {
+		return totalFrame;
+	}
+
+	public void setTotalFrame(byte totalFrame) {
+		this.totalFrame = totalFrame;
+	}
+
+	public byte getCurrentFrame() {
+		return currentFrame;
+	}
+
+	public void setCurrentFrame(byte currentFrame) {
+		this.currentFrame = currentFrame;
+	}
+
+	public byte getReserved() { return reserved; }
+	public byte getMsgSeq() {
+		return intMsgSeq;
+	}
+
+	public byte getIntOpCode() { return intOpCode; }
+	public void setMsgSeq(byte msgSeq) {
+		this.intMsgSeq = msgSeq;
+	}
+
+	public byte[] getBody() {
+		return this.body;
+	}
+	public void setBody(byte[] body) {
+		this.body = body;
+	}
+	public byte[] getMessage() {
+		return null;
+	}
+
+	public ByteBuffer getBuffer() {
+		return null;
+	}
+}

+ 64 - 0
src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_COMMON.java

@@ -0,0 +1,64 @@
+package com.its.api.xnetudp.protocol;
+
+import com.its.api.utils.SysUtils;
+import lombok.Data;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+@Data
+public class CENTER_VMS_REQ_COMMON extends CENTER_VMS_COMM_MESSAGE {
+
+	private String cmdTime;
+	private String operId;
+	private Long vmsCtlrNmbr;
+	private Byte cmd;
+
+	public CENTER_VMS_REQ_COMMON(int opCode, int msgSeq, int length, Long vmsCtlrNmbr, String operId, Byte cmd) {
+		super(CENTER_COMM_DEFINE.INT_ID_VMS_SERVER, opCode, length, (byte)msgSeq);
+		this.cmdTime = SysUtils.getSysTime();
+		this.operId = operId;
+		this.vmsCtlrNmbr = vmsCtlrNmbr;
+		this.cmd = cmd;
+	}
+
+	@Override
+	public ByteBuffer getBuffer() {
+		int pktSize = CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME + CENTER_COMM_DEFINE.INT_VMS_MAX_ID + CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID + 2;
+		if (null != this.cmd) {
+			pktSize++;
+		}
+
+		setLength(pktSize);
+
+		ByteBuffer byteBuffer = ByteBuffer.allocate(CENTER_HEADER_SIZE + getLength());
+		byteBuffer.order(ByteOrder.BIG_ENDIAN);
+
+		byteBuffer.put(getSendId());
+		byteBuffer.put(getRecvId());
+		byteBuffer.put(getTotalFrame());
+		byteBuffer.put(getCurrentFrame());
+		byteBuffer.put(getReserved());
+		byteBuffer.put(getOpCode());
+		byteBuffer.putInt(getLength());
+		byteBuffer.put(getIntOpCode());
+		byteBuffer.put(getMsgSeq());
+
+		byte[] cmdTimeArr = new byte[CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME];
+		byte[] vmsIdArr = new byte[CENTER_COMM_DEFINE.INT_VMS_MAX_ID];
+		byte[] operIdArr = new byte[CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID];
+		SysUtils.copyStringToByteArray(cmdTimeArr, cmdTimeArr.length, this.cmdTime);
+		SysUtils.copyStringToByteArray(vmsIdArr, vmsIdArr.length, String.valueOf(this.vmsCtlrNmbr));
+		SysUtils.copyStringToByteArray(operIdArr, operIdArr.length, this.operId);
+		byteBuffer.put(cmdTimeArr);
+		byteBuffer.put(vmsIdArr);
+		byteBuffer.put(operIdArr);
+		if (null != this.cmd) {
+			byteBuffer.put(this.cmd);
+		}
+		return byteBuffer;
+
+	}
+
+
+}

+ 8 - 0
src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_LUMINANCE.java

@@ -0,0 +1,8 @@
+package com.its.api.xnetudp.protocol;
+
+public class CENTER_VMS_REQ_LUMINANCE extends CENTER_VMS_REQ_COMMON {
+
+	public CENTER_VMS_REQ_LUMINANCE(Long id, String userId, Byte value) {
+		super(CENTER_COMM_DEFINE.INT_OP_VMS_LUMINANCE_CTL, 0x30, 0, id, userId, value);
+	}
+}

+ 70 - 0
src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_PARAM.java

@@ -0,0 +1,70 @@
+package com.its.api.xnetudp.protocol;
+
+import com.its.api.its.model.dto.vms.VmsControlDto;
+import com.its.api.utils.SysUtils;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+public class CENTER_VMS_REQ_PARAM extends CENTER_VMS_REQ_COMMON {
+
+	private int  SchMsgTime;                           /* 계획된 메시지 동작시간 */
+	private byte ModuleTemp;                           /* 모듈전원 OFF 온도 */
+	private byte FanTemp;                              /* Fan동작 기준온도 */
+	private byte HeaterTemp;                           /* Heater동작 기준온도 */
+	private byte ModuleFail;                           /* 모듈장애 판단율 */
+	private byte RetryCount;                           /* 재시도 횟수 */
+	private int  TimeOut;                              /* 최대응답대기시간 */
+
+	public CENTER_VMS_REQ_PARAM(Long id, VmsControlDto.VmsControlParamReq req) {
+		super(CENTER_COMM_DEFINE.INT_OP_VMS_PARA_SET, 0x40, 0, id, req.getUserId(), null);
+		this.SchMsgTime = req.getSchMsgTime();
+		this.ModuleTemp = (byte)req.getModuleTemp().intValue();
+		this.FanTemp = (byte)req.getFanTemp().intValue();
+		this.HeaterTemp = (byte)req.getHeaterTemp().intValue();
+		this.ModuleFail = (byte)req.getModuleFail().intValue();
+		this.RetryCount = (byte)req.getRetryCount().intValue();
+		this.TimeOut = req.getTimeOut();
+	}
+
+	@Override
+	public ByteBuffer getBuffer() {
+		int pktSize = CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME + CENTER_COMM_DEFINE.INT_VMS_MAX_ID + CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID + 2 + 13;
+
+		setLength(pktSize);
+
+		ByteBuffer byteBuffer = ByteBuffer.allocate(CENTER_HEADER_SIZE + getLength());
+		byteBuffer.order(ByteOrder.BIG_ENDIAN);
+
+		byteBuffer.put(getSendId());
+		byteBuffer.put(getRecvId());
+		byteBuffer.put(getTotalFrame());
+		byteBuffer.put(getCurrentFrame());
+		byteBuffer.put(getReserved());
+		byteBuffer.put(getOpCode());
+		byteBuffer.putInt(getLength());
+		byteBuffer.put(getIntOpCode());
+		byteBuffer.put(getMsgSeq());
+
+		byte[] cmdTimeArr = new byte[CENTER_COMM_DEFINE.INT_VMS_MAX_DATETIME];
+		byte[] vmsIdArr = new byte[CENTER_COMM_DEFINE.INT_VMS_MAX_ID];
+		byte[] operIdArr = new byte[CENTER_COMM_DEFINE.INT_VMS_MAX_OPER_ID];
+		SysUtils.copyStringToByteArray(cmdTimeArr, cmdTimeArr.length, getCmdTime());
+		SysUtils.copyStringToByteArray(vmsIdArr, vmsIdArr.length, String.valueOf(getVmsCtlrNmbr()));
+		SysUtils.copyStringToByteArray(operIdArr, operIdArr.length, getOperId());
+		byteBuffer.put(cmdTimeArr);
+		byteBuffer.put(vmsIdArr);
+		byteBuffer.put(operIdArr);
+		byteBuffer.putInt(this.SchMsgTime);
+		byteBuffer.put(this.ModuleTemp);
+		byteBuffer.put(this.FanTemp);
+		byteBuffer.put(this.HeaterTemp);
+		byteBuffer.put(this.ModuleFail);
+		byteBuffer.put(this.RetryCount);
+		byteBuffer.putInt(this.TimeOut);
+
+		return byteBuffer;
+
+	}
+
+}

+ 8 - 0
src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_POWER.java

@@ -0,0 +1,8 @@
+package com.its.api.xnetudp.protocol;
+
+public class CENTER_VMS_REQ_POWER extends CENTER_VMS_REQ_COMMON {
+
+	public CENTER_VMS_REQ_POWER(Long id, String userId, Byte onOff) {
+		super(CENTER_COMM_DEFINE.INT_OP_VMS_POWER_CTL, 0x10, 0, id, userId, onOff);
+	}
+}

+ 8 - 0
src/main/java/com/its/api/xnetudp/protocol/CENTER_VMS_REQ_RESET.java

@@ -0,0 +1,8 @@
+package com.its.api.xnetudp.protocol;
+
+public class CENTER_VMS_REQ_RESET extends CENTER_VMS_REQ_COMMON {
+
+	public CENTER_VMS_REQ_RESET(Long id, String userId) {
+		super(CENTER_COMM_DEFINE.INT_OP_VMS_RESET, 0x20, 0, id, userId, null);
+	}
+}

+ 126 - 0
src/main/java/com/its/api/xnetudp/service/VmsServerRequestSender.java

@@ -0,0 +1,126 @@
+package com.its.api.xnetudp.service;
+
+import com.its.api.config.VmsServerConfig;
+import com.its.api.its.global.UnitSystManager;
+import com.its.api.its.model.dto.vms.VmsControlDto;
+import com.its.api.its.model.entity.unit.TbUnitSyst;
+import com.its.api.xnetudp.codec.VmsServerRequestEncoder;
+import com.its.api.xnetudp.protocol.CENTER_VMS_REQ_LUMINANCE;
+import com.its.api.xnetudp.protocol.CENTER_VMS_REQ_PARAM;
+import com.its.api.xnetudp.protocol.CENTER_VMS_REQ_POWER;
+import com.its.api.xnetudp.protocol.CENTER_VMS_REQ_RESET;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioDatagramChannel;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.nio.ByteBuffer;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class VmsServerRequestSender {
+
+    private final VmsServerConfig vmsServerConfig;
+
+    @Async("centerCommExecutor")
+    public void run(ByteBuffer sendBuffer) {
+
+        TbUnitSyst vmsServer = UnitSystManager.get(this.vmsServerConfig.getProcessId());
+        if (vmsServer != null) {
+            this.vmsServerConfig.setIpAddress(vmsServer.getSystIp1().trim());
+            this.vmsServerConfig.setPort(Integer.parseInt(vmsServer.getPrgmPort().trim()));
+        }
+        log.info("{}", this.vmsServerConfig);
+
+        if (sendBuffer == null) {
+            log.error("VmsServerRequestSender.run: Notify Data NULL");
+            return;
+        }
+
+        EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup();
+        try {
+            Bootstrap bootstrap = new Bootstrap();
+            bootstrap.channel(NioDatagramChannel.class);
+            bootstrap.group(nioEventLoopGroup);
+            bootstrap.option(ChannelOption.SO_BROADCAST, false);
+            bootstrap.handler(new ChannelInitializer<Channel>() {
+                @Override
+                protected void initChannel(Channel channel) throws Exception
+                {
+                    channel.pipeline().addLast(new VmsServerRequestEncoder(vmsServerConfig.getIpAddress(), vmsServerConfig.getPort()));
+                }
+            });
+
+            Channel channel = bootstrap.bind(0).sync().channel();
+            ChannelFuture f = channel.writeAndFlush(sendBuffer).sync();
+            if (!f.isDone() || !f.isSuccess()) {
+                log.error("VmsServerRequestSender.run: Send Failed. isDone: {}, isSuccess: {}", f.isDone(), f.isSuccess());
+            }
+        }
+        catch(Exception e) {
+            log.error("VmsServerRequestSender.run: Exception: {}", e.toString());
+            e.printStackTrace();
+        }
+        finally {
+            nioEventLoopGroup.shutdownGracefully();
+            log.info("VmsServerRequestSender.run: {} Bytes, ip: {}, port: {}", sendBuffer.array().length, vmsServerConfig.getIpAddress(), vmsServerConfig.getPort());
+        }
+    }
+
+    /**
+     * VMS 서버로 리셋 명령 전송
+     * @param id
+     * @param req
+     * @return
+     */
+    public boolean requestReset(Long id, VmsControlDto.VmsControlReq req) {
+        log.error("requestReset: {}, {}", id, req);
+        CENTER_VMS_REQ_RESET commMsg = new CENTER_VMS_REQ_RESET(id, req.getUserId());
+        run(commMsg.getBuffer());
+        return true;
+    }
+
+    /**
+     * VMS 서버로 전광판 On/Off 명령 전송
+     * @param id
+     * @param req
+     * @return
+     */
+    public boolean requestPowerControl(Long id, VmsControlDto.VmsControlReq req) {
+        log.error("requestPowerControl: {}, {}", id, req);
+        CENTER_VMS_REQ_POWER commMsg = new CENTER_VMS_REQ_POWER(id, req.getUserId(), (byte)(req.getValue() == 0 ? 0x00 : 0x01));
+        run(commMsg.getBuffer());
+        return true;
+    }
+
+    /**
+     * VMS 서버로 휘도제어 명령 전송
+     * @param id
+     * @param req
+     * @return
+     */
+    public boolean controlLuminance(Long id, VmsControlDto.VmsControlReq req) {
+        log.error("controlLuminance: {}, {}", id, req);
+        CENTER_VMS_REQ_LUMINANCE commMsg = new CENTER_VMS_REQ_LUMINANCE(id, req.getUserId(), (byte)req.getValue().intValue());
+        run(commMsg.getBuffer());
+        return true;
+    }
+
+    /**
+     * VMS 제어기 파라미터 설정
+     * @param id
+     * @param req
+     * @return
+     */
+    public boolean controlParam(Long id, VmsControlDto.VmsControlParamReq req) {
+        log.error("controlParam: {}, {}", id, req);
+        CENTER_VMS_REQ_PARAM commMsg = new CENTER_VMS_REQ_PARAM(id, req);
+        run(commMsg.getBuffer());
+        return true;
+    }
+}

+ 0 - 11
src/main/resources/application-dev.yml

@@ -1,14 +1,3 @@
-application:
-  vds:
-    #ip-address: 172.16.12.32
-    ip-address: 192.168.20.93
-    port: 9901
-    reconnect-time: 30
-  vms:
-    #ip-address: 172.16.12.26
-    ip-address: 192.168.20.99
-    port: 3001
-
 spring:
   resources:
     static-locations: file:src/main/resources/static/

+ 8 - 9
src/main/resources/application.yml

@@ -5,18 +5,17 @@ application:
     center-id: L08
     region-code: 228
     region-name: 용인시
+
   center-comm:
-    binding-port: 4605
-  job:
+    process-id: OPER00
+  vds-server:
+    process-id: VDS01
+  vms-server:
+    process-id: VMS01
+
+  job-schedule:
     cctv-preset: false
 
-  vds:
-    ip-address: 172.16.12.32
-    port: 9901
-    reconnect-time: 30
-  vms:
-    ip-address: 172.16.12.26
-    port: 3001
 
 server:
   port: 8999