Pubblicazione di messaggi MQTT e sottoscrizione di argomenti di messaggi
Il Message Queuing Telemetry Transport (MQTT) è un'architettura publish-subscribe sviluppata principalmente per collegare dispositivi con limitazioni di larghezza di banda e di potenza su reti wireless. Si tratta di un protocollo semplice e leggero che viene eseguito su socket TCP/IP, WebSocket e SSL (secure sockets layer).
MQTT è costituito da due componenti:
Broker MQTT: un broker MQTT è un punto centrale di comunicazione. Il broker è responsabile dell'invio di tutti i messaggi tra i client.
Client MQTT: un client MQTT è un qualsiasi dispositivo (ad esempio, un computer o un telefono cellulare) che si connette al broker. Un client che invia messaggi è un editore. Un client che riceve messaggi è un sottoscrittore. Per ricevere un messaggio, il client deve sottoscrivere l'argomento di quel messaggio.

Argomenti in MQTT
Un argomento è un identificatore (ID) utilizzato dal broker MQTT per identificare i client legittimi per la consegna dei messaggi. Ciascun client che desidera inviare messaggi li pubblica su un determinato argomento e ciascun client che desidera ricevere messaggi si iscrive a un determinato argomento.
Un argomento è una stringa che può essere composta da uno o più livelli di argomenti. Ciascun livello è separato da una barra obliqua (/), ad esempio home/livingroom/temperature.
Un argomento:
Deve avere almeno un carattere.
Rispetta la distinzione tra maiuscole e minuscole. Ad esempio,
home/room/temperatureehome/Room/temperaturesono due argomenti diversi.
Caratteri jolly negli argomenti di MQTT
I caratteri jolly sono caratteri speciali in un argomento utilizzati dai client per sottoscrivere più argomenti. MQTT supporta i caratteri jolly a livello singolo e a più livelli.
Carattere jolly a livello singolo: Un carattere jolly a livello singolo è rappresentato da un segno più (
+). Affinché un client riceva i messaggi, tutti i livelli dell'argomento sottoscritto, tranne quello con il segno+devono corrispondere all'argomento del messaggio in arrivo. È possibile includere più di un carattere jolly a livello singolo in una stringa di argomenti.Carattere jolly a più livelli: Un carattere jolly a più livelli è rappresentato da un segno numerico (
#). Il client riceve messaggi da tutti i sottolivelli dell'argomento sottoscritto. È possibile includere un solo carattere jolly a più livelli, che deve trovarsi alla fine della stringa dell'argomento.Carattere jolly nell'argomento Argomento sottoscritto dal client Corrisponde Non corrisponde Carattere jolly a livello singolo home/floor1/+/temperaturehome/floor1/livingroom/temperaturehome/floor1/kitchen/temperature
In questo esempio, il carattere jolly
+è sostituito dalivingroomekitchen. Tutti gli altri livelli corrispondono all'argomento sottoscritto dal client. Il client riceve i messaggi da questi argomenti.home/floor1/study/brightnesshome/floor1/livingroom/temperature/sensor2
In questo esempio, il carattere jolly
+è sostituito dastudyelivingroom. Gli altri livelli non corrispondono all'argomento sottoscritto dal client. Il client non riceve i messaggi da questi argomenti.Carattere jolly a più livelli (tutti i sottolivelli) home/floor1/#home/floor1/livingroom/humidityhome/floor1/livingroom/temperaturehome/floor1/kitchen/temperature
In questo esempio, il carattere jolly
#è sostituito dalivingroom/humidity,livingroom/temperatureekitchen/temperature. Tutti gli altri livelli corrispondono all'argomento sottoscritto dal client. Il client riceve i messaggi da questi argomenti.home/floor2/livingroom/humidityHome/floor2/kitchen/humidity
In questo esempio, il carattere jolly
#è sostituito dalivingroom/humidityekitchen/humidity. Gli altri livelli non corrispondono all'argomento sottoscritto dal client. Il client non riceve i messaggi da questi argomenti.
Nota
Evitare di utilizzare più sottoscrizioni con caratteri jolly con argomenti in conflitto in quanto potrebbero comportare la ricezioni di messaggi duplicati da parte del client.
Livelli di QoS in MQTT
La qualità del servizio (QoS) definisce l'affidabilità del processo di consegna dei messaggi in MQTT. MQTT prevede tre livelli di QoS per la consegna dei messaggi: QoS 0, QoS 1 e QoS 2. È possibile disporre di diversi livelli di QoS per la pubblicazione e la sottoscrizione dei messaggi. Il broker MQTT utilizzato potrebbe non supportare tutti e tre i livelli di QoS. Ad esempio, MQTT ThingSpeak™ supporta solo QoS 0.

QoS 0: al massimo una volta
Il livello 0 di QoS, spesso chiamato "fire and forget", è una consegna a miglior sforzo. Non vi è alcuna garanzia di consegna. Il client non conferma la ricezione del messaggio. Il broker MQTT non esegue un nuovo tentativo e cancella il messaggio localmente.

QoS 1: almeno una volta
Il livello QoS 1 garantisce che un messaggio venga consegnato almeno una volta. Il broker MQTT invia il messaggio al client almeno una volta. Il broker MQTT memorizza il messaggio finché non riceve un pacchetto di riconoscimento di pubblicazione (PUBACK) dal client. Se non viene ricevuto alcun riscontro dopo 10 secondi, il broker invia nuovamente il messaggio. In questo livello, lo stesso messaggio potrebbe essere inviato o consegnato più volte.

QoS 2: esattamente una volta
QoS 2 è il livello di servizio più alto di MQTT e garantisce che ogni messaggio venga ricevuto una sola volta dai destinatari previsti. Il livello QoS comporta un overhead supplementare (handshake a quattro fasi) ed è il più lento di tutti i livelli di servizio.
Quando un client riceve un pacchetto QoS 2 dal broker, elabora il messaggio e risponde con un pacchetto di riconoscimento di pubblicazione (PUBREC). Se il broker non riceve il pacchetto PUBREC, reinvia il pacchetto PUBLISH fino a quando non riceve una conferma. Con il riconoscimento PUBREC, il broker scarta il pacchetto PUBLISH iniziale. Quindi, il broker memorizza il pacchetto PUBREC e risponde con un pacchetto publish scartato (PUBREL).
Una volta ricevuto il pacchetto PUBREL, il client può scartare tutti gli stati memorizzati e rispondere con un pacchetto publish complete (PUBCOMP). A questo punto il broker può cancellare il pacchetto PUBREC memorizzato e l'identificatore del pacchetto è disponibile per il riutilizzo.
