Wyślij zapytanie Dołącz do Sii

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 JSON-em. 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 M2MRyc 1. Przykładowa relacja pomiędzy klientami a brokerem w modelu publikacja/subskrypcja

Jak widać na powyższej grafice 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 wykonują obie te czynności. 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ę przykładem. Na początek potrzeba brokera. Ja przygotuję tutaj na PC Mosquitto, który może działać też jako klient. Mamy także trochę alternatyw jak np. popularny HiveMQ.

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

apt-get install mosquitto

Plik instalacyjny dla Windowsa jest również dostępny.

Trzeba jednak jeszcze zajrzeć do redme-windows.txt w folderze, w którym zainstalowany został Mosquitto. Tam znajdziemy opis, w tym o zależność do OpenSSL.

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 można zauważyć po IP: 127.0.0.1, ale możemy sobie wyobrazić, że są oni po prostu w tej samej sieci.

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

  • Paho MQTT – dla języków C, C++, Python, Java, JS, Go,
  • M2Mqtt – dla C#. (Nuget w Visual Studio),
  • Adafruit IO – dla Ruby on Rails, Node.JS.

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

Źródło do instalacji znajdziesz tutaj.

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ątku uruchamiam subskrypcję, 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. 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, 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 tj. popularna seria Sonoff od Itead, 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ć.

***

Jeśli interesują Cię zagadnienia związane z Embedded, zachęcamy do lektury artykułów naszych ekspertów np. Practical use of cryptography on the example of instant messaging application, Branchless programming czyli programowanie „bezgałęziowe”, TinyML: Uczenie maszynowe w systemach wbudowanych oraz Maszyny wirtualne – interpretery.

Ocena:
Autor

Twój adres e-mail nie zostanie opublikowany.

Może Cię również zainteresować

Pokaż więcej postów

Bądź na bieżąco

Zapisz się do naszego newslettera i otrzymuj najświeższe informacje ze świata Sii.

Otrzymaj ofertę

Jeśli chcesz dowiedzieć się więcej na temat oferty Sii, skontaktuj się z nami.

Wyślij zapytanie Wyślij zapytanie

Get an offer

Natalia Competency Center Director

Dołącz do Sii

Znajdź idealną pracę – zapoznaj się z naszą ofertą rekrutacyjną i aplikuj.

APLIKUJ APLIKUJ

Join Sii

Paweł Process Owner

ZATWIERDŹ

This content is available only in one language version.
You will be redirected to home page.

Are you sure you want to leave this page?