IoT 통신, MQTT로 해결!

by DD
3개월 전
조회수 0

HTTP의 오버헤드와 폴링 방식의 비효율성을 지적하며 경량 메시징 프로토콜 MQTT의 필요성을 강조함

MQTT는 발행/구독(Publish/Subscribe) 모델을 사용하여 센서와 대시보드 간의 효율적인 통신을 지원함

Go 언어를 사용하여 MQTT 브로커, 센서, 대시보드를 포함한 IoT 온도 모니터링 시스템을 직접 구현하는 과정을 시연함

연결 관리, 메시지 전달 보장, 상태 저장 등 MQTT의 주요 기능을 Go 코드로 구현하는 방법을 상세히 설명함

HTTP의 한계와 MQTT의 필요성

영상에서는 제한된 리소스의 IoT 장치에서 HTTP의 과도한 헤더 오버헤드요청-응답(Request-Response) 모델의 비효율성을 지적합니다. 특히, 센서 데이터 전송 시 98%에 달하는 오버헤드 비율은 네트워크 대역폭이 제한적인 환경에서 치명적이며, 지속적인 폴링(Polling)은 불필요한 트래픽과 리소스 낭비를 유발한다고 설명합니다. 이에 대한 대안으로 경량의 발행/구독(Publish/Subscribe) 메시징 프로토콜인 MQTT를 제시합니다.

MQTT 발행/구독 모델과 브로커의 역할

MQTT는 클라이언트(센서, 대시보드)가 중앙 브로커(Broker)를 통해 통신하는 발행/구독 모델을 사용합니다. 발행자는 특정 토픽(Topic)으로 메시지를 보내고, 구독자는 관심 있는 토픽을 구독하여 메시지를 수신합니다. 이 모델은 발행자와 구독자 간의 완전한 분리(Decoupling)를 제공하여, 서로의 존재를 알 필요 없이 독립적으로 통신할 수 있게 합니다. 브로커는 메시지 라우팅, 전달, 그리고 상태 관리를 담당합니다.

Go를 활용한 MQTT 브로커 구현

영상에서는 Go 언어를 사용하여 자체 MQTT 브로커를 구현하는 과정을 상세히 보여줍니다. TCP 리스너 설정, 클라이언트 연결 관리, 토픽 구독 처리, 메시지 발행 및 전달 로직을 Go의 동시성 기능(Goroutines)을 활용하여 효율적으로 구현합니다. 특히, `eclipse/paho.mqtt.golang` 라이브러리`emqx/mqtt`와 유사한 자체 구현을 통해 MQTT 프로토콜의 동작 방식을 깊이 이해할 수 있도록 합니다.

클라이언트(센서, 대시보드) 구현 및 통신

센서 측에서는 Go 프로그램이 랜덤 온도 데이터를 생성하여 지정된 토픽(`sensors/greenhouse/temperature`)으로 발행합니다. 대시보드 측 클라이언트는 동일한 토픽을 구독하여 실시간으로 온도 데이터를 수신하고 표시합니다. 이 과정에서 `paho.mqtt.golang` 라이브러리를 사용하여 클라이언트 연결, 구독 설정, 메시지 콜백 핸들링 등을 구현하며, `Connect`, `Subscribe`, `Publish`, `Disconnect`와 같은 MQTT 핵심 API 사용법을 익힐 수 있습니다.

MQTT의 QoS, Retained Messages, Last Will

영상은 MQTT의 서비스 품질(QoS) 레벨을 설명하며, QoS 0(최대 한 번), QoS 1(최소 한 번), QoS 2(정확히 한 번)의 차이와 각 레벨의 장단점을 언급합니다. 또한, Retained Messages 기능으로 브로커가 마지막 메시지를 저장하여 신규 구독자가 즉시 최신 상태를 받을 수 있게 하는 방식과, Last Will and Testament (LWT) 기능을 통해 클라이언트 비정상 종료 시 브로커가 특정 메시지를 발행하여 상태 변화를 알리는 메커니즘을 시연합니다.

비정상 종료 및 재연결 시나리오 처리

MQTT는 클라이언트의 비정상적인 연결 종료를 감지하고 처리하는 강력한 기능을 제공합니다. `Last Will` 메시지를 설정하면, 클라이언트가 예기치 않게 연결이 끊어졌을 때 브로커가 이를 감지하고 설정된 메시지를 발행합니다. 또한, `Clean Session` 플래그와 `Retained Messages`를 활용하여 클라이언트가 재연결 시에도 이전 상태를 유지하고 최신 데이터를 즉시 받을 수 있도록 구현하는 방법을 보여줍니다. 이는 IoT 장치의 안정적인 데이터 수집에 필수적입니다.

MQTT: The Protocol Behind Every Smart Device (Golang)