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 라이센스를 따릅니다.