TCP/IP 소켓 통신 서버 구축: IoT 자율형 전등
TCP/IP 소켓 통신 서버 구축: IoT 자율형 전등
프로젝트 배경
우송대 제1회 전국 SW 동아리 경진대회에 참가해서 IoT 자율형 전등을 만들었다. 실내 밝기에 따라 전등 밝기를 자동으로 조절하는 시스템이고, 센서 값이 바뀌면 앱에서도 바로 보이게 만드는 게 목표였다.
구성 요소:
- NodeMCU(ESP8266): 조도 센서로 밝기 측정, 전등 제어
- Node.js 서버: 중계 역할
- Android 앱: 실시간 모니터링, 수동 제어
문제 상황
NodeMCU와 Android 앱 사이에 실시간 통신이 필요했다. 처음에는 HTTP로 구현했는데 문제가 있었다.
- 앱에서 서버로 계속 polling 해야 해서 배터리 소모가 심했다
- NodeMCU에서 상태가 바뀌어도 앱에서 바로 알 수 없었다
- 실시간성이 떨어졌다
해결책: TCP/IP 소켓 통신
HTTP 대신 TCP 소켓 통신을 구현하기로 했다. 기기/앱이 서버에 연결을 유지하고, 상태 변화가 생기면 서버가 바로 전달해주는 구조가 필요했다.
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 소켓의 차이를 확인했다
- 실시간 통신이 필요하면 소켓이 적합하다
- 상황에 맞는 통신 방식을 선택하는 게 중요하다
프로젝트: IoT 자율형 전등(우송대 제1회 전국 SW 동아리 경진대회) 관련 링크
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
