shjung 2 jaren geleden
bovenliggende
commit
e7dd53f1b6

+ 2 - 2
src/main/java/com/its/op/ItsOpServerApplication.java

@@ -99,13 +99,13 @@ public class ItsOpServerApplication extends SpringBootServletInitializer impleme
             vdsServerConfig.setPort(Integer.parseInt(vdsServer.getPrgmPort().trim()));
         }
         RseServerConfig rseServerConfig = (RseServerConfig)AppUtils.getBean(RseServerConfig.class);
-        TbUnitSyst rseServer = UnitSystManager.get(vdsServerConfig.getProcessId());
+        TbUnitSyst rseServer = UnitSystManager.get(rseServerConfig.getProcessId());
         if (rseServer != null) {
             rseServerConfig.setIpAddress(rseServer.getSystIp1().trim());
             rseServerConfig.setPort(Integer.parseInt(rseServer.getPrgmPort().trim()));
         }
         CctvServerConfig cctvServerConfig = (CctvServerConfig)AppUtils.getBean(CctvServerConfig.class);
-        TbUnitSyst cctvServer = UnitSystManager.get(vdsServerConfig.getProcessId());
+        TbUnitSyst cctvServer = UnitSystManager.get(cctvServerConfig.getProcessId());
         if (cctvServer != null) {
             cctvServerConfig.setIpAddress(cctvServer.getSystIp1().trim());
             cctvServerConfig.setPort(Integer.parseInt(cctvServer.getPrgmPort().trim()));

+ 0 - 1
src/main/java/com/its/op/entity/its/rse/TbRseCtrlHs.java

@@ -75,5 +75,4 @@ public class TbRseCtrlHs implements Serializable {
         this.ctrlSeq = ctrlSeq;
     }
 
-
 }

+ 25 - 28
src/main/java/com/its/op/service/its/rse/RseControlService.java

@@ -13,8 +13,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -28,7 +26,7 @@ public class RseControlService {
     private final RseMapper mapper;
 
     public ByteBuffer getResetCommand(Long ctlrNmbr, Long ctrlSeq, Integer devcType, Integer cntlType) {
-        int length = 16;
+        int length = 8+8+4+4;
         byte opCode = CenterProtocol.INT_OP_DSRC_CONTROL_REQ;
 
         // Center packet
@@ -37,10 +35,10 @@ public class RseControlService {
         // command message packet
         ByteBuffer msgBuffer = ByteBuffer.allocate(length);
         msgBuffer.order(ByteOrder.BIG_ENDIAN);
-        msgBuffer.putLong(ctlrNmbr);
-        msgBuffer.putLong(ctrlSeq);
-        msgBuffer.putInt(devcType);
-        msgBuffer.putInt(cntlType);
+        msgBuffer.putLong(ctlrNmbr);    // 8 Byte
+        msgBuffer.putLong(ctrlSeq);     // 8 Byte
+        msgBuffer.putInt(devcType);     // 4 Byte
+        msgBuffer.putInt(cntlType);     // 4 Byte
 
         ByteBuffer cmdBuffer = ByteBuffer.allocate(center.length + length);
         cmdBuffer.order(ByteOrder.BIG_ENDIAN);
@@ -74,49 +72,48 @@ public class RseControlService {
 
         String ipAddress = this.config.getIpAddress();
         int port = this.config.getPort();
-        int connTimeout = 3000; // milli-seconds
-        int readTimeout = 2000; // milli-seconds
+        int connTimeout = 5000; // milli-seconds
+        int readTimeout = 5000; // milli-seconds
 
         Socket socket = null;
         try {
             socket = CenterProtocol.connectServer(ipAddress, port, connTimeout, readTimeout);
-            try {
-                byte[] data = cmdBuffer.array();
-                OutputStream os = socket.getOutputStream();
-                os.write(data);
-                os.flush();
-                InputStream recvStream = socket.getInputStream();
+            if (CenterProtocol.sendData(socket, cmdBuffer.array())) {
                 try {
                     while (true) {
-                        byte[] head = CenterProtocol.receiveBytes(recvStream, 10);
-                        if (head[0] == (byte)0x24 && head[1] == (byte)0x04 && head[5] == (byte)0x0C) {
-                            log.info("RECV RESPONSE HEAD: 10 Bytes. {}", SysUtils.byteArrayToHex(head));
+                        byte[] head = CenterProtocol.receiveBytes(socket, 10);
+                        log.info("RECV RESPONSE HEAD: 10 Bytes. {}", SysUtils.byteArrayToHex(head));
+                        if (head[0] == (byte)CenterProtocol.INT_ID_RSE_SERVER &&
+                            head[1] == (byte)CenterProtocol.INT_ID_RSE_OPER &&
+                            head[5] == (byte)CenterProtocol.INT_OP_DSRC_CONTROL_REQ) {
                             if (head[4] == (byte) 0xFF) {
-                                result.setResult(9, "RSE 서버에서 알수 없는 RSE 제어기 입니다.");
+                                result.setResult(9, "알수 없는 RSE 제어기 입니다.");
                             } else if (head[4] == (byte) 0xFE) {
-                                result.setResult(8, "RSE 서버에서 RSE 제어기 통신 상태가 비정상 입니다.");
+                                result.setResult(8, "RSE 제어기 통신 상태가 비정상 입니다.");
                             } else if (head[4] == (byte) 0xFD) {
-                                result.setResult(7, "제어기 제어값 오류.");
+                                result.setResult(7, "RSE 제어기 제어기 제어값 오류.");
                             } else if (head[4] == (byte) 0xFC) {
-                                result.setResult(6, "RSE 서버에서 RSE 제어기로 리셋 명령을 전송하지 못하였습니다.");
+                                result.setResult(6, "RSE 제어기로 리셋 명령을 전송하지 못하였습니다.");
                             } else {
-                                result.setResult(0, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
+                                result.setResult(0, "RSE 제어기 리셋명령을 정상적으로 전송하였습니다.");
                             }
                         } else {
-                            result.setResult(0, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
+                            result.setResult(4, "RSE 서버로 부터 비정상 데이터를 수신하였습니다.");
                         }
                         break;
                     }
                 } catch (IOException e) {
-                    // 이전 VDS 통신 서버에서는 응답을 주지 않기 때문에 타임아웃 걸린 경우 정상적으로 처리하도록 함
-                    result.setResult(0, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
+                    // 타임아웃
+                    log.error("{}", e.getMessage());
+                    result.setResult(1, "RSE 서버로 부터 응답수신시각이 초과되었습니다.(명령응답 타임아웃)");
                 }
-            } catch (IOException e) {
+            }
+            else {
                 result.setResult(3, "RSE 서버에 제어기 리셋명령을 정상적으로 전송하지 못하였습니다.");
             }
         } catch (IOException e) {
             log.error("Reset Request. {}, {}, IOException", ipAddress, port);
-            String errMsg = "[VDS 서버: " + ipAddress + "." + port + "]";
+            String errMsg = "[RSE 서버: " + ipAddress + "." + port + "]";
             result.setResult(2, "RSE 서버와 통신이 실패하였습니다.\r\n" + errMsg);
             return result;
         }

+ 9 - 16
src/main/java/com/its/op/service/its/vds/VdsControlService.java

@@ -9,8 +9,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketAddress;
@@ -175,16 +173,11 @@ public class VdsControlService {
         Socket socket = null;
         try {
             socket = CenterProtocol.connectServer(ipAddress, port, connTimeout, readTimeout);
-            try {
-                byte[] data = cmdBuffer.array();
-                OutputStream os = socket.getOutputStream();
-                os.write(data);
-                os.flush();
-                InputStream recvStream = socket.getInputStream();
+            if (CenterProtocol.sendData(socket, cmdBuffer.array())) {
                 try {
                     while (true) {
-                        byte[] head = CenterProtocol.receiveBytes(recvStream, 10);
-                        if (head[0] == (byte)0x24 && head[1] == (byte)0x04 && head[5] == (byte)0x0C) {
+                        byte[] head = CenterProtocol.receiveBytes(socket, 10);
+                        if (head[0] == (byte) 0x24 && head[1] == (byte) 0x04 && head[5] == (byte) 0x0C) {
                             log.info("RECV RESPONSE HEAD: 10 Bytes. {}", SysUtils.byteArrayToHex(head));
                             if (head[4] == (byte) 0xFF) {
                                 result.setResult(8, "VDS 서버에서 알수 없는 VDS 제어기 입니다.");
@@ -204,7 +197,8 @@ public class VdsControlService {
                     // 이전 VDS 통신 서버에서는 응답을 주지 않기 때문에 타임아웃 걸린 경우 정상적으로 처리하도록 함
                     result.setResult(0, "VDS 서버에 제어기 리셋명령을 정상적으로 전송하였습니다.");
                 }
-            } catch (IOException e) {
+            }
+            else {
                 result.setResult(3, "VDS 서버에 제어기 리셋명령을 정상적으로 전송하지 못하였습니다.");
             }
         } catch (IOException e) {
@@ -283,13 +277,12 @@ public class VdsControlService {
                     // Length: 6 7 8 9
                     // 00 00 00 00 00 16 00 00 00 00 ==> 이미지정보 수신 헤더.....+ N
                     // 24 04 01 01 00 16 00 00 00 00 ==> 이미지정보 수신후 마지막 패킷
-                    InputStream recvStream = socket.getInputStream();
 
                     // Read Frame Head
                     while (true) {
                         // 이미지 헤더를 읽을 때 까지 헤더 크기 만큼 데이터 수신
                         // 상태 정보(ACK) 등이 수신될수 있다.
-                        byte[] head = CenterProtocol.receiveBytes(recvStream, 10);
+                        byte[] head = CenterProtocol.receiveBytes(socket, 10);
                         if (head[0] == (byte)0x24 && head[1] == (byte)0x04 && head[5] == (byte)0x16) {
                             log.info("RECV RESPONSE HEAD: 10 Bytes. {}", SysUtils.byteArrayToHex(head));
                             if (head[4] == (byte)0xFF) {
@@ -304,12 +297,12 @@ public class VdsControlService {
                             log.info("RECV IMAGE HEAD  FIRST: 10 Bytes. {}", SysUtils.byteArrayToHex(head));
 
                             int imageHeaderRemainLength = 172;  // 이미지 헤더 사이즈 만큼 더 읽어야 함
-                            byte[] imageHead = CenterProtocol.receiveBytes(recvStream, imageHeaderRemainLength);
+                            byte[] imageHead = CenterProtocol.receiveBytes(socket, imageHeaderRemainLength);
                             int imageSize = SysUtils.bytesToInt(imageHead, 159, ByteOrder.BIG_ENDIAN);
                             log.info("RECV IMAGE HEAD SECOND: 172 Bytes. Image Size: {} Bytes.", imageSize);
                             if (imageSize > 0) {
                                 // 이미지 사이즈 만큼 이미지 데이터를 읽어온다.
-                                byte[] imageArr = CenterProtocol.receiveBytes(recvStream, imageSize);
+                                byte[] imageArr = CenterProtocol.receiveBytes(socket, imageSize);
                                 String imageString = Base64.getEncoder().encodeToString(imageArr);
                                 result.setImage(imageString);
                                 result.setResult(0, "VDS 서버로 부터 정지영상 이미지를 정상적으로 수신하였습니다.");
@@ -321,7 +314,7 @@ public class VdsControlService {
                             int dataSize = SysUtils.bytesToInt(head, 6, ByteOrder.BIG_ENDIAN);
                             log.info("RECV HEAD: 10 Bytes, Data {} Bytes Remain. {}", dataSize, SysUtils.byteArrayToHex(head));
                             if (dataSize > 0) {
-                                byte[] data = CenterProtocol.receiveBytes(recvStream, dataSize);
+                                byte[] data = CenterProtocol.receiveBytes(socket, dataSize);
                                 log.info("RECV DATA: {} Data Bytes. {}", dataSize, SysUtils.byteArrayToHex(data));
                             }
                         }

+ 18 - 3
src/main/java/com/its/op/service/its/xprotocol/CenterProtocol.java

@@ -1,5 +1,7 @@
 package com.its.op.service.its.xprotocol;
 
+import lombok.extern.slf4j.Slf4j;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -9,6 +11,7 @@ import java.net.SocketAddress;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
+@Slf4j
 public class CenterProtocol {
 
     public static final ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
@@ -222,9 +225,11 @@ public class CenterProtocol {
         Socket socket = null;
         try {
             socket = new Socket();
-            socket.setSoTimeout(readTimeout);                /* InputStream 에서 데이터읽을때의 timeout */
+            socket.setSoTimeout(readTimeout);            /* InputStream 에서 데이터읽을때의 timeout */
             socket.connect(socketAddress, connTimeout);  /* socket 연결 자체에대한 timeout */
         } catch (IOException e) {
+            String errMessage = e.getMessage();
+            log.error("connectServer: {}::{}, {}", ipAddress, port, errMessage);
             throw e;
         }
         return socket;
@@ -232,25 +237,32 @@ public class CenterProtocol {
 
     /**
      * 소켓 입력 버퍼로 부터 데이터 길이만큼 읽어 온다
-     * @param inStream
+     * @param socket
      * @param buffSize
      * @return
      * @throws IOException
      */
-    public static byte[] receiveBytes(InputStream inStream, int buffSize) throws IOException {
+    public static byte[] receiveBytes(Socket socket, int buffSize) throws IOException {
         byte[] buffer;
         int bytesRead = 0;
         int readThisTime;
         buffer = new byte[buffSize];
+        InputStream inStream = socket.getInputStream();
+//        log.error("receiveBytes: inStream, {}", inStream);
+//        log.error("receiveBytes: {}, Ready {} Bytes.", socket, buffSize);
         while (bytesRead < buffSize)
         {
             readThisTime = inStream.read(buffer, bytesRead, buffSize - bytesRead);
             if (readThisTime == -1)
             {
+                log.error("receiveBytes: {}, readThisTime: {}", socket, readThisTime);
                 throw new IOException("Socket.receive(): Socket closed unexpectedly");
             }
+            //log.error("receiveBytes: {} Bytes Receive.", readThisTime);
             bytesRead += readThisTime;
         }
+//        log.error("receiveBytes: {} Bytes Received.", bytesRead);
+//        log.error("receiveBytes: {}", SysUtils.byteArrayToHex(buffer));
         return buffer;
     }
 
@@ -261,11 +273,14 @@ public class CenterProtocol {
      * @return
      */
     public static boolean sendData(Socket socket, byte[] data) {
+        log.error("sendData: {}", socket);
         try {
             OutputStream os = socket.getOutputStream();
             os.write(data);
             os.flush();
         } catch (IOException e) {
+            String errMessage = e.getMessage();
+            log.error("sendData: {}, {}", socket, errMessage);
             return false;
         }
         return true;

+ 0 - 0
src/main/resources/logback-spring.xml → src/main/resources/logback-spring.xmlx


+ 7 - 7
src/main/resources/mybatis/mapper/its/rse/RseMapper.xml

@@ -20,13 +20,13 @@
             RSPS_TYPE,
             USER_ID)
         VALUES (
-                   #{obj.CTRL_SEQ},
-                   #{obj.RSE_CTLR_NMBR},
-                   #{obj.CNTL_DT},
-                   #{obj.DEVC_TYPE},
-                   #{obj.CNTL_TYPE},
-                   #{obj.RSPS_TYPE},
-                   #{obj.USER_ID}
+                   #{obj.ctrlSeq},
+                   #{obj.rseCtlrNmbr},
+                   #{obj.cntlDt},
+                   #{obj.devcType},
+                   #{obj.cntlType},
+                   #{obj.rspsType},
+                   #{obj.userId}
                )
         ]]>
     </insert>