포스트

TCP/IP 소켓 통신 서버 구축: IoT 자율형 전등

TCP/IP 소켓 통신 서버 구축: IoT 자율형 전등

프로젝트 배경

우송대 제1회 전국 SW 동아리 경진대회에 참가해서 IoT 자율형 전등을 만들었다. 실내 밝기에 따라 전등 밝기를 자동으로 조절해서 에너지를 절약하는 시스템이었다.

구성 요소:

  • NodeMCU (ESP8266): 조도 센서로 밝기 측정, 전등 제어
  • Node.js 서버: 중계 역할
  • Android 앱: 실시간 모니터링, 수동 제어

문제 상황

NodeMCU와 Android 앱 사이에 실시간 통신이 필요했다. 처음에는 HTTP로 구현했는데 문제가 있었다.

  • 앱에서 서버로 계속 polling 해야 해서 배터리 소모가 심했다
  • NodeMCU에서 상태가 바뀌어도 앱에서 바로 알 수 없었다
  • 실시간성이 떨어졌다

해결책: TCP/IP 소켓 통신

HTTP 대신 TCP 소켓 통신을 구현하기로 했다.

[이미지 필요] IoT 시스템 구성도 (NodeMCU - Server - Android App 연결 흐름)

Node.js 서버 (net 모듈)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const net = require('net');

const clients = [];

const server = net.createServer((socket) => {
    clients.push(socket);
    
    socket.on('data', (data) => {
        // 받은 데이터를 다른 클라이언트들에게 브로드캐스트
        clients.forEach(client => {
            if (client !== socket) {
                client.write(data);
            }
        });
    });
    
    socket.on('close', () => {
        const index = clients.indexOf(socket);
        clients.splice(index, 1);
    });
});

server.listen(3000);

NodeMCU와 Android 앱 모두 이 서버에 TCP 연결을 맺고, 서버가 메시지를 중계해주는 구조다.


결과

  • 조도 센서 값이 바뀌면 즉시 앱에 반영됐다
  • 앱에서 수동으로 전등을 제어하면 NodeMCU에 실시간으로 전달됐다
  • HTTP polling 대비 배터리 소모가 줄었다

배운 점

  • HTTP와 TCP 소켓의 차이를 체감했다
  • 실시간 통신이 필요하면 소켓이 적합하다
  • 상황에 맞는 통신 방식을 선택하는 게 중요하다

우송대학교 제1회 전국 SW 동아리 경진대회 단정상(2등, 총장상) 수상작 개발 중 경험한 내용 정리.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.