W dobie cyfrowej transformacji i dynamicznego rozwoju Internetu Rzeczy (IoT), efektywna wymiana danych między urządzeniami staje się fundamentem nowoczesnych systemów. W gąszczu dostępnych standardów jeden wyróżnia się szczególną popularnością i wszechstronnością – jest to protokół MQTT. Choć jego korzenie sięgają końca lat 90., to właśnie teraz przeżywa on swój renesans, stając się de facto standardem w komunikacji maszynowej. W niniejszym artykule przyjrzymy się dogłębnie temu rozwiązaniu, analizując jego architekturę, mechanizmy działania oraz kluczowe zalety, które sprawiają, że specyfikacja protokołu MQTT jest tak chętnie wybierana przez integratorów systemów na całym świecie.
Czym jest MQTT i skąd się wziął?
MQTT, czyli Message Queuing Telemetry Transport, to lekki protokół transmisji danych oparty na wzorcu publikacja/subskrypcja (publish/subscribe). Został opracowany w 1999 roku przez pracowników firmy IBM (Andy’ego Stanforda-Clarka) oraz Arcom Control Systems (Arlena Nippera). Pierwotnym celem jego powstania była potrzeba monitorowania rurociągów naftowych przez łącza satelitarne o bardzo niskiej przepustowości i wysokich opóźnieniach. Projektanci potrzebowali rozwiązania, które będzie minimalizować ilość przesyłanych danych, oszczędzać energię baterii urządzeń i zapewniać niezawodność w trudnych warunkach. Dziś, po standaryzacji przez OASIS, a następnie ISO, MQTT znajduje szerokie zastosowanie nie tylko w przemyśle paliwowym, ale przede wszystkim w inteligentnych domach, systemach miejskich i fabrykach przyszłości.

Kluczową cechą odróżniającą MQTT od tradycyjnych protokołów, takich jak HTTP, jest jego architektura. Zamiast bezpośredniej komunikacji klient-serwer, gdzie klient żąda danych, a serwer odpowiada, MQTT wprowadza pośrednictwem protokołu MQTT trzeci element – brokera. To właśnie broker pełni rolę serwera pośredniczącego, co pozwala na całkowite odseparowanie nadawcy informacji od jej odbiorcy. Dzięki temu każde urządzenie w sieci może funkcjonować niezależnie, nie znając adresu IP ani stanu innych urządzeń, z którymi wymienia dane. Jest to rozwiązanie, które drastycznie upraszcza skalowanie systemów.
Architektura publish/subscribe w praktyce

Model publish subscribe (publikuj/subskrybuj) to serce działania MQTT. W tym układzie występują trzy główne podmioty: wydawca (publisher), serwer pośredniczącego (broker) oraz subskrybent (subscriber). Wydawca to klient, który wysyła (publikacja) dane na dany temat do brokera. Subskrybent to inny klient, który zgłosił chęć odbierania wiadomości powiązanych z tym konkretnym tematem. Co istotne, broker MQTT zarządza całym ruchem. Gdy do brokera trafia komunikat, jego zadaniem jest przefiltrowanie go i dystrybucja do wszystkich zainteresowanych klientów. To sprawia, że możliwa jest dwukierunkowa komunikacja oraz model „jeden do wielu”, gdzie jeden czujnik może wysłać temperaturę do bazy danych, aplikacji mobilnej i systemu alarmowego jednocześnie.
W nowoczesnych liniach produkcyjnych, gdzie integracja systemów jest kluczowa, często spotykamy się z sytuacją, w której sterownik PLC wysyła dane telemetryczne do brokera. Następnie, za jego pośrednictwem, informacje te są pobierane przez panel HMI, który wizualizuje parametry pracy maszyny dla operatora w czasie rzeczywistym. Dzięki lekkości protokołu, odświeżanie danych na ekranie operatora odbywa się błyskawicznie, nawet przy obciążonej sieci zakładowej. Takie podejście eliminuje konieczność ciągłego odpytywania sterownika przez panel (polling), co znacząco odciąża jednostkę centralną PLC i sieć komunikacyjną.
Tematy i struktura danych
Fundamentem routingu wiadomości w MQTT są tematy (topics). Temat to ciąg znaków (UTF-8) przypominający ścieżkę w systemie plików, gdzie poszczególne poziomy oddzielone są ukośnikiem (np. fabryka/hala1/maszyna5/temperatura). Taka hierarchiczna struktura pozwala na bardzo precyzyjne zarządzanie przepływem informacji. Kiedy klient chce otrzymać dane, dokonuje subskrypcji na odpowiedni temat. Co więcej, elastyczność protokołu pozwala na stosowanie symboli wieloznacznych (wildcards), co jest niezwykle potężnym narzędziem w rękach inżyniera.

Wyróżniamy dwa rodzaje takich symboli. Pierwszy to jednopoziomowy symbol wieloznaczny oznaczony znakiem +. Zastępuje on jeden poziom w hierarchii tematu. Przykładowo, subskrypcja fabryka/hala1/+/temperatura pozwoli na odbieranie danych o temperaturze ze wszystkich maszyn w hali pierwszej, ale nie z innych hal. Drugi to wielopoziomowy symbol wieloznaczny oznaczony znakiem #. Musi on znajdować się zawsze na końcu łańcucha i obejmuje wszystkie podrzędne poziomy hierarchii. Użycie go w formie fabryka/# oznacza chęć otrzymywania absolutnie wszystkich komunikatów z całej fabryki, co jest przydatne np. dla systemów archiwizacji danych (historian). Należy jednak pamiętać, by stosować te narzędzia rozważnie, aby nie przeciążyć klienta nadmiarem informacji.
Jakość usług (QoS) i niezawodność transmisji
Jednym z najważniejszych aspektów, który sprawia, że automatyzacja przemysłowa tak chętnie adoptuje MQTT, jest mechanizm Quality of Service (QoS), czyli jakość usług. Protokół ten definiuje trzy poziomy zapewnienia dostarczenia wiadomości, co pozwala inżynierom balansować między pewnością transmisji a obciążeniem łącza.
- QoS 0 (At most once): Często nazywane „fire and forget”. Wiadomość jest wysyłana raz i nie ma gwarancji jej dostarczenia ani potwierdzenia odbioru. Jeśli połączenie zostanie przerwane, dane przepadają. Stosowane przy przesyłaniu danych mniej krytycznych, np. częstych odczytów z czujników, gdzie utrata jednej próbki nie jest problemem.
- QoS 1 (At least once): Gwarantuje, że wiadomość dotrze do odbiorcy co najmniej raz. Nadawca przechowuje wiadomość do momentu otrzymania potwierdzenia (PUBACK). Może się jednak zdarzyć, że odbiorca otrzyma ten sam komunikat dwukrotnie (duplikacja).
- QoS 2 (Exactly once): Najwyższy poziom niezawodności. Gwarantuje, że wiadomość dotrze dokładnie raz. Wymaga to bardziej złożonej, czteroelementowej wymiany danych (handshake) między nadawcą a brokerem. Jest to kluczowe w systemach transakcyjnych, gdzie zduplikowanie rozkazu (np. „zwiększ licznik o 1”) prowadziłoby do błędów.
Dzięki tym mechanizmom, MQTT zapewnia wydajną komunikację nawet w niestabilnych środowiskach sieciowych. Co więcej, funkcja „Retained Messages” (wiadomości zatrzymane) pozwala brokerowi na przechowywanie ostatniej znanej wartości dla danego tematu. Gdy inne urządzenie podłączy się do sieci (np. po restarcie), natychmiast otrzyma ostatni znany stan, nie czekając na nową transmisję. Jest to funkcja szczególnie przydatna przy monitorowaniu stanów urządzeń, które rzadko zmieniają swoje parametry.
Payload i format danych

Chociaż sama specyfikacja protokołu MQTT jest precyzyjna w kwestii mechanizmu transportu, to jest ona agnostyczna względem przesyłanej treści (payload). Oznacza to, że w ciele wiadomości możemy przesłać dowolny ciąg bajtów – tekst, obraz, a nawet zaszyfrowany plik binarny. W praktyce jednak, w nowoczesnych systemach IoT, najczęściej spotykamy się z danymi w formacie JSON. Format ten jest lekki, czytelny dla człowieka i łatwy do parsowania przez większość języków programowania. Przesyłanie obiektów JSON pozwala na zawarcie w jednej wiadomości wielu atrybutów, np. wartości pomiarowej, znacznika czasu (timestamp) oraz statusu jakości sygnału.
Warto wspomnieć o ograniczeniach. Mimo że teoretyczny maksymalny rozmiar wiadomości w MQTT może wynosić aż 256 MB, w systemach embedded i IoT rzadko zbliżamy się do tej granicy. Przesyłanie tak dużych pakietów w sieciach o niskiej przepustowości mogłoby zablokować komunikację dla innych urządzeń. Dobrą praktyką jest utrzymywanie rozmiaru payloadu na jak najniższym poziomie, co sprzyja responsywności systemu. Jeśli Twoja aplikacja wymaga przesyłania dużych plików, warto rozważyć użycie MQTT jedynie do sygnalizacji (przesłanie linku), a sam transfer obsłużyć innym protokołem, przeznaczonym do dużej przepustowości, np. FTP lub HTTP. Tutaj z pomocą przychodzi wiedza naszych ekspertów z Pro-Control – pomagamy dobierać optymalne architektury komunikacyjne, które łączą zalety różnych protokołów, zapewniając wydajność i stabilność całego ekosystemu fabrycznego.
Bezpieczeństwo i uwierzytelnianie
W erze cyberzagrożeń, bezpieczeństwo systemów przemysłowych jest priorytetem. Protokół MQTT, działając na szczycie warstwy TCP/IP, dziedziczy mechanizmy bezpieczeństwa tego stosu, ale dodaje też własne. Podstawowym poziomem zabezpieczeń jest uwierzytelniania klientów przy użyciu nazwy użytkownika i hasła. Konfiguracja brokera pozwala na zdefiniowanie list kontroli dostępu (ACL), które precyzyjnie określają, jaki użytkownika ma prawo do publikowania lub subskrybowania konkretnych tematów. Zapobiega to sytuacji, w której niepowołany czujnik mógłby nadpisać krytyczne parametry sterowania.
Jednak samo hasło przesyłane otwartym tekstem to za mało. Dlatego standardem w profesjonalnych wdrożeniach jest użycie szyfrowania TLS/SSL. Zabezpiecza ono kanał transmisji przed podsłuchem i manipulacją danych w locie. Wykorzystanie certyfikatów X.509 pozwala nie tylko na szyfrowanie, ale również na weryfikację tożsamości klienta i serwera. Wdrożenie pełnego szyfrowania wiąże się z pewnym narzutem obliczeniowym, co może być wyzwaniem dla najprostszych mikrokontrolerów, jednak w kontekście ochrony infrastruktury krytycznej jest to koszt niezbędny do poniesienia. Należy pamiętać, że bezpieczny system MQTT to nie tylko konfiguracja brokera, ale całościowe podejście do polityki bezpieczeństwa sieci OT/IT.
Implementacja i narzędzia
Rozpoczęcie pracy z MQTT jest obecnie prostsze niż kiedykolwiek. Na rynku dostępnych jest wiele doskonałych implementacji serwera MQTT. Do najpopularniejszych należy Mosquitto (lekki broker open-source, idealny do testów i mniejszych wdrożeń) oraz rozwiązania komercyjne jak HiveMQ czy EMQX, oferujące klastrowanie i wysoką dostępność dla systemów enterprise. Aby nawiązać połączenia MQTT, musimy znać adres IP brokera oraz port (standardowo 1883 dla połączeń nieszyfrowanych i 8883 dla SSL).
Po stronie serwera mamy brokera, a co po stronie klienta? Tutaj z pomocą przychodzą gotowe biblioteki MQTT dostępne dla niemal każdego języka programowania – od C/C++ dla systemów wbudowanych, przez Python, Java, C#, aż po JavaScript dla aplikacji webowych (wykorzystujących MQTT over WebSockets).

Dzięki temu integracja systemów heterogenicznych staje się trywialna. Możemy mieć sterownik PLC pisany w ST, aplikację analityczną w Pythonie i dashboard w przeglądarce – wszystkie wymieniające się komunikatami MQTT przez ten sam węzeł centralny. Właśnie w takich złożonych integracjach kluczową rolę odgrywa doświadczenie. W Pro-Control specjalizujemy się w łączeniu „światów”, które teoretycznie do siebie nie pasują. Oferujemy kompleksowe wdrożenia systemów SCADA i systemów zarządzania produkcją MES opartych o nowoczesne protokoły, gwarantując, że Twoja infrastruktura będzie nie tylko nowoczesna, ale przede wszystkim stabilna i bezpieczna.
Wyzwania i dobre praktyki
Mimo że MQTT jest protokołem niezwykle odpornym i elastycznym, niewłaściwe jego użycie może prowadzić do problemów. Jednym z częstych błędów jest traktowanie MQTT jako kolejki zadań (job queue) w stylu RabbitMQ. Choć nazwa sugeruje kolejkowanie, MQTT jest zoptymalizowane pod kątem telemetrii i szybkiego dostarczania wiadomości, a nie długotrwałego przechowywania dużych ilości danych. Innym wyzwaniem jest zarządzanie tematami w dużej skali. Brak spójnej konwencji nazewnictwa (Namespace Architecture) szybko prowadzi do chaosu, w którym trudno zarządzać uprawnieniami i filtrować dane.
Warto również wspomnieć o mechanizmie „Keep Alive” i „Last Will and Testament” (LWT). Keep Alive to mechanizm, w którym klient okresowo wysyła pakiety PINGREQ, aby poinformować brokera, że połączenie jest aktywne, nawet jeśli nie są przesyłane żadne dane. Z kolei LWT to specjalna wiadomość, którą klient definiuje podczas nawiązywania połączenia. Jeśli klient utraci połączenie w sposób niekontrolowany (np. awaria zasilania), broker automatycznie opublikuje tę „ostatnią wolę” na zdefiniowanym temacie. Jest to idealne rozwiązanie do otrzymywania powiadomień o awarii urządzeń w systemie monitoringu.
Przyszłość komunikacji z MQTT
Wersja protokołu MQTT 3.1.1 jest obecnie najbardziej rozpowszechniona, ale coraz częściej spotykamy się z wersją MQTT 5.0. Wprowadza ona szereg ulepszeń, takich jak „Request/Response pattern”, kody powodów rozłączenia (Reason Codes) czy metadane w nagłówkach wiadomości (User Properties). Te zmiany czynią protokół jeszcze bardziej elastycznym i dostosowanym do wymogów nowoczesnych systemów chmurowych (Cloud Computing) oraz Edge Computing.
Podsumowując, MQTT to lekki protokół, który zrewolucjonizował sposób, w jaki urządzenia komunikują się ze sobą. Jego zdolność do pracy w sieciach o ograniczonej przepustowości, elastyczność modelu subskrypcji oraz szerokie wsparcie społeczności sprawiają, że jest to fundament Przemysłu 4.0. Niezależnie od tego, czy budujesz prosty system monitoringu temperatury, czy kompleksową platformę zarządzania produkcją, użyciu protokołu MQTT zapewni Ci skalowalność i niezawodność, której potrzebujesz. Pamiętaj, że sukces wdrożenia zależy nie tylko od technologii, ale od właściwego zaprojektowania architektury informacji – a w tym zawsze możesz liczyć na wsparcie inżynierów Pro-Control.
FAQ – Najczęściej zadawane pytania
Czy MQTT działa tylko w sieci lokalnej, czy można go używać przez Internet?
MQTT doskonale sprawdza się w obu scenariuszach. Protokół działa w oparciu o warstwę TCP/IP, więc broker może znajdować się w sieci lokalnej (LAN), w chmurze (np. AWS, Azure) lub na dedykowanym serwerze VPS. Dzięki lekkości protokołu, transmisja danych przez publiczny Internet jest wydajna, o ile zadbamy o odpowiednie zabezpieczenia, takie jak szyfrowanie TLS.
Jaka jest różnica między brokerem a klientem w MQTT?
Broker to centralny serwer (hub), który zarządza ruchem w sieci MQTT. Nie generuje on danych, a jedynie je odbiera, filtruje i przekazuje dalej. Klient to dowolne urządzenie lub aplikacja (czujnik, sterownik PLC, smartfon), które łączy się z brokerem, aby wysyłać (publikować) dane lub je odbierać (subskrybować). Z jednym brokerem mogą być połączone tysiące klientami MQTT jednocześnie.
Co się stanie z wiadomościami, jeśli klient straci połączenie z brokerem?
To zależy od konfiguracji sesji i poziomu QoS. Jeśli klient połączył się z flagą „Clean Session” ustawioną na false i subskrybował tematy z QoS 1 lub 2, broker będzie przechowywał wszystkie wiadomości, które nadeszły podczas nieobecności klienta. Po ponownym połączeniu, klient otrzyma zaległe komunikaty. W przypadku QoS 0 lub „czystej sesji”, wiadomości wysłane w czasie awarii połączenia zostaną utracone.