Mosquitto w akcji
Ostatnia zmiana: 2021-04-04 08:05
Broker komunikatów jest serwerem pozwalającym na wymianę wiadomości pomiędzy podłączonymi klientami. Stosowane są tu połączenia wielu-do-wielu oraz model wysyłania i odbierania wiadomości. Nie jest to protokół HTTP, opera się na zdarzeniach. Implementuje to wiele różnych urządzeń, platform i języków programowania, pozwala więc na wzajemną komunikację pomiędzy różnymi
rzeczami. Serwerów (brokerów) protokołu MQTT (Message Queuing Telemetry Transport) jest kilka, choć chyba najczęściej wykorzystywanym jest
mosquitto z racji małych wymagań sprzętowych.
Do działania potrzebny jest broker (serwer) wiadomości i klienty, które publikują lub odbierają wiadomości. Każda wiadomość ma swój
temat oraz
treść.
Treść może być dowolna (typu: "jestem", "okno otwarte", "OFF" ale także "21.3486", "13:58:43" czy zawartość pliku), natomiast
temat zwykle nie jest prostym tekstem i zawiera różne poziomy zagnieżdżenia typu "czujniki/okno/stan", "czujnik/balkon/temperatura", "serwerownia/drukarki/hp/LaserJet-XXX/stan-papieru" itd. Poziomy zagnieżdżenia umożliwiają późnej przez klientów odpowiednią subskrypcję tematów - zamiast konkretnego typu:
czujniki/balkon/temperatura mogą być odbieranie wiadomości typu
czujniki/+/temperatura czyli wszystkie temperatury wysyłane przez urządzenia lub
czujniki/# - wszystkie dane z czujników. Taka architektura pozwala na dynamiczną wymianę dowolnych komunikatów pomiędzy wieloma elementami systemu.
Konfigurację przetestowana na OpenWrt 21.02.
Instalacja i uruchomienie
W zależności od wymagań można zainstalować program ze wsparciem dla SSL lub bez. Tu zakładamy najprostszą konfigurację, więc instalujemy wersję bez wsparcia:
# opkg update
# opkg install mosquitto-nossl
Na czas testów warto także zainstalować klienta:
# opkg install mosquitto-client-nossl
Konfiguracja
Dla celów tego poradnika zostanie utworzona prosta konfiguracją dzięki której program będzie nasłuchiwał na wszystkich interfejsach na porcie 1883 (domyślnie dla mqtt), zezwalający na anonimowy dostęp do brokera (co nie oznacza że taką konfigurację powinno się stosować w środowisku "produkcyjnym"!).
Obecnie w OpenWrt istnieje możliwość konfiguracji mosquitto na dwa sposoby:
- przez właściwy dla moquitto plik konfiguracyjny
/etc/mosquitto/mosquitto.conf który jest wykorzystywany domyślnie, lub
- przez plik
/etc/config/mosquitto, zgodny składniowo z
uci stosowanym w OpenWrt, który podczas uruchomienia mosquitto przez skrypty startowe konwertowany jest na plik właściwy konfiguracyjny
To który plik zostanie wykorzystany decyduje opcja
use_uci w sekcji
owrt pliku /etc/config/mosqitto. W tym poradniku posłużymy się plikiem konfiguracyjnym właściwym dla OpenWrt. Włączamy więc możliwość wykorzystania pliku
/etc/config/mosquitto i zezwalamy na dostęp anonimowy:
# uci set mosquitto.owrt.use_uci='1'
# uci set mosquitto.mosquitto.port='1883'
# uci set mosquitto.mosquitto.allow_anonymous='1'
# uci commit mosquitto
Mosquitto umożliwia także autoryzowanie użytkowników z wykorzystaniem pary login/hasło, obsługę certyfikatów przy połączeniach (wymaga jest wtedy wersja -ssl programu), ustawienie QoS i wiele innych rzeczy. Po szczegóły odsyłam do pliku konfiguracyjnego oraz na
stronę projektu.
Uruchomienie
# /etc/init.d/mosquitto enable
# /etc/init.d/mosquitto start
Testy
Do testów będą niezbędne dwie konsole - na jednej będziemy odczytywać wiadomości, na drugiej je wysyłać. Logujemy się więc na pierwszej konsoli i wykonujemy polecenie:
# mosquitto_sub -t openwrt/test
Nasłuchujemy wszystkich wiadomości w temacie
openwrt/test. Na drugiej konsoli wykonujemy:
# mosquitto_pub -t openwrt/test -m "To zyje!"
Program zakończy działanie, ale na pierwszej konsoli powinien pojawić się odpowiedni komunikat. Możemy uruchomić dowolną liczbę procesów nasłuchujących i nadającym i wymieniać między nimi komunikaty. Do testów można używać także prostej aplikacji pod Androida o nazwie
MyMQTT lub
mqtt-spy na platformach z maszyną wirtualną Java.
Subskrybent odbiera tylko wiadomości które przyszły w czasie jego działania. Jeżeli chcemy aby dostał zaległe wiadomości to:
- jeden z klientów musi wysłać wiadomość z tzw.
qos 1:
# mosquitto_pub -t openwrt/test -m "To zyje!" -q 1
- klient odbierający musi choć raz jawnie się "zarejestrować" swoim unikalnym identyfikatorem i takie wiadomości odebrać:
# mosquitto_sub -t openwrt/test -c -i klient12342 -q 1
Uwagi końcowe
Wersja zawarta w wydaniu Barrier Breaker (mosquitto 1.3.4) nie wspiera protokołu MQTT w wersji v3.1.1, co może powodować problemy przy połączeniu niektórych klientów. Obecne wersje mosquitto wspierają protokół MQTT w wersji 3.1, 3.1.1 oraz 5.0.
Jeżeli udostępniamy serwer na zewnątrz, pamiętajmy o odblokowaniu portu 1883 na firewallu:
# uci add firewall rule
# uci set firewall.@rule[-1].name=mosqitto
# uci set firewall.@rule[-1].src=wan
# uci set firewall.@rule[-1].target=ACCEPT
# uci set firewall.@rule[-1].proto=tcp
# uci set firewall.@rule[-1].dest_port=1883
# uci commit firewall
I oczywiście pamiętajmy o zabezpieczeniu dostępu do brokera odpowiednią konfiguracją wykorzystującą auoryzację lub/i certyfikaty.
No dobrze, ale... po co to wszystko? Chociaż by po to aby wymieniać komunikaty pomiędzy różnymi sensorami
IoT czy modułami inteligentnego domu. Ale to już temat na oddzielny poradnik.