Protokół MQTT -  Rozwój MQTT w IoT i nie tylko

W erze Internetu rzeczy (IoT) wydajna komunikacja między urządzeniami ma pierwszorzędne znaczenie. Wraz ze wzrostem liczby podłączonych urządzeń rośnie również zapotrzebowanie na lekkie, skalowalne i niezawodne protokoły, które mogą zarządzać wymianą danych. Jednym z protokołów, który zyskał na znaczeniu ze względu na swoją skuteczność w tych środowiskach, jest protokół MQTT (Message Queuing Telemetry Transport).

Pierwotnie opracowany do monitorowania rurociągów naftowych za pośrednictwem łączy satelitarnych, protokół MQTT stał się de facto standardem komunikacji IoT, umożliwiając urządzeniom komunikację przy minimalnej przepustowości i niskim zużyciu energii. Poniżej znajdziesz  kompleksowy przewodnik po korzystaniu z  protokołu MQTT, od zrozumienia jego architektury i podstawowych koncepcji po praktyczną implementację i zaawansowane funkcje.

Czym jest MQTT? Zrozumienie podstaw działania protokołu MQTT

MQTT to lekki protokół sieciowy typu publikuj-subskrybuj, który przesyła wiadomości między urządzeniami. Jest zaprojektowany tak, aby był prosty i łatwy do wdrożenia, dzięki czemu idealnie nadaje się do środowisk, w których zasoby są ograniczone, takich jak urządzenia IoT o niskiej mocy przetwarzania i ograniczonej przepustowości.

  • Model publikuj-subskrybuj: W przeciwieństwie do tradycyjnych modeli żądanie-odpowiedź,  protokół MQTT używa modelu publikuj-subskrybuj. Oznacza to, że urządzenia (klienci) mogą publikować wiadomości w temacie, a inne urządzenia mogą subskrybować ten temat, aby otrzymywać wiadomości. To oddziela nadawcę wiadomości (wydawcę) od odbiorców (subskrybentów), co prowadzi do bardziej elastycznej komunikacji.

  • Broker: Broker jest centralnym hubem w sieci MQTT. Otrzymuje wiadomości od wydawców i przekazuje je subskrybentom. Broker obsługuje cały routing i filtrowanie wiadomości na podstawie tematów.

Podstawowe komponenty protokołu MQTT

Zrozumienie podstawowych komponentów protokołu MQTT jest niezbędne do efektywnego wdrożenia protokołu:

  1. Klient: Każde urządzenie lub aplikacja, która łączy się z brokerem MQTT. Klienci mogą publikować wiadomości, subskrybować tematy lub robić jedno i drugie.

  2. Broker: Serwer zarządzający całym routingiem i dostarczaniem wiadomości. Jest odpowiedzialny za odbieranie wiadomości od wydawców i wysyłanie ich do odpowiednich subskrybentów.

  3. Temat: Ciąg, którego broker używa do filtrowania wiadomości dla każdego podłączonego klienta. Tematy są hierarchiczne, co umożliwia szczegółowe kierowanie wiadomościami.

  4. Wiadomość: Dane przesyłane między klientami. Każda wiadomość ma temat, ładunek (faktyczne dane), poziom jakości usług (QoS) i inne opcjonalne parametry.

Pierwsze kroki z protokołem MQTT: Konfigurowanie środowiska protokołu MQTT

Przed rozpoczęciem implementacji MQTT ważne jest, aby poprawnie skonfigurować środowisko. Obejmuje to wybranie odpowiedniego brokera MQTT, zainstalowanie niezbędnego oprogramowania i skonfigurowanie sieci.

Wybór brokera MQTT

Broker jest kluczową częścią każdej konfiguracji MQTT, ponieważ obsługuje cały routing wiadomości. Dostępnych jest kilku popularnych brokerów, każdy z własnymi funkcjami i korzyściami:

  1. Mosquitto: Mosquitto to broker MQTT typu open source, który jest szeroko stosowany ze względu na swoją lekkość i łatwość konfiguracji. Nadaje się zarówno do małych projektów IoT, jak i dużych wdrożeń korporacyjnych.

  2. HiveMQ: HiveMQ to komercyjny broker MQTT zaprojektowany z myślą o wysokiej dostępności i skalowalności. Jest idealny dla środowisk korporacyjnych, w których niezawodność i wydajność są krytyczne.

  3. EMQX: EMQX to kolejny broker MQTT typu open source, który koncentruje się na skalowalności i obsłudze milionów równoczesnych połączeń. Jest odpowiedni do aplikacji IoT na dużą skalę.

Instalowanie i konfigurowanie brokera MQTT

Oto jak zainstalować i skonfigurować Mosquitto, jednego z najpopularniejszych brokerów MQTT:

  1. Instalacja Mosquitto:

    • W systemie Ubuntu możesz zainstalować Mosquitto za pomocą następujących poleceń:

bash

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

sudo apt-get update

sudo apt-get install mosquitto mosquitto-clients


  • W systemie Windows instalator można pobrać z oficjalnej strony Mosquitto.

Konfigurowanie programu Mosquitto:

  • Główny plik konfiguracyjny znajduje się w /etc/mosquitto/mosquitto.conf (w systemie Linux). Możesz edytować ten plik, aby dostosować ustawienia, takie jak port, uwierzytelnianie i rejestrowanie.

  • Do podstawowego użytku domyślna konfiguracja jest zazwyczaj wystarczająca. Możesz jednak chcieć skonfigurować uwierzytelnianie i kontrolę dostępu dla dodatkowego bezpieczeństwa.

Uruchomienie brokera:

  • W systemie Linux uruchom brokera za pomocą następującego polecenia:

sudo systemctl start mosquitto


  • W systemie Windows program Mosquitto można uruchomić z menu Start lub przy użyciu wiersza poleceń.

Testowanie brokera:

  • Aby przetestować brokera, możesz użyć narzędzi wiersza poleceń mosquitto_pub i mosquitto_sub, aby publikować i subskrybować tematy. Na przykład:

mosquitto_sub -t "test/topic" -v

mosquitto_pub -t "test/topic" -m "Hello, MQTT"


 Wybór klientów MQTT

Po skonfigurowaniu brokera musisz wybrać klientów MQTT, którzy będą publikować i subskrybować tematy. Klienci MQTT są dostępni dla szerokiej gamy platform, w tym:

  1. Paho MQTT: Projekt Eclipse Paho udostępnia biblioteki klienta MQTT dla różnych języków programowania, w tym Python, Java i JavaScript.

  2. MQTT.fx: Popularne narzędzie GUI do testowania i debugowania wiadomości MQTT. Jest przydatne dla programistów, którzy chcą mieć wizualny interfejs do interakcji ze swoim brokerem MQTT.

  3. Node-RED: Narzędzie programistyczne oparte na przepływie, które obejmuje wbudowane węzły MQTT, umożliwiając szybkie tworzenie i wdrażanie aplikacji IoT.

Wdrażanie protokołu MQTT krok po kroku 

Teraz, gdy Twoje środowisko jest skonfigurowane, nadszedł czas na wdrożenie MQTT w scenariuszu z życia wziętym. Ta sekcja przeprowadzi Cię przez proces tworzenia podstawowej aplikacji MQTT, w tym publikowania wiadomości, subskrybowania tematów i zarządzania jakością usług (QoS).

 Publikowanie wiadomości

Publikowanie wiadomości jest podstawową funkcją MQTT. Oto jak możesz opublikować wiadomość za pomocą Pythona i klienta Paho MQTT:

  1. Instalowanie Paho MQTT:

    • Zainstaluj bibliotekę klienta Paho MQTT dla języka Python przy użyciu pip:

pip install paho-mqtt


2. Pisanie skryptu wydawcy:

  • Oto podstawowy skrypt Pythona umożliwiający opublikowanie wiadomości:

import paho.mqtt.client as mqtt


# Define the MQTT broker and port

broker = "localhost"

port = 1883


# Create a new MQTT client instance

client = mqtt.Client()


# Connect to the broker

client.connect(broker, port)


# Publish a message to the topic "test/topic"

client.publish("test/topic", "Hello, MQTT")


# Disconnect from the broker

client.disconnect()

3. Uruchamianie Wydawcy:

  • Uruchom skrypt z poziomu terminala lub wiersza poleceń:

python mqtt_publisher.py

  • Spowoduje to opublikowanie wiadomości „Witaj, MQTT” w temacie „test/topic” na Twoim brokerze.

B. Subskrybowanie tematów

Subskrybowanie tematów pozwala klientom MQTT otrzymywać wiadomości publikowane w tych tematach. Oto jak napisać podstawowego subskrybenta w Pythonie:

  1. Pisanie skryptu subskrybenta:

    • Oto skrypt Pythona umożliwiający subskrypcję tematu:

import paho.mqtt.client as mqtt


# Define the MQTT broker and port

broker = "localhost"

port = 1883


# Define the callback function for receiving messages

def on_message(client, userdata, message):

print(f"Received message: {message.payload.decode()} on topic {message.topic}")


# Create a new MQTT client instance

client = mqtt.Client()


# Assign the on_message callback function

client.on_message = on_message


# Connect to the broker

client.connect(broker, port)


# Subscribe to the topic "test/topic"

client.subscribe("test/topic")


# Start the loop to process incoming messages

client.loop_forever()

2. Uruchomienie Subskrybenta:

  • Uruchom skrypt:


python mqtt_subscriber.py

  • Abonent będzie drukował wszystkie wiadomości, które otrzyma w temacie „test/temat”.

Zrozumienie jakości usług (QoS)

MQTT obsługuje trzy poziomy jakości usług (QoS), które określają sposób dostarczania wiadomości pomiędzy klientami i brokerami:

  1. QoS 0: Najwyżej raz:

    • Wiadomość jest dostarczana maksymalnie raz, bez potwierdzenia odbioru. Jest to najszybszy i najskuteczniejszy poziom QoS, ale istnieje ryzyko, że wiadomości mogą zostać utracone.

    • Przykładowy przypadek użycia: dane z czujników niemające znaczenia krytycznego.

  2. QoS 1: Przynajmniej raz:

    • Wiadomość jest dostarczana co najmniej raz, z wymaganym potwierdzeniem od odbiorcy. Zapewnia to otrzymanie wiadomości, ale może skutkować duplikacją wiadomości.

    • Przykładowy przypadek użycia: dane dotyczące rozliczeń lub transakcji.

  3. QoS 2: Dokładnie raz:

    • Wiadomość jest dostarczana dokładnie raz, z kompleksowym procesem uzgadniania między nadawcą i odbiorcą. Jest to najbardziej niezawodny, ale również najwolniejszy poziom QoS.

    • Przykładowy przypadek użycia: krytyczne alerty systemowe.

  • Ustawianie QoS w Pythonie:

    • Możesz ustawić poziom QoS podczas publikowania lub subskrybowania tematu. Na przykład:

client.publish("test/topic", "Hello, MQTT", qos=1)

client.subscribe("test/topic", qos=2)

Zaawansowane funkcje MQTT -  Ulepszanie implementacji MQTT

Gdy już oswoisz się z podstawami, możesz zacząć odkrywać niektóre z bardziej zaawansowanych funkcji  jakie daje protokół MQTT. Funkcje te umożliwiają bardziej wyrafinowane i solidne implementacje.

Zachowane wiadomości w MQTT

Zachowana wiadomość w MQTT to wiadomość, która jest przechowywana przez brokera i wysyłana do wszystkich nowych subskrybentów, którzy subskrybują temat. Jest to przydatne, aby zapewnić, że nowi subskrybenci otrzymają najnowszy stan natychmiast po subskrybowaniu.

  • Publikowanie zachowanej wiadomości:

    • Możesz opublikować zachowaną wiadomość, ustawiając flagę zachowania na True:

client.publish("test/topic", "Hello, MQTT", retain=True)

  • Przypadek użycia:

    • Przechowywane wiadomości są szczególnie przydatne w sytuacjach, w których konieczne jest natychmiastowe przekazanie nowym subskrybentom informacji o aktualnym stanie urządzenia lub czujnika.

Funkcja LWT

Funkcja Last Will and Testament (LWT) w MQTT umożliwia zdefiniowanie wiadomości, która zostanie opublikowana przez brokera, jeśli klient nieoczekiwanie się rozłączy. Jest to przydatne do wykrywania i obsługi awarii klienta.

  • Konfigurowanie LWT:

    • Możesz ustawić komunikat LWT podczas tworzenia klienta MQTT:

client.will_set("test/status", "Client disconnected unexpectedly", qos=1, retain=True)


  • Przypadek użycia:

    • Technologia LWT przydaje się w sytuacjach, w których trzeba monitorować stan urządzeń i otrzymywać powiadomienia, jeśli któreś z nich przejdzie w tryb offline.

Symbole wieloznaczne tematu

Protokół MQTT obsługuje symbole wieloznaczne tematów, które umożliwiają subskrypcję wielu tematów za pomocą jednej subskrypcji. Istnieją dwa rodzaje symboli wieloznacznych:

  1. Symbol wieloznaczny jednopoziomowy (+):

    • Symbol wieloznaczny + pasuje do jednego poziomu w hierarchii tematów. Na przykład subskrypcja home/+/temperature pasowałaby zarówno do home/livingroom/temperature, jak i home/kitchen/temperature.

  2. Symbol wielopoziomowy (#):

    • Symbol wieloznaczny # pasuje do wszystkich pozostałych poziomów w hierarchii tematów. Na przykład subskrypcja home/# pasowałaby do home/livingroom/temperature, home/kitchen/humidity i innych podtematów w home/.

  • Używanie symboli wieloznacznych:

    • Symbole wieloznaczne można stosować podczas subskrybowania tematów. Na przykład:

client.subscribe("home/+/temperature")

client.subscribe("home/#")

  • Przypadek użycia:

    • Symbole wieloznaczne są szczególnie przydatne w sytuacjach, gdy masz dużą liczbę podobnych urządzeń i chcesz otrzymywać wiadomości ze wszystkich z nich w ramach jednej subskrypcji.

 Sesje trwałe

W MQTT trwała sesja pozwala brokerowi przechowywać informacje o subskrypcji klienta i niedostarczonych wiadomościach. Gdy klient ponownie się połączy, otrzyma wszystkie wiadomości, które zostały opublikowane, gdy był offline.

  • Konfigurowanie sesji trwałej:

    • Możesz utworzyć trwałą sesję, ustawiając flagę clean_session na False podczas nawiązywania połączenia:

client.connect(broker, port, clean_session=False)




  • Przypadek użycia:

    • Sesje trwałe są przydatne w sytuacjach, w których trzeba mieć pewność, że żadne wiadomości nie zostaną utracone, nawet jeśli klient tymczasowo się rozłączy.

 Łączenie brokerów MQTT

Bridging umożliwia połączenie wielu brokerów MQTT, umożliwiając udostępnianie wiadomości w różnych sieciach lub lokalizacjach. Jest to szczególnie przydatne w przypadku wdrożeń na dużą skalę, w których koniecznych jest wielu brokerów.

  • Konfigurowanie mostu:

    • Konfiguracja mostu jest zazwyczaj wykonywana w pliku konfiguracyjnym brokera. Na przykład w Mosquitto możesz dodać konfigurację mostu w następujący sposób:

connection bridge-to-remote

address remote-broker.example.com:1883

topic # both 0

  • Przypadek użycia:

    • Funkcja mostkowania przydaje się w sytuacjach, w których trzeba połączyć różne lokalizacje geograficzne lub skalować sieć MQTT w ramach wielu brokerów.

Najlepsze praktyki bezpieczeństwa dla protokołu MQTT

Mimo że protokół MQTT został zaprojektowany tak, aby był lekki, konieczne jest wdrożenie środków bezpieczeństwa w celu ochrony sieci MQTT przed nieautoryzowanym dostępem i naruszeniami danych.

 Zabezpieczenia warstwy transportowej (TLS) 

TLS to protokół zapewniający szyfrowanie i bezpieczną komunikację w sieci. Implementacja TLS w MQTT zapewnia, że ​​wszystkie dane przesyłane między klientami a brokerem są szyfrowane.

  • Włączanie protokołu TLS:

    • Aby włączyć TLS, musisz skonfigurować swojego brokera z odpowiednimi certyfikatami. Na przykład w Mosquitto:

listener 8883

cafile /etc/mosquitto/certs/ca.crt

certfile /etc/mosquitto/certs/server.crt

keyfile /etc/mosquitto/certs/server.key

  • Klienci muszą być również skonfigurowani do korzystania z protokołu TLS:

client.tls_set(ca_certs="ca.crt", certfile="client.crt", keyfile="client.key")

  • Przypadek użycia:

    • Protokół TLS ma kluczowe znaczenie w sytuacjach, w których przesyłane są poufne dane, np. w aplikacjach związanych z opieką zdrowotną lub finansami.

 Uwierzytelnianie i autoryzacja

Brokerów MQTT można skonfigurować tak, aby wymagali od klientów uwierzytelnienia przed połączeniem. Uwierzytelnianie można przeprowadzić za pomocą nazw użytkowników i haseł lub bardziej zaawansowanych metod, takich jak certyfikaty.

Konfigurowanie uwierzytelniania:

  • W programie Mosquitto możesz włączyć uwierzytelnianie za pomocą nazwy użytkownika i hasła, tworząc plik haseł:

sudo mosquitto_passwd -c /etc/mosquitto/passwd username

  • Następnie zaktualizuj plik konfiguracyjny:

allow_anonymous false

password_file /etc/mosquitto/passwd

  • Przypadek użycia:

    • Uwierzytelnianie jest konieczne w sytuacjach, w których kontrola dostępu ma kluczowe znaczenie, np. w środowiskach wielodostępnych lub podczas przetwarzania poufnych danych.

 Listy kontroli dostępu (ACL)

Listy kontroli dostępu (ACL) umożliwiają zdefiniowanie tematów, w których klient może publikować lub które może subskrybować, zapewniając szczegółową kontrolę dostępu do sieci MQTT.

  • Konfigurowanie list kontroli dostępu:

    • W programie Mosquitto możesz utworzyć plik ACL definiujący uprawnienia dla każdego użytkownika:

user client1

topic read home/temperature

topic write home/temperature


  • Zaktualizuj plik konfiguracyjny, aby użyć listy kontroli dostępu:

acl_file /etc/mosquitto/aclfile



  • Przypadek użycia:

    • Listy ACL są przydatne w sytuacjach, w których konieczne jest wprowadzenie ścisłych kontroli dostępu, np. w środowiskach korporacyjnych lub publicznych brokerach MQTT.

Przyszłość protokołu MQTT

Protokół MQTT sprawdził się jako solidny i wszechstronny protokół dla IoT i nie tylko. Jego lekka natura w połączeniu z funkcjami takimi jak QoS, trwałe sesje i elastyczne zarządzanie tematami sprawia, że ​​idealnie nadaje się do szerokiej gamy zastosowań, od inteligentnych domów po automatyzację przemysłową.

W miarę rozwoju IoT rola protokołu MQTT ma się jeszcze bardziej rozszerzyć, dzięki nowym rozwiązaniom, takim jak MQTT-SN (MQTT dla sieci czujników) i ulepszonej integracji z platformami w chmurze. Jednak, jak w przypadku każdej technologii, kluczowe jest wdrożenie najlepszych praktyk, szczególnie w zakresie bezpieczeństwa, aby zapewnić, że wdrożenia MQTT są zarówno skuteczne, jak i bezpieczne.

Opanowując korzystanie z MQTT, możesz odblokować pełny potencjał IoT i tworzyć wydajne, skalowalne i niezawodne systemy. Niezależnie od tego, czy jesteś programistą, architektem systemów czy entuzjastą IoT, zrozumienie i wykorzystanie możliwości protokołu MQTT będzie niezbędne, gdy wkraczamy w bardziej połączony świat.