티스토리 뷰

최근 프로젝트를 진행하며 IoT(사물 인터넷)에서 보내주는 패킷을 서버로 받아 처리하는 작업을 진행하였다.

사물 인터넷과 서버의 데이터 통신을 진행하며 배운 점을 정리하려고 한다.

 

데이터 통신 과정은 다음과 같다.


장비 -> 로그인 요청 -> 서버

서버 -> 로그인 완료 응답 -> 장비 

장비 -> 데이터 전송 (1000m/s 간격) -> 서버 (반복)

서버 -> 데이터 수신 응답 -> 장비 (반복)

 


1. 소켓 연결

처음에는 장비와의 소켓 통신을 위해 서버에서 포트를 열고 대기하였다.

   try (ServerSocket serverSocket = new ServerSocket(9999)) {
            // 서버 소켓 생성
            System.out.println("서버가 9999 포트에서 대기 중...");

            // 클라이언트의 연결을 기다림
            while (true) {
                socket = serverSocket.accept();
                System.out.println("클라이언트가 연결되었습니다.");

                while (true) {
                    try {
                        ...
                    } catch (SocketException e) {
                        System.out.println(" 연결 종료 ");
                        System.out.println(" 소켓 연결 대기 중 ");
                        break;
                    }
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
			System.out.println(" 통신 종료 ");
		}
	}

 

처음에는 try-catch문으로 작성하였지만, 리펙토링 중 try-with-resource 라는 자동으로 자원을 반납해 주는 문법을 알게 되었고, 이를 적용하였다. 

 


2. 소켓 통신

 

accept를 통해 장비와 서버의 연결이 완료되면 inputstream의 read를 통해 장비로부터 데이터를 byte 배열로 받아오고,

outputstream을 통해 데이터를 장비로 보내주었다. 

                        // 클라이언트로부터 데이터를 읽기 위한 InputStream 생성
                        inputStream = socket.getInputStream();
                        // 클라이언트로부터 데이터를 전송하기 위한 OutputStream 생성
                        outputStream = socket.getOutputStream();

                        // 클라이언트로부터 데이터를 읽어오기
                        byte[] test = new byte[1600];

                        int length = inputStream.read(test);

                        if (length > 1000) {
                            processMessage(test);
                        }

                        // 두번째 패킷 응답
                        if (!isFirstPacket) {
                            outputStream.write(SECOND_RESPONSE);
                            outputStream.flush();
                            continue;
                        }

                        // 프로토콜 첫번째 패킷 응답 코드
                        outputStream.write(FIRST_RESPONSE);
                        outputStream.flush();

                        System.out.println("응답 데이터를 클라이언트에 전송했습니다.");

                        isFirstPacket = false;

 

첫 통신에서는 FIRST_RESPONSE로 로그인 성공 응답을 장비로 전송하고,

두 번째 통신부터는 SECOND_RESPONSE로 지속적인 Payload 데이터를 요청하였다.


3. 프로토콜 구조 해석

프로토콜 정의서에 작성된 프로토콜 구조

위 사진과 같이 프로토콜 정의서의 패킷에 대한 정보를 PDF로 전송받았다.

IoT는 데이터를 16진수로 전송하였고, byte [] 배열로 데이터를 전송해 주기 때문에 패킷 구조를 보고 데이터 위치별로 데이터를 변환하였다.

	public static void processMessage(byte[] receivedData ) throws IOException {
    
                // 1. length
		int length = readIntFromBytes(receivedData, 0);
		System.out.println("Length: " + length);

		// 2. OP Code
		int opCode = readIntFromBytes(receivedData, 4);
		System.out.println("OP Code: " + opCode);
		printOpCode(opCode);

		// 3. Request ID
		long requestId = readLongFromBytes(receivedData, 8);
		System.out.println("Request ID: " + requestId);

		// 4. Device ID
		String deviceId = readStringFromBytes(receivedData, 16, 16);
		System.out.println("Device ID: " + deviceId);
    }

 


4. 메인서버 API호출

 

패킷 데이터를 객체로 변환하였고, 이를 메인서버 API를 호출하여 JSON형식으로 데이터를 전송하였다.

private static void urlConnection(String data) throws IOException {
		String apiUrl = "API 주소";

		short battery = 0;

		URL url = new URL(apiUrl);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-Type", "application/json");
		conn.setDoOutput(true);

		JsonObject jsonObject = new JsonObject();
		jsonObject.addProperty("data",data);

		OutputStream os = conn.getOutputStream();
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
		writer.write(jsonObject.toString());
		writer.flush();
		writer.close();
		os.close();

		conn.getContent();

	}

 


 

처음으로 소켓통신, IoT 통신을 진행해보았다.

 

배운점 

1. 소켓통신

2. IoT의 통신방법 및 프로토콜 구조 분석

3. Try-with-resources

4. byte 데이터 변환 및 TCP/IP 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함