MQTT (MQ Telemetry Transport jeb Message Queuing Telemetry Transport) ir publicēt — parakstīties ziņojumapmaiņas protokols. Tas ir lietojumslāņa protokols, kas darbojas virs TCP/IP. MQTT ir kļuvis populārs mašīna mašīnai (M2M) un lietu interneta risinājumos.
MQTT protokols ir maksimāli vienkāršots, ar minimālu paketes izmēru. Tai pat laikā katram ziņojumam var norādīt, cik garantēti tas jānogādā. Tādējādi ar to var pārsūtīt datus no ierīcēm ar ierobežotu atmiņas apjomu vai zemu datu pārraides ātrumu vai nestabilu sakaru kanālu, kā arī ļauj izveidot ierīces ar zemu elektroenerģijas patēriņu.
Protokolu 1999. gadā izstrādāja IBM inženieris Endijs Stenfords-Klārks un Arcom (tagad Eurotech) inženieris Arlens Nipers.
Standarts ir atvērts. 2014. gadā standartu organizācija OASIS MQTT Version 3.1.1. publicēja kā standartu. Starptautiskā standartizācijas organizācija (ISO) un Starptautiskā elektrotehniskā komisija (IEC) šo standartu publicēja kā ISO/IEC 20922:2016.[1]
Sensoru bezvadu tīkliem, kas neizmanto TCP/IP (piemēram, ZigBee), izstrādāts protokols MQTT-SN.
MQTT publicēt — parakstīties sistēma sastāv no servera (agrākās versijā to sauca par "starpnieku" jeb "brokeri") un klientiem. Klienti var būt divu veidu: izdevēji (publisher) un parakstītāji jeb abonenti (subscriber). Klienti savā starpā parasti ir atdalīti, un atdalīšana var tikt organizēta trīs veidos:
Izdevējs un parakstītājs ziņojumus nesūta viens otram tiešā veidā. Ziņojumu saņemšanu no izdevējiem un izsūtīšanu parakstītājiem koordinē serveris. Tas nodrošina visu ziņojumu saņemšanu, filtrēšanu, nosaka klientus, kam jāsaņem ziņojumi, un pārsūta ziņojumus parakstītājiem.
MQTT ziņojumu izsūtīšanas vienkāršots darbības princips:
Katrs parakstītājs var parakstīties uz vairākiem tematiem , tādējādi saņemot datus no vairākiem izdevējiem. Tam nav jānodibina sakari ar katru izdevēju, vienīgi jāpaziņo serverim, kuri temati tam "interesē".
Ja serveri nokonfigurē par MQTT tiltu, tas var pārsūtīt ziņojumus (visus vai par noteiktiem tematiem) citam serverim. Tādējādi var panākt sistēmu apvienošanu vai mērogošanu.
MQTT nodrošina pakalpojumu kvalitātes trīs veidus:
PUBLISH
) uz servera, bet serveris to publicē parakstītājam. Izdevējs neprasa, lai ziņojums tiktu garantēti nogādāts parakstītājam. Tātad parakstītājs var saņemt ziņojumu, bet var arī nesaņemt. Šo veidu izmanto, piemēram, temperatūras mērījumu veikšanai, kur temperatūra nemainās ātri; tad viena mērījuma neesamība nav būtiska kopējos datos.PUBLISH
) uz servera, serveris saglabā šo ziņojumu un publicē parakstītājam. Tikai pēc tam, kad ziņojums tika publicēts parakstītājam, serveris izdevējam nosūta publicēšanas apstiprinājumu (PUBACK
). Ja izdevējs nav saņēmis publicēšanas apstiprinājumu, tas sūta ziņojumu atkārtoti. Tādā veidā parakstītājs saņems ziņojumu vismaz vienu reizi.PUBREC
, PUBREL
, PUBCOMP
) pakešu sūtīšanu. Šo veidu izmanto, kad ziņojumus nedrīkst pazaudēt vai dublēt, piemēram, komandas nosūtīšana izpildmehānismam.MQTT protokols darbojas, noteiktā veidā apmainoties ar vadības paketēm.
Biti paketes baitos tiek numurēti no 7 līdz 0, kur bits 7 ir visnozīmīgākais bits. Teksta lauki tiek kodēti UTF-8.
MQTT vadības paketes (Control Packet) formāts:
Biti | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
1. baits | MQTT vadības paketes tips | Katram tipam specifiskie karodziņi | ||||||
2. baits | Atlikušais garums | |||||||
3. baits | Neobligāts. Mainīga garuma galvene | |||||||
... | ||||||||
n baits | ||||||||
n+1 baits | Neobligāts. Mainīga garuma ziņojuma vērtums | |||||||
... | ||||||||
m baits |
Pirmie divi baiti ir fiksēta galvene. Tā ir visās MQTT vadības paketēs. Pirmajos četros bitos [7 — 4] tiek norādīts vadības paketes tips.
Vadības paketes tipi:
Nosaukums | Vērtība | Virziens | Paskaidrojums |
---|---|---|---|
Rezervēts | 0 | Nav atļauts | Rezervēts |
CONNECT | 1 | Klients uz serveri | Klients prasa savienojumu ar serveri |
CONNACK | 2 | Serveris uz klientu | Savienojuma apstiprinājums |
PUBLISH | 3 | Klients uz serveri vai serveris uz klientu | Publicē ziņojumu |
PUBACK | 4 | Klients uz serveri vai serveris uz klientu | Publikācijas apstiprinājums |
PUBREC | 5 | Klients uz serveri vai serveris uz klientu | Publikācija pieņemta (garantētās nosūtīšanas 1. daļa) |
PUBREL | 6 | Klients uz serveri vai serveris uz klientu | Publikācija tiek atcelta (garantētās nosūtīšanas 2. daļa) |
PUBCOMP | 7 | Klients uz serveri vai serveris uz klientu | Publicēšana pabeigta(garantētās nosūtīšanas 3. daļa) |
SUBSCRIBE | 8 | Klients uz serveri | Parakstīšanās pieprasījums |
SUBACK | 9 | Serveris uz klientu | Parakstīšanās apstiprinājums |
UNSUBSCRIBE | 10 | Klients uz serveri | Parakstīšanās anulēšanas pieprasījums |
UNSUBACK | 11 | Serveris uz klientu | Parakstīšanās anulēšanas apstiprinājums |
PINGREQ | 12 | Klients uz serveri | PING pieprasījums |
PINGRESP | 13 | Serveris uz klientu | PING atbilde |
DISCONNECT | 14 | Klients uz serveri | Klients atvienojas |
Rezervēts | 15 | Nav atļauts | Rezervēts |
Galvenes 1. baita nākamie [3 — 0] biti ir karodziņi, kas ir specifiski katram tipam. Piemēram PUBLISH
tipam 3. bits ir DUP
(publikācijas paketes dubulta nogāde); 2. un 1. bits ir QoS
(pakalpojumu kvalitāte); 0. bits ir RETAIN
(jāsaglabā ziņojums)
Fiksētās galvenes 2. baitā ir "Atlikušais garums". Tas ir baitu skaits, kas paliek esošajā paketē, ieskaitot datus mainīgā galvenē un derīgajā slodzē. Atlikušais garums neietver bitus, ko izmanto atlikušā garuma kodēšanai.
Vairāku tipu vadības paketēm bez fiksētās galvenes ir arī mainīgā galvenes daļa.
Daļai vadības pakešu ir ziņojuma vērtums.