Menu

MQTT – Capitolo 2

20 Luglio 2021
Nessun Commento
mqtt capitolo 2

Le funzionalità base dell’MQTT (Connect, Publish, Subscribe)

L’MQTT è un protocollo di messaggistica pensato per un utilizzo con dispositivi a bassa larghezza di banda. La sua semplice e leggera natura rende il suo utilizzo perfetto nelle implementazioni di automazione industriale e IoT (Internet of Things). Un uso efficacie dell’MQTT richiede una comprensione di alcuni termini base e di come interagiscono all’interno del protocollo per inviare e ricevere i messaggi che possono controllare il funzionamento dei dispositivi automatizzati in rete.

Clients e Brokers

La maggioranza di protocolli di messaggistica tradizionale segue un’architettura client-server dove un client comunica direttamente con un end-point. Questa metodologia può essere un fattore limitante che non riesce ad affrontare adeguatamente i requisiti di un’infrastruttura di automazione industriale dinamica. L’MQTT offre una strategia di comunicazione innovativa che permette maggiore flessibilità attraverso l’uso di clients e brokers utilizzando la struttura publish e subscribe (pub/sub) per scambiare informazioni.

Il modello pub/sub disaccoppia il mittente e i destinatari di un messaggio che non sono mai in diretto contatto l’uno con l’altro. I broker sono responsabili del filtraggio e della direzione dei messaggi pubblicati ai sottoscritti appropriati. Diamo un’occhiata più da vicino a clients e brokers e ai loro ruoli in un’implementazione MQTT.

Clients

Un client MQTT può essere definito come qualsiasi dispositivo che esegue una libreria MQTT che si connette a un broker MQTT tramite rete basata su TCP/IP. I dispositivi che pubblicano e sottoscrivono messaggi sono entrambi considerati client. La differenza è che un publisher sta generando e pubblicando messaggi, mentre uno subscriber li sta ricevendo. Un singolo client può essere sia publisher che subscriber.

I clients possono variare di dimensioni, da piccoli dispositivi con risorse limitate a computer che eseguono client MQTT per i test. Il lato client del protocollo MQTT è facile da implementare ed è leggero, il che lo rende ideale per dispositivi basati su microcontrollore. Le librerie client MQTT sono disponibili in molti linguaggi di programmazione per semplificare ulteriormente l’implementazione.

Brokers

Il broker in un’implementazione MQTT è responsabile di assicurare che i messaggi vengano inviati ai client corretti. Il broker è un server che riceve tutti i messaggi, esegue il filtraggio attraverso il quale determina i client che sono iscritti a un particolare messaggio e invia le informazioni a quel client. Milioni di clients possono essere connessi simultaneamente ad un broker.

Un broker MQTT esegue anche altre funzioni, come ad esempio conservare i dati per i clients che hanno sessioni permanente. È anche responsabile dell’autenticazione e autorizzazione dei clients nel sistema. Alcune caratteristiche importanti di un broker sono scalabilità, monitoraggio semplice, resistenza ai guasti e l’abilità di essere integrato a sistemi backend. L’integrazione è un fattore chiave, poichè il broker solitamente è accessibile direttamente da Internet e ha bisogno di avere la capacità di gestire potenzialmente molti clients.

Collegamento ad un broker

I clients non si collegano mai direttamente. Le connessioni MQTT avvengono tra un singolo client e il broker. Un client invia un messaggio CONNECT al broker per avviare la connessione e riceve in cambio un messaggio CONNACK e un codice di stato. Le connessioni stabilite vengono mantenute aperte dal broker fino a quando la connessione si rompe, o quando il client invia un comando di scollegamento.

La richiesta di collegamento contiene le informazioni necessarie per stabilire la connessione e un messaggio non valido comporterà la chiusura della connessione da parte del broker. Gli elementi più importanti contenuti in un messaggio CONNECT sono:

  1. Client ID – questa è l’identificazione del client usata dal broker per identificare il client e il suo stato corrente.
  2. Clean session – il flag di sessione “clean” determina se il client sta richiedendo una sessione permanente. Un’impostazione di false indica una sessione permanente in cui il broker archivia le sottoscrizioni e i messaggi persi per il client.
  3. Username/Password – questo elemento viene utilizzato per l’autorizzazione e autenticazione del client e può essere inviato in modo trasparente o crittografato.
  4. Will message – l’ultimo messaggio will (di volontà) viene utilizzato per notificare ad altri client quando un client si disconnette in modo inappropriato.
  5. KeepAlive – questo parametro è un intervallo di tempo misurato in secondi che specifica il periodo di tempo più lungo che un broker e un client trascorrono senza inviare un messaggio. I client e il broker si scambiano un ping a vicenda per stabilire che sono ancora disponibili.

Il broker risponde al messaggio CONNECT del client con un messaggio CONNACK che contiene due pezzi di dati, che sono:

  1. Flag di sessione presente – questo flag informa il client se c’è già una sessione persistente da una richiesta precedente.
  2. Codice di ritorno connessione – il codice di ritorno indica se il tentativo di connessione è andato a buon fine. Se la connessione viene rifiutata, il codice di connessione indicherà un motivo, ad esempio un nome utente o una password errati.

Pubblicazione e sottoscrizione di argomenti (topics)

In un’implementazione MQTT i messaggi vengono scambiati attraverso il metodo pub/sub. I clients pubblicano messaggi ai quali altri clients si sottoscrivono. Vediamo nella pratica come funziona.

Pubblicazione

Dopo il collegamento con il broker, un client può pubblicare messaggi. Ogni messaggio deve avere un argomento che può essere utilizzato per inoltrare il messaggio ai client sottoscritti. Il messaggio ha anche un payload che contiene dati che possono essere inviati in molteplici formati.

Un messaggio PUBLISH è composto dai seguenti elementi:

  • Identificatore del pacchetto – identifica un messaggio mentre si sposta tra client e broker;
  • Nome dell’argomento – una stringa di testo costruita gerarchicamente che utilizza barre come delimitatori;
  • QoS – indica la qualità del livello di servizio del messaggio;
  • Retain flag – indica se il messaggio deve essere salvato dal broker come ultimo valore valido noto per un particolare argomento;
  • Payload – il contesto del messaggio indipendentemente dai dati;
  • Flag di duplicazione – indica se il messaggio è un duplicato inviato perché il messaggio originale non è stato riconosciuto.

Sottoscrizione

I clients inviano messaggi al broker, indicando l’argomento al quale sono interessati. Un messaggio DI SOTTOSCRIZIONE contiene due componenti: un pacchetto identificativo e una lista di subscribers. Tantissime sottoscrizioni possono essere contenute in un singolo messaggio, ed ognuna specifica un argomento e il livello QoS.

Il broker risponde ad una sottoscrizione con un messaggio SUBACK per confermare la ricezione del messaggio e fornisce codici di ritorno che informano il client se una sottoscrizione è stata rifiutata e il livello di QoS che è stato concesso.

Annullamento della sottoscrizione

Un messaggio di DISISCRIZIONE cancella un’esistente sottoscrizione di un client. Contiene un pacchetto identificativo e una lista di argomenti che non sono più di interesse del client. Il broker risponde inviando un messaggio UNSUBACK di conferma al client.

Tutto sugli argomenti

Gli argomenti sono il meccanismo con cui il broker filtra i messaggi e determina che clients devono riceverli. Un argomento MQTT è una stringa UTF-8 costituita da uno o più livelli di argomento separati da una barra. Gli argomenti non devono essere inizializzati prima dell’uso e possono essere creati dinamicamente immediatamente prima della pubblicazione.

Un argomento deve contenere almeno un carattere e una stringa può avere spazi vuoti. Fanno distinzione tra maiuscole e minuscole, quindi Questo/Argomento e questo/argomento sono due argomenti distinti. Una barra in avanti “/” di per sé è un argomento valido.

Sono disponibili caratteri jolly a livello singolo e multilivello per consentire ai client di iscriversi a più argomenti contemporaneamente. I caratteri jolly vengono utilizzati solo durante l’iscrizione agli argomenti.

Carattere jolly a livello singolo: +

Di seguito è riportato un esempio di un carattere jolly a livello singolo che sostituisce un livello di argomento in un messaggio di sottoscrizione.

Controllo/+/linea di base

Le sottoscrizioni che soddisfano queste richieste includono:

  • Controllo / pressione / linea di base
  • Controllo / temperatura / linea di base
  • Controllo / tempismo / linea di base
  • Etc.

Carattere jolly a più livelli: #

Un carattere jolly a più livelli può essere inserito solo come ultimo carattere in un argomento e deve essere preceduto da una barra. Le sottoscrizioni che includono un carattere jolly a più livelli riceveranno tutti i messaggi per l’argomento con il modello che precede il carattere jolly indipendentemente dalle dimensioni o dalla profondità dell’argomento. L’uso non corretto di un carattere jolly a più livelli può causare la sottoscrizione inavvertita di un client a molti argomenti irrilevanti.

Il simbolo $ è riservato agli argomenti che riguardano le statistiche interne del broker MQTT. I client non possono pubblicare messaggi su questi argomenti.

Vale la pena prendere in considerazione alcuni suggerimenti sugli argomenti. Sebbene la barra in avanti (/) sia consentita nel linguaggio MQTT, non è consigliata. Lo stesso si può dire per l’utilizzo di spazi all’interno di un argomento. Questi costrutti introducono complessità non necessarie senza fornire alcun vantaggio. Usa argomenti specifici quando possibile e cerca di mantenerli brevi e concisi. Scoprirai che l’MQTT consente una comunicazione complessa e dinamica tra i dispositivi in un ambiente di rete.

Torna su