Presento la mia Tesi di Laurea che ha come titolo «Il protocollo MQTT e il paradigma publiish-subscribe. Applicazioni nell’Internet of Things».
Il paradigma publish-subscribe è un design pattern per la messaggistica, per lo scambio di contenuti ed informazioni in una rete. I nodi della rete possono essere publisher, quando creano e inviano i contenuti, e/o subscriber, quando si iscrivono ad un certo tipo di contenuti. Il paradigma prevede che quando un publisher pubblica un messaggio tutti i subscriber iscritti a quel tipo di messaggio lo ricevano.
Un esempio ad alto livello del paradigma publish-subscribe è il social network Twitter. Un utente diventa subscriber quando segue un altro utente e publisher quando pubblica un tweet. È compito di Twitter ogni volta che viene pubblicato un tweet inoltrarlo e farlo apparire nelle timeline di tutti gli utenti che seguono l’autore del tweet.
Il paradigma ha quindi bisogno di un tramite per permettere la trasmissione in multicast dal publisher ai subscriber. L’intermediario viene chiamato broker (o dispatcher) e ha il ruolo di registrare le sottoscrizioni dei vari client e di inoltrare ogni messaggio pubblicato da ogni client verso tutti i client iscritti a quel tipo di messaggi.
Il protocollo MQTT è un protocollo del livello Applicativo dello standard ISO/OSI. Solitamente usato in cima allo stack TCP/IP ma implementabile su qualsiasi protocollo di rete e trasporto che forniscano una connessione bi-direzionale, ordinata e senza perdite di dati.
Gli autori del protocollo hanno definito le caratteristiche in un manifesto ufficioso. Il protocollo deve essere implementabile anche in dispositivi con scarse risorse computazionali e che utilizzino canali di comunicazione instabili. QoS: garanzia di effettivo invio/ricezione dei messaggi. Data-agnostico: il payload può essere strutturato in qualsiasi modo a seconda dell’use case (file binari, testo, JSON, XML). Stateful: se il client lo richiede il broker salva il suo stato tra le varie sessioni (sottoscrizioni, messaggi con richiesta di garanzia di ricezione).
Il protocollo è stato creato da Andy Stanford-Clark e Arlen Nipper per IBM nel 1999. La sua prima applicazione è stata il controllo di oleodotti e gasdotti tramite una rete di sensori connessi via satellite.
Nel 2010 la versione 3.1 delle specifiche del protocollo è stata rilasciata sotto licenza royalty-free, rendendo quindi liberamente implementabile il protocollo.
Dal rilascio con licenza royalty-free, nel 2010, la popolarità del protocollo è in continua crescita (come si può vedere dal grafico fornito da Google Trends per la chiave di ricerca «MQTT») anche grazie ai progetti Open Source dell’Eclipse Foundation PAHO e mosquitto. Paho è un insieme di librerie per l’implementazione di client MQTT in vari linguaggi di programmazione come C, Java, Python, C++, Go, .NET ed altri. Mosquitto è un broker open-source scritto in C disponibile per i maggiori sistemi operativi ma anche per dispositivi come il Raspberry Pi.
Vediamo adesso come il protocollo può essere utilizzato nell’ambito dell’internet of Things per la realizzazione di progetti per l’automazione e la domotica utilizzando componenti a basso costo e librerie software open-source.
Il termine Internet of Things è stato coniato da Kevin Ashton lo stesso anno in cui è nato MQTT, nel 1999. Molti analisti definiscono questi anni come l’era dell’Internet of Things (smartphone, macchine, frigoriferi, e applicazioni come le smart city, l’e-health, ecc…). I dispositivi connessi ad internet hanno superato in numero la popolazione mondiale ed è previsto che nel 2020 ci saranno più di 20 miliardi di dispositivi connessi alla rete globale.
Per i miei progetti nell’«Internet delle cose» la cosa che ho scelto per la connettività è questo SoC (system-on-a-chip), l’ESP8266. È dotato di un processore che lavora a 80Mhz e di una manciata di kilobyte di memoria di sistema e da 1 a 16MB di memoria flash per la memorizzazione e l’esecuzione di semplici programmi. Inoltre implementa un modulo per la connessione alle reti Wi-Fi e alcuni pin GPIO (general purpose input/output) che permette di collegargli diversi sensori e attuatori.
Nella tesi ho parlato di due progetti IoT che utilizzano l’ESP8266, un sistema per la termoregolazione nelle case e un’interruttore programmabile e comandabile da remoto.
Il sistema di termoregolazione permette tramite una rete di sensori di temperatura e di attuatori che agiscono sulle valvole dei caloriferi (una coppia per ogni stanza) di gestire il riscaldamento di una abitazione.
Il sensore di temperatura (in questo caso il TMP36, acquistabile per un paio di euro) comunica alla rete ad intervalli regolari la temperatura percepita in una stanza sul topic temperatura/nome_stanza/temperatura_percepita tramite MQTT.Queste sono due righe del codice del programma che viene eseguito dall’ESP8266.
L’attuatore consiste in delle valvole che vengono applicate sui caloriferi e che si aprono quando vengono alimentate a 220V e si chiudono quando l’alimentazione viene interrotta. Tramite un relè è possibile programmarne il comportamento con un segnale a basso voltaggio come quello fornito dai pin GPIO dell’ESP8266.
L’ESP8266 si iscrive ai topic per conoscere la temperatura attuale dell’ambiente e quella scelta dall’utente e se quest’ultima è maggiore della temperatura percepita apre la valvola attivando il relè.
I sensori e gli attuatori si connettono al broker (rappresentato da un’istanza di mosquitto eseguita in locale, ad esempio su un Raspberry Pi) utilizzando un porting open source della libreria PAHO per il linguaggio C modificata per essere eseguita sull’ESP8266. Tramite la funzione di bridging offerta da mosquitto è possibile collegare il broker locale ad un broker remoto per permettere l’interazione con i dispositivi dentro casa anche senza essere connessi alla rete locale. Mentre in locale è possibile utilizzare MQTT su TCP senza criptazione della comunicazione, è possibile impostare per il bridge una connessione sicura, criptata end-to-end, utilizzando il protocollo TLS/SSL.
Le foto mostrano altre esempi di implementazione del protocollo MQTT per usi nell’IoT per connettere alla rete un sensore di pioggia, un accellerometro e un interruttore.