Mosquitto w akcji
Ostatnia zmiana: 2016-11-03 07:31

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, choć oczywiście nic nie stoi na przeszkodzie aby napisać klienta który będzie nasłuchiwał komunikatów i zapisywał to później do bazy danych.
Na podobnej zasadzie działa demon ubus w OpenWrt. Można napisać własne procedury odbierania i wysyłania różnych danych, ale dodanie kolejnego klienta będzie zwykle wiązało się z przeróbką programu. A tak mamy gotowe, zestandaryzowane rozwiązanie.

Instalacja i uruchomienie



    # opkg update
    # opkg install mosquitto

Na czas testów warto także zainstalować klienta:


    # opkg install mosquitto-client

Plik konfiguracyjny to /etc/mosquitto/mosquitto.conf, choć skrypty startowe będą także parsowały plik /etc/config/mosquitto (jeżeli istnieje). Generalnie na początek można zostawić go takim jakim jest i po prostu uruchomić serwer:


    # /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.

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


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.