====== MQTT protokol ====== ===== Sažetak ===== Živimo u vremenu kada nastojimo sve uređaje povezati na internet i integrirati u jednu cjelinu koju je onda lagano kontrolirati od bilo gdje na svijetu. Kako bi se to moglo postići treba međusobno povezati razne uređaje, a tu do izražaja dolazi MQTT (//Message Queue Telemetry Transport//) protokol koji je osmišljen sa idejama da bude jednostavan za implementaciju, troši malo energije i da bude izrazito efikasan. U ovom je radu detaljno objašnjen način rada protokola, a napravljen je i kratki osvrt na sigurnost ovog protokola što je bitna stavka pošto je danas toliko rasprostranjen. Keywords: **MQTT**, **Internet of Things** ===== Uvod ===== Napretkom tehnologije svijet teži tome da se svi uređaji u nečijem posjedu međusobno povežu na internet kako bi se omogućila kontrola i nadzor svih tih uređaja od bilo gdje na svijetu, to je osnovna ideja iza tzv. //Internet of Things//. Kod takvih se mreža javlja potreba za komunikacijom između uređaja koja je u pravilu bežična, a dimenzije čim manje zbog čega je svako iole kompliciranije rješenje teško izvedivo. Upravo radi takvih situacija je osmišljen MQTT (//MQ Telemetry Transport//) koji je prvotno bio namijenjen za specifični problem nadziranja naftovoda u pustinji gdje je bio potreban način prijenosa podataka koji će biti efikasan, jednostavan i koristiti čim manje električne energije. Ovaj komunikacijski protokol funkcionira na principu //Publish/Subscribe, //a zbog jednostavnosti implementacije postao je iznimno popularan pogotovo pri izradi raznih //Home Automation //sustava, a s druge strane radi tih karakteristika ga koristi i primjerice Facebook Messenger. ===== Način povezivanja ===== MQTT protokol prema OSI mrežnom modelu koristi aplikacijski sloj, prezentacijski sloj i sloj sesije, što ujedno odgovara aplikacijskom sloju prema TCP/IP modelu. Za sam prijenos podataka se tako prema modelu koristi već postojeći TCP transportni protokol. Princip rada MQTT protokola je prikazan na slici ispod.[[https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2017/01/mqtt_broker.png?w=750&ssl=1|{{https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2017/01/mqtt_broker.png?nolink&680x303}}]] Vidimo da je u sredini broker preko kojega sve poruke prolaze od izvora do odredišta. Kako protokol koristi metodu //Publish/Subscribe //tako se zapravo svaka poruka objavljuje na zadanu temu, a tu poruku onda broker šalje pretplatnicima. === Klijent === Pod ovim se pojmom u MQTT protokolu smatraju svi uređaji koji su pretplaćeni ili objavljuju u određenu temu. Uređaji koji objavljuju su u sutavima automatizacije najčešće cijeline napravljene od mikrokontrolera i neke vrste senzora koje onda šalju te podatke na određenu temu. === Broker/Server === To je centralni uređaj na koji se spajaju svi klijenti koji žele komunicirati s ostalim klijentima. Broker se ponaša poput poštanske službe koja primi neki paket te ga onda pošalje svim pretplatnicima. Primarne zadaće MQTT brokera su primanje poruka od svih klijenata koji su spojeni na broker, filtriranje tih poruka te slanje tih poruka pretplaćenim klijentima. Uz to je bitna zadaća i ovjeravanje autentičnosti o kojem će više riječi biti u sljedećim poglavljima. Broker se u principu može pokrenuti na svakom računalo sa internet vezom i dovoljno moćnim karakteristima da vrti taj program. Neki od danas često korištenih MQTT brokera su navedeni u tablici ispod uz programski jezik kojim su napisani. ^Ime brokera^Programski jezik| |Mosquitto|C| |Hive MQ|Java| |Mosca|Node.js| |Moquette|Java| Također je moguće koristiti gotove i javno dostupne MQTT brokere od kojih se informacije o nekima od njih nalaze na sljedećim web stranicama: [[http://iot.eclipse.org|Eclipse IoT]], [[http://test.mosquitto.org|Mosquitto]], [[http://broker.mqttdashboard.com|MQTT Dashboard]] ===== Osnovni koncepti ===== ==== Teme i pretplate ==== Svaka poruka unutar MQTT protokola se šalje na određenu temu. Klijenti se onda pretplaćuju na te teme i dobivaju poruke koje su objavljene u tim temama. Teme nije potrebno konfigurirati na brokeru već se one same kreiraju ako ne postoje. Teme mogu (ali ne trebaju) biti hijerarhijski organizirane pa tema može glasiti npr. **/home/livingroom/temperature**. Također se mogu koristiti i zamjenski znakovi kod pretplata kada se npr. klijent želi pretplatiti na sve teme ili na jednu razinu hijerarhije. ==== Quality of Service ==== U ovom se protokolu definiraju tri razine kvalitete usluge (//Quality of Service, //QoS) koje definiraju da li se i koliko provjerava da li će poruka biti dostavljena. Ukoliko klijent i broker imaju namještene različite QoS, komunikacija se odvija po nižoj razini od dvije. Razine i opis kako se odvija komunikacija kod koje je opisano u tablici ispod. ^QoS^Način komunikacije| |0|Poruka se šalje jednom bez potvrde| |1|Poruka se šalje barem jednom s potvrdom o privitku| |2|Poruka se šalje jednom, ali koristeći četverostruko rukovanje| ==== Čista sesija ==== Prilikom povezivanja klijent može postaviti zastavicu za čistu sesiju koja označava da se u slučaju odspajanja klijenta sve pretplate brišu. U suprotnom će prije ponovnog spajanja broker spremati sve poruke razine QoS 1 i 2 da bi one mogle biti ponovno poslane prilikom ponovnog spajanja. ==== Oporuka ==== Ova funkcija omogućava da klijent napiše poruku koja će biti objavljena (broker će objaviti) u predviđenu temu ukoliko se dogodi nenadani prekid veze. Ova mogućnost je veoma korisna jer je moguće obavijestiti korisnika o prestanku rada čvora što se zna dosta često dogoditi. ===== Struktura MQTT paketa ===== MQTT paket se u osnovi sastoji od tri dijela: * fiksno zaglavlje * varijabilno zaglavlje * sadržaj (//payload//) ==== Fiksno zaglavlje ==== Ovaj dio paketa sadržava tip paketa za čiju se identifikaciju koriste 4 bita te polje koje sadrži specifične zastavice za što se također koriste 4 bita. === Tip paketa === ^Ime^Vrijednost (dec)^Smjer^Opis| |Rezervirano|0|zabrana|rezervirano| |CONNECT|1|klijent → broker|zahtjev za spajanje| |CONNACK|2|broker → klijent|potvrda spajanja| |PUBLISH|3|dvosmjerno|objava poruke| |PUBACK|4|dvosmjerno|potvrda objave| |PUBREC|5|dvosmjerno|objavljivanje primljeno| |PUBREL|6|dvosmjerno|puštanje objave| |PUBCOMP|7|dvosmjerno|objava je kompletna| |SUBSCRIBE|8|klijent → broker|zahtjev klijenta za pretplatu| |SUBBACK|9|broker → klijent|potvrda pretplate| |UNSUBSCRIBE|10|klijent → broker|zahtjev za otkazivanje pretplate| |UNSUBACK|11|broker → klijent|potvrda za otkazivanje pretplate| | PINGREQ|12|klijent → broker|zahtjev za odaziv| |PINGRESP|13|broker → klijent|odgovor na odaziv| |DISCONNECT|14|klijent → broker|klijent prekida vezu| |Rezervirano|15|zabrana|rezervirano| ==== ==== \\ ==== Varijabilno zaglavlje ==== Nalazi se (nekad) između fiksnog zaglavlja i sadržaja. Sadrži sljedeća polja: * ime protokola * verzija protokola * //Keep Alive Timer// - definira dopušteno vrijeme između slanja i primanja MQTT paketa * povratni kod - kod poslan prilikom povezivanja * naziv teme === Specifične zastavice === * zastavica čiste sesije - broker mora pohraniti pretplate klijenta * zastavica oporuke - zastavica koja definira da je poruka objavljena od strane brokera zapravo oporuka jednog od klijenata * QoS zastavica za oporuku - navodi se da se definira način komunikacije između brokera i klijenta za oporuku * zastavica zadržavanja oporuke - definira da li broker treba zadržati poruku oporuke * zastavica za korisničko ime i lozinku - znači da su korisničko ime i lozinka uključeni u sadržaju (//Payload//) ==== Sadržaj ( Payload ) ==== Samo neki MQTT paketi sadrže sadržaj. Znamo da očito sadržaj sadrži PUBLISH tip poruke u kojem se nalazi sam sadržaj koji klijent želi objaviti u neku temu. Osim njega, sadržaj sadrži i CONNECT paket kojemu se u sadržaju mogu nalaziti: jedinstveni ID, tema oporuke, poruka oporuke, korisničko ime i lozinka. Također sadržaj ima i SUBSCRIBE poruka koja na taj način prenosi teme na koje se želi klijent pretplatiti i QoS kojim želi komunicirati sa brokerom. ===== Sigurnost ===== Što se tiče sigurnosti MQTT sam po sebi nema neku zaštitu. Kako se poruke u takvom načinu prenose kao običan tekst (čak i korisničko ime i lozinka!) veoma je lagano presresti te podatke. Takvo presretanje podataka bi se moglo izvesti //Man in the middle //napadom. Kako bi se takve situacije izbjegle preporuča se korištenje sigurnosnog TLS/SSL protokola. TLS i SSL su kriptografski protokoli koji omogućavaju sigurnu komunikaciju pomoću hash funkcija. Hash funkcija koja će se koristiti se dogovori na početku pomoću rukovanja. Takvom zaštitom se štite poruke i unatoč npr. //Man in the middle //napada podaci štite jer nitko bez ključa ne može pročitati podatke tj. sigurnost ovisi o samoj sigurnosti TLS/SSL protokola. ===== Izvori ===== [1] [[https://en.wikipedia.org/wiki/MQTT