MQTT

***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 (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***.

Sensoru bezvadu tīkliem, kas neizmanto *TCP/IP* (piemēram, *[[ZigBee]]*), izstrādāts protokols ***MQTT-SN***.

## Publicēt — parakstīties princips
*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:
* telpā — izdevējam un parakstītājam nav jāzina vienam par otru;
* laikā — izdevējam un parakstītājam nav jādarbojas vienā un tajā pašā brīdī;
* sinhronizācija — darbībai abos galos nav jāapstājas ziņojuma publicēšanas vai saņemšanas laikā.

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:
* izdevējs nosūta ziņojumu ar datiem (piemēram, temperatūras sensora mērījumu) serverim, norādot tematu (*topic*), uz kuru šis ziņojums attiecas (piemēram "Temp");
* serveris nosaka, kuri klienti ir parakstījušies uz attiecīgo tematu (šajā gadījumā "Temp");
* serveris parakstītājiem nosūtīta ziņojumu, kas bija saņemts attiecīgajā tematā ("Temp").

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.

## Pakalpojumu kvalitātes mehānisms
*MQTT* nodrošina pakalpojumu kvalitātes trīs veidus:
* *QoS 0: At most once* — "ne vairāk par vienu". Izdevējs publicē ziņojumu (`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.
* *QoS 1: At least once* — "vismaz viens". Izdevējs publicē ziņojumu (`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.
* *QoS 2: Exactly one* — "tieši viens". Parakstītājam garantēti tiek nosūtīts tieši viens ziņojums. To panāk ar ziņojumu apstiprināšanas un pabeigšanas (`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.

## Vadības paketes formāts
*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:

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:

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.

## Servera programmatūra
* *Apache ActiveMQ*
* *Apache ActiveMQ Apollo*
* *Apache ActiveMQ Artemis*
* *Bevywise MQTTRoute*
* *Emitter*
* *emqttd* jeb *EMQ* (*Erlang MQTT Broker*)
* *HBMQTT*
* *HiveMQ*
* *IBM Integration Bus*
* *IBM MessageSight*
* *IBM MQ*
* *JoramMQ*
* *Moquette*
* *Mosca*
* *Mosquitto*
* *MQTTnet*
* *RabbitMQ* ar *MQTT* spraudni
* *Solace*
* *VerneMQ*
* *Vert.x MQTT Broker*

## Atsauces

## Ārējās saites
* ''MQTT'' oficiāla vietne
* MQTT Version 3.1.1 OASIS Standard, 29 October 2014
* MQ Telemetry Transport (MQTT) V3.1 Protocol Specification IBM
* MQTT man page mosquitto