ESP32 MQTT Broker
A standalone MQTT 3.1.1 broker that runs entirely on a $10 microcontroller. No cloud. No Pi. No Docker. Plug it in.
ESP32 MQTT Broker with W5500 Ethernet Gateway Mode
PROJECT DESCRIPTION

ESP32 MQTT Broker는 Raspberry Pi, Linux 서버, 클라우드 MQTT Broker 없이 ESP32-S3 마이크로컨트롤러 하나에서 MQTT Broker를 직접 실행하는 오픈소스 프로젝트입니다.
일반적인 IoT 시스템에서는 Mosquitto 같은 MQTT Broker를 Raspberry Pi, NAS, Linux 서버, Docker, 또는 클라우드 환경에서 실행하는 경우가 많습니다. 하지만 소규모 센서 네트워크, 스마트홈, 농업 자동화, 현장 테스트, 독립형 IoT 장비에서는 별도의 서버를 두기 부담스러운 경우가 있습니다.
이 프로젝트는 이러한 문제를 해결하기 위해 MQTT 3.1.1 Broker를 ESP32-S3 위에서 직접 구현합니다. 외부 MQTT 라이브러리를 사용하지 않고 C 언어와 lwIP BSD socket 기반으로 작성되었으며, 최대 100개 동시 클라이언트, QoS 0/1, Retained Message, Web Portal, OTA Update, Scheduled Publish, Berry Scripting, SNTPv4 Server 등을 지원합니다.
WIZnet과 연결되는 핵심 포인트는 W5500 Ethernet Gateway Mode입니다. 기본 MQTT Broker 기능은 ESP32-S3의 Wi-Fi만으로도 동작할 수 있지만, W5500이 탑재된 Waveshare ESP32-S3-ETH 보드를 사용하면 유선 LAN과 ESP32의 IoT Wi-Fi AP 서브넷을 연결하는 Ethernet Gateway Mode를 구성할 수 있습니다.
즉, 이 프로젝트는 단순히 ESP32가 MQTT Client로 동작하는 예제가 아니라, ESP32-S3가 로컬 MQTT Broker 역할을 수행하고, 필요 시 W5500 Ethernet을 통해 유선 LAN과 격리된 IoT Wi-Fi 네트워크를 연결하는 소형 IoT 인프라 프로젝트입니다.
Project Overview
ESP32 MQTT Broker는 “작은 마이크로컨트롤러 위에서 독립형 MQTT 인프라를 구현할 수 있는가?”라는 관점에서 만들어진 프로젝트입니다.
README 기준으로 이 프로젝트는 MQTT 3.1.1 Broker를 ESP32-S3에서 직접 실행하며, Raspberry Pi, 클라우드 계정, Linux 서버, Docker 없이 사용할 수 있도록 설계되었습니다. 개발자는 Raspberry Pi의 SD 카드 손상, OS 업데이트 관리, 클라우드 의존성, 전력 소모 같은 문제를 피하고, 장기간 설치 후 그대로 운영할 수 있는 로컬 MQTT Broker를 목표로 했다고 설명합니다.
이 프로젝트의 특징은 단순한 테스트 코드가 아니라 실제 운영을 고려한 기능들이 포함되어 있다는 점입니다. MQTT Broker 기능 외에도 Web Portal, OTA Update, Timer 기반 Scheduled Publish, SNTP 서버, Echo Detection, 클라이언트 모니터링, Berry Scripting 등이 포함되어 있습니다.
특히 W5500 Ethernet Gateway Mode는 이 프로젝트를 단순 무선 MQTT Broker에서 더 확장된 네트워크 장비로 만들어 줍니다. W5500을 통해 ESP32-S3는 유선 LAN에 연결되고, 동시에 ESP32의 Wi-Fi AP에 연결된 IoT 장치들을 별도 서브넷으로 운영할 수 있습니다.
How WIZnet W5500 is Used
이 프로젝트에서 WIZnet W5500은 MQTT Broker 자체의 필수 구성품이라기보다는, Ethernet Gateway Mode를 위한 유선 네트워크 인터페이스로 사용됩니다.
기본 모드에서는 ESP32-S3가 Wi-Fi를 통해 네트워크에 연결되고 MQTT Broker를 실행합니다. 그러나 CONFIG_MQTT_BROKER_ETHERNET=y 옵션을 활성화하면, ESP32는 W5500을 통해 유선 LAN에 연결되고, 자체 Wi-Fi AP 서브넷과 유선 LAN 사이를 NAPT 방식으로 브리지합니다.
프로젝트 문서에서는 이 구조를 다음과 같이 설명합니다.
유선 LAN 또는 PC가 W5500 Ethernet 쪽에 연결됩니다.
ESP32-S3는 MQTT Broker 역할을 합니다.
ESP32의 Wi-Fi AP는 192.168.25.x 대역의 IoT 장치들을 연결합니다.
NAPT를 통해 IoT Wi-Fi 서브넷과 유선 LAN 사이의 IP 레벨 접근이 가능해집니다.
MQTT Pub/Sub 통신은 Broker를 통해 처리됩니다.
이 구조를 사용하면 IoT 장치들을 메인 네트워크와 분리된 Wi-Fi AP에 연결하면서도, W5500 Ethernet을 통해 유선 LAN과 연동할 수 있습니다.
즉, W5500은 단순한 인터넷 연결용 부품이 아니라, 격리된 IoT Wi-Fi 네트워크와 유선 LAN을 연결하는 Gateway Interface 역할을 합니다.
Key Features
1. Standalone MQTT Broker on ESP32-S3
이 프로젝트의 핵심은 ESP32-S3에서 MQTT Broker를 직접 실행한다는 점입니다.
일반적인 ESP32 프로젝트는 MQTT Broker에 접속하는 Client 역할을 하는 경우가 많습니다. 반면 이 프로젝트는 ESP32-S3 자체가 Broker 역할을 수행합니다.
이를 통해 별도의 Raspberry Pi, Linux 서버, Docker, 클라우드 MQTT 서비스 없이도 로컬 MQTT 네트워크를 구성할 수 있습니다.
2. MQTT 3.1.1 Support
이 프로젝트는 MQTT 3.1.1 기능을 직접 구현합니다.
지원 기능에는 CONNECT, SUBSCRIBE, PUBLISH, PUBACK, UNSUBSCRIBE, PINGREQ, DISCONNECT 등이 포함됩니다. 또한 QoS 0과 QoS 1을 양방향으로 지원하며, Topic Wildcard인 +, #도 지원합니다.
이를 통해 일반적인 IoT 디바이스, ESPHome 장치, Tasmota 장치, Home Assistant 주변 장치 등과 연동할 수 있습니다.
3. 100 Concurrent Clients
README 기준으로 이 프로젝트는 최대 100개 MQTT Client 동시 연결을 목표로 합니다.
이를 위해 클라이언트 구조체, 수신 버퍼, 구독 테이블, QoS 1 In-flight Table, Retained Message 저장소 등을 PSRAM에 배치합니다. 문서에서는 8 MB PSRAM 환경에서 100개 클라이언트와 2,048개 구독을 처리하는 구조가 설명되어 있습니다.
소형 마이크로컨트롤러 기반 프로젝트임에도 다수의 IoT 장치를 수용할 수 있도록 설계된 점이 특징입니다.
4. Retained Messages and QoS 0/1
MQTT에서 Retained Message는 새로 접속한 클라이언트가 특정 Topic의 마지막 상태를 바로 받을 수 있게 해주는 중요한 기능입니다.
이 프로젝트는 Retained Message를 PSRAM 기반으로 저장하며, TTL과 FIFO Eviction 구조를 지원합니다. 또한 QoS 0과 QoS 1을 지원하여, 단순 센서 데이터뿐 아니라 일정 수준의 전달 보장이 필요한 메시지도 처리할 수 있습니다.
5. Tasmota-Style Web Portal
이 프로젝트는 Tasmota 스타일의 Web Portal을 제공합니다.
Web Portal에서는 다음과 같은 기능을 사용할 수 있습니다.
Broker 상태 확인
연결된 MQTT Client 목록 확인
Wi-Fi 및 AP 상태 확인
MQTT 인증 설정
Timer 설정
OTA Update
Firmware Rollback
NTP 상태 확인
Echo Detection 확인
Berry Script 관리
단순 CLI 기반 펌웨어가 아니라, 실제 운영자가 웹 UI를 통해 설정하고 관리할 수 있는 구조라는 점에서 완성도가 높습니다.
6. Scheduled Publish
이 프로젝트는 16개의 Tasmota-style Timer Slot을 제공합니다.
사용자는 특정 요일과 시간에 MQTT Topic으로 Payload를 자동 발행하도록 설정할 수 있습니다. 예를 들어 “평일 17:00에 조명을 켜라” 같은 명령을 Broker 내부에서 직접 발행할 수 있습니다.
이 기능을 사용하면 Node-RED, Home Assistant Automation, Linux Cron 같은 외부 자동화 도구 없이도 간단한 시간 기반 자동화를 구현할 수 있습니다.
7. Berry Scripting
프로젝트에는 Berry v1.1.0 VM이 내장되어 있습니다.
Berry Script를 사용하면 MQTT Topic을 Subscribe하고, 이벤트가 발생했을 때 HTTP Webhook을 호출하거나, 특정 Topic으로 메시지를 Publish하는 간단한 자동화 로직을 Broker 내부에서 실행할 수 있습니다.
이는 ESP32-S3 MQTT Broker를 단순 메시지 중계기가 아니라, 가벼운 Edge Automation 장치로 확장해 줍니다.
8. Built-in SNTPv4 Server
이 프로젝트는 SNTP Client뿐 아니라 SNTPv4 Server 기능도 제공합니다.
UDP 123 포트에서 시간 서버로 동작하고, mDNS를 통해 _ntp._udp 서비스를 광고할 수 있습니다. 격리된 IoT VLAN이나 현장 네트워크에서 별도 인터넷 시간 서버에 접근하기 어려운 경우, 이 장치가 로컬 시간 기준점 역할을 할 수 있습니다.
9. Echo Detection
Echo Detection 기능은 특정 Topic에서 비정상적으로 반복 발행되는 메시지 패턴을 감지합니다.
IoT 자동화 환경에서는 잘못된 Rule이나 Webhook 구성으로 인해 메시지가 무한 반복되는 피드백 루프가 생길 수 있습니다. 이 프로젝트는 Topic별 발행 빈도를 추적하여 이러한 문제를 감지하고, Web Dashboard에서 확인 및 Reset할 수 있게 합니다.
10. W5500 Ethernet Gateway Mode
W5500 Ethernet Gateway Mode는 이 프로젝트의 WIZnet 관련 핵심 기능입니다.
이 모드에서는 W5500을 통해 ESP32-S3가 유선 LAN에 연결되고, ESP32의 Wi-Fi AP에 연결된 IoT 장치들은 별도 서브넷에서 동작합니다. NAPT를 활성화하면 유선 LAN 쪽에서 IoT 장치의 Web UI, HTTP Endpoint, Ping, OTA 접근 등이 가능해집니다.
이를 통해 메인 네트워크와 IoT 장치 네트워크를 분리하면서도 필요한 관리 접근은 유지할 수 있습니다.
System Architecture
전체 시스템 구조는 다음과 같이 볼 수 있습니다.
ESP32-S3가 메인 MCU 역할을 수행합니다.
MQTT Broker Task가 Core 1에서 실행되며, select() loop 기반으로 MQTT Client Socket을 처리합니다.
Core 0에서는 Wi-Fi 연결, Web Portal, DNS Portal, SNTP Server 등이 실행됩니다.
PSRAM에는 MQTT Client Buffer, Subscription Table, QoS In-flight Table, Retained Message Store가 배치됩니다.
Web Portal은 HTTP 기반 설정 UI와 JSON API를 제공합니다.
W5500은 SPI Ethernet Interface로 연결되어 Ethernet Gateway Mode에서 유선 LAN 연결을 담당합니다.
ESP32 Wi-Fi AP는 IoT 장치용 별도 서브넷을 제공합니다.
NAPT를 통해 W5500 유선 LAN과 IoT Wi-Fi AP 서브넷 사이의 IP 접근을 제어합니다.
이 구조는 ESP32-S3 하나가 MQTT Broker, Web Management Portal, Time Server, Wi-Fi AP, Ethernet Gateway 역할을 동시에 수행하는 Edge IoT Infrastructure로 볼 수 있습니다.
Application Scenarios
Home Automation Hub
스마트홈 환경에서 ESPHome, Tasmota, Zigbee Bridge, 센서 노드 등은 MQTT를 통해 데이터를 주고받는 경우가 많습니다.
이 프로젝트를 사용하면 Raspberry Pi나 NAS 없이도 ESP32-S3 하나로 로컬 MQTT Broker를 구성할 수 있습니다. 간단한 스마트홈이나 테스트 환경에서는 충분히 가벼운 MQTT 인프라로 활용할 수 있습니다.
Isolated IoT Network
IoT 장치를 메인 네트워크와 분리하고 싶을 때 W5500 Ethernet Gateway Mode가 유용합니다.
IoT 장치들은 ESP32의 Wi-Fi AP에 연결하고, ESP32-S3는 W5500을 통해 유선 LAN에 연결됩니다. 이를 통해 IoT 장치들을 별도 서브넷에 두면서도 MQTT 통신과 필요한 관리 접근을 유지할 수 있습니다.
Field Testing and Trade Shows
전시회, 현장 테스트, 이동형 데모 환경에서는 Raspberry Pi나 서버를 설치하기 번거로운 경우가 많습니다.
ESP32-S3 보드 하나를 USB 배터리로 구동하면, 현장에서 바로 MQTT Broker를 실행할 수 있습니다. 센서, 조명, 릴레이, 대시보드 데모 등을 빠르게 구성할 수 있다는 점이 장점입니다.
Agriculture and Remote Monitoring
농업 환경이나 원격 모니터링 현장에서는 인터넷 연결이 항상 안정적이지 않을 수 있습니다.
이 프로젝트는 로컬 MQTT Broker로 동작할 수 있기 때문에, 센서 데이터 수집과 제어 명령을 현장 내부에서 처리할 수 있습니다. W5500 Ethernet을 사용하면 고정 설치 지점에서 더 안정적인 유선 연결을 확보할 수 있습니다.
Edge Automation Without Cloud
클라우드 MQTT Broker를 사용하면 인터넷 연결, 계정, 인증, 지연 시간, 정책 변경 등의 영향을 받을 수 있습니다.
이 프로젝트는 클라우드 없이 로컬에서 MQTT Broker와 간단한 자동화 기능을 제공하기 때문에, 장기 설치형 Edge IoT 시스템에 적합합니다.
Why This Project Matters
ESP32 MQTT Broker는 ESP32-S3가 단순 IoT Client를 넘어 로컬 MQTT 인프라 자체를 담당할 수 있음을 보여주는 프로젝트입니다.
일반적으로 MQTT Broker는 Raspberry Pi, Linux 서버, 클라우드 환경에서 운영됩니다. 하지만 이 프로젝트는 소형 MCU와 PSRAM만으로 MQTT Broker, Web Portal, SNTP Server, Timer Automation, OTA Update, Client Dashboard를 제공하며, 현장형 IoT 시스템의 복잡도를 줄일 수 있습니다.
WIZnet 관점에서 중요한 부분은 W5500 Ethernet Gateway Mode입니다. W5500은 이 프로젝트에서 유선 LAN 인터페이스 역할을 하며, ESP32의 IoT Wi-Fi AP와 외부 유선 네트워크를 연결하는 데 사용됩니다.
이는 W5500이 단순히 센서 데이터를 서버로 보내는 Ethernet 부품을 넘어, 소형 MCU 기반 Edge Gateway의 네트워크 인터페이스로 활용될 수 있음을 보여줍니다. 특히 IoT 장치를 메인 네트워크와 분리하면서도 MQTT 중심의 통신 구조를 유지하려는 환경에서 W5500의 활용 가치가 분명합니다.
WIZnet Relevance
이 프로젝트에서 WIZnet W5500은 선택적이지만 중요한 확장 기능을 담당합니다.
기본 MQTT Broker 기능은 Wi-Fi만으로도 동작하지만, W5500을 사용하면 Ethernet Gateway Mode를 통해 유선 LAN과 IoT Wi-Fi AP 서브넷을 연결할 수 있습니다. 프로젝트 문서에서는 W5500 SPI 초기화, DHCP, NAPT Bridging을 담당하는 eth_connect.h/c 구조가 명시되어 있으며, W5500 SPI 핀도 Kconfig로 설정할 수 있습니다.
따라서 이 프로젝트는 “W5500으로 MQTT Broker를 직접 구현했다”기보다는, “ESP32-S3 기반 MQTT Broker에 W5500 유선 Ethernet Gateway 기능을 추가했다”라고 설명하는 것이 정확합니다.
이 점이 오히려 WIZnet 제품의 활용성을 잘 보여줍니다. W5500은 기존 ESP32-S3 Wi-Fi 기반 IoT 시스템에 유선 LAN 연결과 네트워크 분리 기능을 추가하여, 더 안정적이고 관리 가능한 IoT 인프라를 구성할 수 있게 해줍니다.
Conclusion
ESP32 MQTT Broker는 ESP32-S3 하나로 독립형 MQTT 3.1.1 Broker를 실행하는 오픈소스 프로젝트입니다.
이 프로젝트는 최대 100개 동시 클라이언트, QoS 0/1, Retained Message, Web Portal, OTA Update, Scheduled Publish, Berry Scripting, SNTPv4 Server 등 실제 운영에 필요한 기능을 포함하고 있습니다.
WIZnet W5500은 Ethernet Gateway Mode에서 사용되며, ESP32-S3를 유선 LAN에 연결하고 IoT Wi-Fi AP 서브넷과 브리지하는 역할을 합니다. 이를 통해 격리된 IoT 네트워크, 현장형 MQTT 인프라, 스마트홈, 농업 자동화, 이동형 데모 환경에서 안정적인 유선 네트워크 확장을 제공할 수 있습니다.
ESP32 MQTT Broker는 WIZnet W5500이 소형 MCU 기반 IoT 시스템에서 단순 연결 부품을 넘어, 로컬 네트워크 인프라와 Edge Gateway를 구성하는 데 활용될 수 있음을 보여주는 좋은 사례입니다.
