Se due dispositivi vogliono colloquiare tra loro, è necessario che entrambi adottino un protocollo comune. In passato vi ho già mostrato diversi esempi di comunicazione, ad esempio tra Arduino e un programma C#, Arduino e un sito web o Arduino e un server NTP.
Tutte queste comunicazioni erano punto-a-punto, ovvero tra due interlocutori. Oggi voglio invece iniziare a parlarvi di un protocollo un po’ particolare: MQTT (MQ Telemetry Transport).
Il protocollo MQTT è stato inventato nel 1999 da due ricercatori (Andy Stanford-Clark di IBM e Arlen Nipper di Arcom) e le sue specifiche sono pubbliche (sito IBM). Le sue caratteristiche principali, che lo rendono molto adatto per lo scambio informazioni tra dispositivi (machine 2 machine) sono:
[checklist]
- è di tipo publish/subscribe
- è molto semplice
- ha un overhead (= quantità di dati da trasmettere per il suo funzionamento) molto basso
[/checklist]
Publish/Subscribe
La caratteristica principale di MQTT è di essere un protocollo publish/subscribe.
In una comunicazione tradizionale, la sorgente del dato (ad esempio un sensore di temperatura) invia il dato direttamente all’utilizzatore finale (ad esempio il termostato):
In una comunicazione publish/subscribe invece il sensore invia (pubblica, publish in inglese) il dato ad un sistema centrale detto broker. Tutti i dispositivi che vogliono ottenere tale dato lo comunicano al broker (si iscrivono, subscribe in inglese) ed è il broker ad inviare loro il dato quando questo è disponibile:
Il principale vantaggio del paradigma pub/sub è il disaccoppiamento tra chi produce il dato e chi lo deve utilizzare:
[checklist]
- disaccoppiamento spaziale: chi genera il dato non deve essere direttamente connesso con chi lo utilizza;
- disaccoppiamento temporale: chi genera il dato non deve essere attivo nello stesso momento di chi lo utilizza;
- disaccoppiamento di sincronizzazione: la produzione del dato non deve essere sincrona con il suo utilizzo.
[/checklist]
Da quanto scritto sopra, si capisce perché il protocollo MQTT e in generale il paradigma pub/sub è molto utilizzato in ambito Internet of Things: i dispositivi più semplici, spesso alimentati a batteria, possono attivarsi ogni tot secondi, inviare i propri dati al broker e tornare nello stato di risparmio energetico. Sarà il broker, sempre attivo, a rendere disponibili tali dati ai vari utilizzatori (attuatori, dashboards…).
Topics
Un broker può gestire un numero molto elevato di messaggi, provenienti da diverse sorgenti e destinati a diversi utilizzatori. Come avviene il corretto smistamento dei messaggi? Tramite il concetto di argomento (topic in inglese): ogni messaggio viene pubblicato indicandone il topic (nel caso di un sensore di temperatura ad esempio il topic potrà essere appunto temp). In fase di sottoscrizione, l’utilizzatore deve specificare uno o più topic dei quali vuole ricevere i dati (sempre nel nostro esempio, per ricevere i dati di temperatura il termostato dovrà sottoscrivere il topic temp):
Più avanti vedremo nel dettaglio come sono strutturati i topic e come sia possibile effettuare sottoscrizioni a più topic utilizzando delle wildcards.
Mosquitto
Finita la parte introduttiva, vediamo ora come utilizzare MQTT. Avrete ormai capito che l’elemento fondamentale è il broker: uno dei software più utilizzati come MQTT broker è mosquitto.
Mosquitto è disponibile per tutte le piattaforme più diffuse (Windows, Linux, MacOS), oggi vediamo come installarlo e utilizzarlo su Windows.
Per prima cosa scarichiamo l’ultima versione dal sito ufficiale e scompattiamo l’archivio in una cartella.
Dobbiamo quindi scaricare altri due componenti: le librerie OpenSSL e pThreads. Iniziamo con lo scaricare la build di OpenSSL per Windows (molto importante è scaricare la versione 1.0.x):
Dalla cartella dove abbiamo installato OpenSSL, copiamo il files libeay32.dll e ssleay32.dll nella cartella di mosquitto:
Scarichiamo ora la libreria pthreadVC2.dll da SourceWare e copiamo anche questa nella cartella di mosquitto:
Questo il contenuto finale della cartella di mosquitto dopo aver copiato le 3 librerie:
Primo esempio
Possiamo ora provare mosquitto. Apriamo 3 prompt dei comandi: uno per eseguire il broker, uno per simulare il sensore temperatura (publish) e uno per simulare il termostato (subscribe).
Nel primo prompt eseguiamo il broker, utilizzando il parametro -v per attivare l’output verboso e vedere meglio quello che succede:
Nel secondo prompt, utilizziamo il comando mosquitto_sub per sottoscrivere il topic temp:
Nel terzo prompt, utilizziamo il comando mosquitto_pub per pubblicare il dato di temperatura (es. 21°) sul topic temp:
Se torniamo al prompt dove abbiamo lanciato la sottoscrizione, vedremo che il dato è stato correttamente instradato dal broker e ricevuto:
Conclusioni
In questo primo articolo vi ho introdotto il paradigma pub/sub e il protocollo MQTT. Abbiamo inoltre visto come usare mosquitto come broker per inviare e ricevere messaggi. Dai prossimi articoli vedremo esempi reali, con Arduino (e non solo…).
1 commento