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.