Autor: Ekspert IoT | Data publikacji: maj 2026
- Czym jest MQTT i dlaczego warto go stosować?
- Struktura tematów MQTT – fundament routingu
- Najlepsze praktyki projektowania tematów
- 1. Krótkie i zwięzłe tematy
- 2. Hierarchia z myślą o przyszłości
- 3. Konkretne tematy zamiast ogólnych
- 4. Konwencje nazewnicze
- Przykładowy schemat tematów w domu
- Stabilna komunikacja – QoS, Last Will i bezpieczeństwo
- QoS (Quality of Service) – poziomy gwarancji
- Last Will and Testament (LWT)
- Bezpieczeństwo
- Keep alive i sesje
- Wdrożenie krok po kroku w popularnych środowiskach
- Częste problemy i rozwiązania
W erze Internetu Rzeczy (IoT) i inteligentnych domów, protokół MQTT stał się standardem de facto w komunikacji między urządzeniami. Lekki, skalowalny i oparty na modelu publikuj–subskrybuj, doskonale sprawdza się tam, gdzie liczą się oszczędność energii i przepustowości.
Kluczem do niezawodności nie jest samo wdrożenie, lecz poprawna struktura tematów (topics) oraz stabilna konfiguracja klienta i brokera.
W tym poradniku znajdziesz najlepsze praktyki poparte wdrożeniami i dokumentacją. Dowiesz się, jak projektować hierarchię tematów, unikać pułapek, dobrać właściwy QoS oraz zadbać o bezpieczeństwo i odporność systemu.
Czym jest MQTT i dlaczego warto go stosować?
MQTT (Message Queuing Telemetry Transport) to protokół komunikacyjny zaprojektowany w 1999 roku przez Andy’ego Stanford-Clarka (IBM) i Arlena Nippera (Arcom). Działa w modelu publikuj–subskrybuj z centralnym brokerem MQTT (np. Mosquitto, EMQX, HiveMQ), który odpowiada za routing wiadomości.
Kluczowe zalety MQTT:
- lekkość – minimalny narzut protokołu, idealny dla urządzeń embedded z Wi‑Fi/Ethernet;
- skalowalność – obsługa tysięcy jednoczesnych połączeń bez pollingu (cyklicznego odpytywania);
- niezawodność – mechanizmy QoS gwarantują dostarczenie wiadomości;
- elastyczność – działa nad TCP/IP, a warianty wspierają też UDP (MQTT‑SN) i BLE; obsługuje UTF‑8.
W smart home MQTT często zastępuje cięższe protokoły HTTP/HTTPS, oszczędzając energię i pakiety. Przykłady: sterowanie oświetleniem, monitoring temperatury, integracja z Home Assistant. Schemat działania: nadawca → broker → subskrybent.
Struktura tematów MQTT – fundament routingu
Tematy (topics) to hierarchiczne ścieżki w UTF‑8, podobne do struktury katalogów. Broker filtruje wiadomości według tematu, dzięki czemu subskrybenci dostają tylko to, czego potrzebują.
Podstawowa składnia:
- poziomy oddzielone „/” – każdy segment to kolejny poziom hierarchii;
- przykład –
dom/salon/lampa/stan(status/komenda danej lampy); - ważne – tematy są czułe na wielkość liter, a ich długość może sięgać 65535 bajtów.
Błędy do uniknięcia od razu:
- nie zaczynaj od „/” – wprowadza pusty poziom (np.
/dom/salon→""/dom/salon); - unikaj „$” na początku – prefiks zarezerwowany dla tematów systemowych (np.
$SYS/broker/version); - nie używaj „#” ani „+” w tematach publikacji – to wildcardy do subskrypcji, nie do publikowania.
Wildcardy – elastyczny nasłuch
- „+” (pojedynczy poziom) – zastępuje dokładnie jeden segment, np.
dom/salon/+obejmiedom/salon/lampaidom/salon/temp; - „#” (wiele poziomów) – zastępuje zero lub więcej segmentów, np.
dom/+/temp/#obejmiedom/salon/tempidom/kuchnia/temp/wilgotnosc; - zasada – „#” może występować wyłącznie jako ostatni segment, a wildcardy są dozwolone tylko w subskrypcjach.
Przykład subskrypcji względem publikacji wygląda następująco:
Subskrypcja: dom/+/lampa/+
Publikacje:
dom/salon/lampa/stan → ON
dom/kuchnia/lampa/stan → OFF
Najlepsze praktyki projektowania tematów
Na podstawie analiz wdrożeń (m.in. z AFE Firmware i Pro‑Control) warto trzymać się poniższych zasad:
1. Krótkie i zwięzłe tematy
- minimalizuj długość – każdy bajt tematu jest przesyłany z każdą wiadomością i zajmuje pamięć urządzenia;
- źle –
inteligentny_dom_pietro_pierwsze_salon_glowna_lampa_stan_wlaczenia(przegadany, niepraktyczny); - dobrze –
dom/1/salon/lampa/stan(czytelnie i krótko, idealne dla ESP32/ESP8266).
2. Hierarchia z myślą o przyszłości
- projektuj jak drzewo – np.
lokalizacja/urządzenie/funkcja/akcjadla czytelnego routingu; - spójne nazwy segmentów – unikaj mieszania formatów i skrótów bez kontekstu;
- łatwe rozszerzanie – dodanie nowego pokoju/urządzenia nie wymaga zmian w istniejących tematach.
Przykładowa struktura dla smart home może wyglądać tak:
dom/[pokoje]/lampa/[stan|jasnosc]
dom/[pokoje]/temp/[wartosc|alarm]
dom/[pokoje]/przycisk/[click|press]
fabryka/maszyna/[id]/stan/[bity|temp]
3. Konkretne tematy zamiast ogólnych
Nie łącz wielu znaczeń w jednym temacie (np. dom/salon). Zamiast tego rozdziel dane i komendy na osobne, precyzyjne ścieżki. Oto przykłady struktur ułatwiających subskrypcje i debugowanie:
| Temat | Wartość | Zastosowanie |
|---|---|---|
dom/salon/lampa |
{"on":true} |
Sterowanie lampą |
dom/salon/temp |
23.5 |
Czujnik temperatury |
dom/salon/hum |
45% |
Wilgotność |
4. Konwencje nazewnicze
- lowercase i myślniki/podkreślniki – unikaj spacji i znaków specjalnych poza „/”, zachowuj spójność;
- retained messages – ustawiaj retain dla trwałych wartości stanu (np. ostatni stan przekaźnika);
- payload – używaj JSON dla złożonych struktur, a dla prostych metryk preferuj krótkie stringi/liczby.
Przykładowy schemat tematów w domu
Poniżej drzewo, które ułatwia logiczne grupowanie urządzeń i funkcji:
├── dom
│ ├── salon
│ │ ├── lampa/stan → ON/OFF
│ │ ├── lampa/jasnosc → 0-100
│ │ └── temp/wartosc → 22.5
│ └── kuchnia
│ ├── lodowka/drzwi → open/closed
│ └── temp/wartosc → 4.2
└── ogrod
└── sensor/deszcz → 1/0
Stabilna komunikacja – QoS, Last Will i bezpieczeństwo
QoS (Quality of Service) – poziomy gwarancji
Wybieraj poziom QoS przy publikacji/subskrypcji zgodnie z krytycznością danych:
| QoS | Opis | Zastosowanie | Wydajność |
|---|---|---|---|
| 0 | „wyślij i zapomnij” – bez potwierdzenia | Telemetria masowa, logi | Najwyższa |
| 1 | Co najmniej raz (z ACK) | Czujniki i stany ważne, ale akceptujące duplikaty | Średnia |
| 2 | Dokładnie raz (czterostopniowy handshake) | Krytyczne komendy sterujące | Najniższa |
Zalecenie: w większości wdrożeń IoT stosuj QoS 1; QoS 0 dla dużych strumieni metryk, QoS 2 wyłącznie dla najważniejszych komend.
Last Will and Testament (LWT)
Aby szybko wykrywać nieoczekiwane rozłączenia klientów, skonfiguruj LWT następująco:
- cel – broker publikuje wskazaną wiadomość, gdy klient rozłączy się bez poprawnego zamknięcia;
- przykład – temat
dom/salon/lampa/status, payloadoffline(na start:online); - parametry – dobierz QoS i retain=false dla LWT, aby uniknąć fałszywych alarmów po restarcie brokera.
Bezpieczeństwo
W środowiskach produkcyjnych zabezpiecz komunikację i dostęp do brokera:
- TLS/SSL – włącz szyfrowanie (typowo port 8883) i weryfikuj certyfikaty;
- użytkownicy i hasła – skonfiguruj uwierzytelnianie po stronie brokera;
- ACL (Access Control Lists) – ogranicz tematy do niezbędnych per urządzenie/usługę;
- unikaj brokerów publicznych – preferuj lokalnego Mosquitto/EMQX lub instancje prywatne.
Keep alive i sesje
Te ustawienia wpływają na wykrywanie awarii i trwałość subskrypcji:
- keep alive – ustaw 30–1200 s (często 60 s) dla sprawnego wykrywania rozłączeń;
- clean session – ustaw false (MQTT 3.1.1) dla trwałych subskrypcji i kolejkowania podczas reconnect;
- session expiry – w MQTT 5 dobierz session expiry interval zamiast clean session dla precyzyjnej kontroli trwałości.
Wdrożenie krok po kroku w popularnych środowiskach
1. Mosquitto (broker)
Przykładowe polecenia publikacji i subskrypcji do szybkiego testu:
mosquitto_pub -h localhost -t "dom/salon/lampa" -m "ON" -q 1
mosquitto_sub -h localhost -t "dom/salon/#"
2. ESP32/ESP8266 (Arduino IDE)
Skorzystaj z biblioteki PubSubClient i opublikuj/subskrybuj podstawowe tematy:
#include <PubSubClient.h>
client.publish("dom/salon/temp", "23.5");
client.subscribe("dom/salon/lampa");
3. Home Assistant
Konfigurując Home Assistant, pamiętaj o trzech krokach:
- discovery – włącz automatyczne wykrywanie urządzeń MQTT (MQTT Discovery);
- configuration.yaml – dodaj sekcję
mqtt:z adresem brokera i danymi logowania; - diagnostyka – sprawdź w Integrations pozycję „MQTT” i skorzystaj z narzędzi deweloperskich do podglądu tematów.
4. Codesys/PLC
Dodaj bibliotekę klienta MQTT, skonfiguruj bloki Publish/Subscribe, włącz TLS i przetestuj LWT oraz reconnect przy zaniku sieci.
Debugowanie
Do analizy ruchu i struktury tematów korzystaj z poniższych narzędzi:
- MQTT Explorer – wizualny klient do przeglądania drzewa tematów i payloadów;
- MQTT.fx – szybkie testy publikacji/subskrypcji i scenariusze;
- Wireshark/tcpdump – analiza niskopoziomowa (np. problemów z TLS lub retransmisjami).
Częste problemy i rozwiązania
Poniższa tabela zestawia typowe symptomy wraz z przyczynami i remediami:
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| Wiadomości nie docierają | Niezgodny poziom QoS lub brak subskrypcji | Uzgodnij poziomy QoS i sprawdź filtry tematów |
| Duplikaty | QoS 1 bez deduplikacji aplikacyjnej | Użyj QoS 2 lub identyfikatorów i deduplikacji po stronie aplikacji |
| Wysokie zużycie CPU | Długie tematy / zbyt wiele subskrypcji | Skróć tematy, agreguj, korzystaj z wildcardów |
| Rozłączenia | Brak lub zbyt długi keep alive | Ustaw ok. 60 s i monitoruj LWT |
Polecane zasoby
Aby pogłębić wiedzę, zajrzyj do sprawdzonych materiałów:
- Mosquitto – https://mosquitto.org;
- HiveMQ MQTT Essentials – https://www.hivemq.com/mqtt-essentials/;
- Forum Home Assistant – https://community.home-assistant.io.
Masz pytania? Daj znać w komentarzach i subskrybuj, aby nie przegapić kolejnych poradników IoT.
Artykuł oparty na standardach MQTT 5.0 i praktykach z 2026 roku.