Embedded

MQTT – lekki i przyjemny protokół dla komunikacji M2M

Maj 17, 2019 0
Podziel się:

IoT (Internet of Things) jest obecnie jedną z prężnie rozwijających się gałęzi przemysłu leżącą na pograniczu IT oraz elektroniki. Do najważniejszych zagadnień związanych z tą dziedziną należy M2M, czyli komunikacja urządzenie do urządzenia.

W sieci opartej o WiFi/Ethernet wykorzystywanych jest wiele różnych wyspecjalizowanych protokołów, jak SMTP, FTP, HTTP, HTTPS, które służą do obsługi poczty czy synchronizacji czasu. HTTP i HTTPS stosowane są często do wymiany informacji. Niekoniecznie do odsyłania treści HTML, aby wizualizować WWW, a np., żeby na polecenie GET odpowiedzieć odpowiednim JSONem. Takie podejście bywa stosowane w IoT. Jest jednak protokół, który okazuje się łatwiej skalowalny, lżejszy, a w efekcie wymagający mniej energii, co dla urządzeń embedded jest bardzo ważne. Chodzi właśnie o MQTT (Message Queue Telemetry Transport) opierające się o model publikacja/subskrypcja i proste wymiany informacji bez zbędnych dodatków.

Model publikacja/subskrypcja

pub sub 1 1024x641 - MQTT – lekki i przyjemny protokół dla komunikacji M2MRysunek 1. Przykładowa relacja pomiędzy klientami a brokerem w modelu publikacja/subskrypcja

Jak widać na rysunku 1. mamy tutaj do czynienia z jednym brokerem. Może być on umieszczony na którymś z urządzeń w sieci lub udostępniany na zewnątrz przez providera. Z nim komunikują się klienci; wysyłają wiadomości, nasłuchują lub to i to. Wszystko uporządkowane jest przy zastosowaniu tematów. Działa to trochę na zasadzie podobnej do forum. Klient określa, że interesuje go dany temat. W powiązaniu z nim wszyscy mogą coś czytać i/lub pisać nowe wiadomości. Tak też użył tego protokołu Facebook, wykorzystując MQTT do popularnego Messengera.

Charakterystyka MQTT

Ważną cechą MQTT jest to, że klienci nie muszą być skomunikowani ze sobą; istotna jest tylko komunikacja z brokerem. MQTT działa na warstwach od sesji do aplikacji nad TCP/IP. Istnieje także MQTT-SN przeznaczone pod UDP oraz rozwiązania Bluetooth i BLE (Bluetooth Low Energy). Aby odczytywać i publikować, potrzebne są adres brokera, tematy, które musimy sobie ustalić, oraz zwykle klucz i użytkownik. Dla publikacji dużą rolę odgrywa parametr QoS (Quality of Service); w uproszczeniu określa on, jak bardzo dbamy o dostarczenie paczki.

– QoS = 0 – Publikujemy i nie obchodzi nas, co dalej dzieje się z paczką.

– Qos = 1 – Po nadaniu klient publikujący przechowuje wiadomość aż do ACK, dając sobie tym samym możliwość do powtórnego wysłania w razie braku potwierdzenia.

– QoS = 2 – Mechanizm oparty o dwupoziomowy handshake, kiedy chcemy być pewni dostarczenia naszej paczki oraz uniknięcia wysłania jej więcej niż raz.

W przypadku tematów warto wspomnieć o jeszcze kilku możliwościach. Grupujemy je podobnie jak drzewo folderów, oddzielając kolejne poziomy zagłębienia znakiem: „/”np. „/urządzenie_1/odczytane_parametry/temperatura”. Dla ułatwienia można korzystać z dwóch znaków specjalnych:

  • „+” znajduje analogiczne zastosowanie jak w drzewie folderów „*”, nasłuchując wszystkich podtematów na danym poziomie; dla przykładu „/urządzenie_1/odczytane_parametry/+” odbierze wiadomości nadane na „/urządzenie_1/odczytane_parametry/temperatura” i „/urządzenie_1/odczytane_parametry/oświetlenie”;
  • „#” używamy, kiedy interesują nas wszystkie kolejne poziomy zagnieżdżenia, np. wykorzystanie „/urządzenie_1/#” skutkuje odczytaniem wiadomości i z „/urządzenie_1/odczytane_parametry/temperatura”, i z innych parametrów, np. „/urządzenie_1/diagnostyka”.

Praktyka – Broker

Żeby łatwiej zrozumieć całość, posłużę się odrobiną praktyki. Na początek potrzeba brokera. Ja przygotuję tutaj na PC Mosquitto (https://mosquitto.org/), który może działać też jako klient. Mamy trochę alternatyw, jak np. popularny HiveMQ (https://www.hivemq.com/).

Pod Linuxa możemy go ściągnąć komendą:­­­­­

apt-get install mosquitto

Plik instalacyjny dla Windowsa znajduje się tutaj: https://mosquitto.org/download/.

Trzeba jednak jeszcze zajrzeć do redme-windows.txt w folderze gdzie zainstalowany został Mosquitto, tam znajdziemy opis, w tym o zależność do OpenSSL, które ściągniemy tutaj: http://slproweb.com/products/Win32OpenSSL.html.

Na tym etapie da się już odpalić broker.

Mosquitto -v

1 1024x95 - MQTT – lekki i przyjemny protokół dla komunikacji M2M

Jak widać, MQTT domyślnie korzysta z portu 1883.

Praktyka – Klienci

Następnie można tworzyć klientów. Do przykładu wystarczy dwóch – jeden do subskrypcji, drugi do publikacji. Stworzę ich na tej samej maszynie, co widać po IP: 127.0.0.1, ale możemy sobie wyobrazić, że są oni po prostu w tej samej sieci.

Podaje także przykładowe biblioteki dla klientów:

Ja posłużę się tą pierwszą oraz Pythonem.

Źródło do instalacji: https://github.com/eclipse/paho.mqtt.python.

Wystarczy otworzyć ściągniętą paczkę i zainstalować

cd paho.mqtt.python
python setup.py install

Skrypt dla subskrypcji:

import paho.mqtt.client as mqtt

localhost = '127.0.0.1' 
port = 1883
timeout = 60
topic = "/test/podtest"
 
def on_connect(client, userdata, flags, rc):
  print("error = "+str(rc))
  client.subscribe(topic)
 
def on_message(client, userdata, msg):
  print("msg!")
  print(msg.payload)
 
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
 
client.connect(localhost, port, timeout)
 
client.loop_forever()

Skrypt dla publikacji:

import time
import paho.mqtt.client as mqtt

localhost = '127.0.0.1' 
port = 1883
timeout = 60
topic = "/test/podtest"
Qos = 0
message_payload = "1"

def on_connect(client, userdata, flags, rc):
  print("error = "+str(rc))

client = mqtt.Client()
client.on_connect = on_connect

client.connect(localhost, port, timeout)
client.publish(topic, message_payload, 0)

time.sleep(4)
client.disconnect()

Na początek uruchamiam subskrypcje, która cały czas nasłuchuje na dany temat. Widzimy efekt także na konsoli brokera.

2 1024x223 - MQTT – lekki i przyjemny protokół dla komunikacji M2M

Można odpalić jednorazowo wykonujący się skrypt publikacji.

3 1024x81 - MQTT – lekki i przyjemny protokół dla komunikacji M2M

Efekt jest widoczny na brokerze, a także na konsoli ze skryptem subskrybującym.

4 1024x345 - MQTT – lekki i przyjemny protokół dla komunikacji M2M

Działanie jest niezwykle proste, a ilość potrzebnego ku temu kodu jest minimalna.

Przydatne narzędzia

Moglibyśmy także zastosować przydatne narzędzie do tego protokołu, mianowicie MQTTlens (https://github.com/sandro-k/MQTTLensChromeApp). Jest to nakładka na przeglądarkę Chrome, która w łatwy sposób pozwala tworzyć klientów oraz publikować i subskrybować w bardzo przejrzystym GUI (rysunek poniżej).

5 1024x705 - MQTT – lekki i przyjemny protokół dla komunikacji M2M

Do testów użyteczny może być podstawowy provider. Jednym z nich jest CloudMQTT (https://www.cloudmqtt.com/), który posiada darmowy pakiet z ograniczeniem dziennych wiadomości, ale dla małych projektów zupełnie to wystarcza.

Podsumowanie

MQTT na dobre już zadomowiło się w komunikacji między urządzeniami i wielu producentów, np. systemów smart home jak np. popularna seria Sonoff od Itead (https://www.itead.cc/sonoff-wifi-wireless-switch.html), korzysta właśnie z tego rozwiązania. Mając na uwadze, jak proste jest rozpoczęcie pracy z tym protokołem, warto spróbować.

3.1 / 5
Kategorie: Embedded

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

Zostaw komentarz