in Costruisci la tua rete domotica con Esp8266 e Raspberry Pi, Progetti, Tutorial

Costruisci la tua rete domotica con Esp8266 e Raspberry Pi – Protocolli applicativi e rete locale

I protocolli applicativi sono quei particolari protocolli utilizzati all’interno delle applicazioni che sviluppiamo. Per contestualizzare meglio questo concetto, è utile introdurre il concetto di pila protocollare, di cui sicuramente avrete già sentito parlare. 

La pila protocollare ISO/OSI è un modello astratto che descrive la composizione di una rete di comunicazione, senza specificarne i dettagli implementativi. L’implementazione più utilizzata, alla base del funzionamento dell’Internet, è TCP/IP: le immagini qui di seguito descrivono la composizione delle pile appena introdotte.

 

Rappresentazioni schematiche della pila ISO/OSI (a sinistra) e di quella TCP/IP (a destra)

In questo articolo non si entrerà nel dettaglio del funzionamento dell’Internet Protocol o del Transmission Control Protocol, ci basta sapere che questi compongono i blocchi fondamentali per la trasmissione dei dati su Internet.

I protocolli applicativi fanno parte dell’ultimo livello delle pile sopra descritte e si occupano di potere offrire strumenti direttamente utilizzabili all’interno di applicazioni, basandosi sui servizi resi disponibili dai livelli sottostanti.

Le applicazioni che utilizziamo ogni giorno sfruttano questi protocolli in ogni momento: vogliamo però focalizzare la nostra attenzione su quelli maggiormente utilizzati nell’ambito domotico ed, in particolare, su quello che pensiamo si presti meglio all’utilizzo per il nostro progetto, combinando semplicità di utilizzo e potenza descrittiva, MQTT.

MQTT (Message Queue Telemetry Transport) funziona sopra la pila protocollare TCP/IP e permette uno scambio di messaggi tramite un modello publish-subscribe: i publisher pubblicano messaggi verso dei canali su cui i subscriber possono stare in ascolto, sottoscrivere. Il funzionamento di questo meccanismo è simile a quello che succede su piattaforme come Youtube: delle persone creano video sui loro canali; gli utenti del sito, iscrivendosi ai canali, potranno quindi sapere quando i creatori pubblicano dei video.

Le entità a cui si è fatto riferimento fino ad ora per il concetto di canale hanno un nome ben preciso nel protocollo MQTT e sono chiamate topic.
Un topic MQTT è una stringa che può rappresentare un tipo di dato di interesse che viene letto ed inoltrato nella rete, o può rappresentare una particolare stanza dell’ambiente che si va a prendere in considerazione; sono degli strumenti di uso semplice ma, allo stesso tempo, molto versatili.

L’entità che coordina le attività dei publisher e dei subscriber mediante i topic è il broker.

Schema base dell’attività dei diversi elementi di una rete che utilizza MQTT come protocollo applicativo.

Una particolarità dei topic MQTT è che possono essere organizzati in strutture gerarchiche, che permettono di descrivere in maniera ottimale gli ambienti casalinghi che prendiamo in considerazione, ad esempio,  rappresentando l’insieme dei sensori utilizzati , il tipo di dato che catturano, la stanza in cui sono posti. 

Questo tipo di comportamento viene introdotto tramite l’uso di vari livelli gerarchici divisi dal carattere /.
La stringa di topic che corrisponde all’esempio introdotto poco fa è quindi la seguente “/sensori/id_stanza/tipo_dato/id_sensore“.

Esempio di struttura dei topic per i nodi sensori della nostra rete casalinga; in basso il topic corrispondente ad un particolare nodo dell’architettura.

Una caratteristica interessante dei topic MQTT è la possibilità di utilizzare delle parole chiave al loro interno, le cosiddette wildcard, che possono sostituire uno o più livelli di un topic. Le due wildcard che prendiamo in considerazione sono:

  • +, che permette di sostituire un livello singolo; se volessimo, ad esempio, considerare i topic relativi al primo tipo di dato di ogni stanza, potremmo usare il seguente topic “/sensori/+/tipo_dato_1/+“.
  • #, che permette di sostituire un numero qualunque di livelli; se volessimo considerare i topic relativi ad ogni sensore della stanza numero uno, potremmo utilizzare il seguente topic “/sensori/stanza_1/#“.

Questi concetti, espressi in modo schematico e teorico qui sopra, verranno ripresi nei prossimi articoli con semplici esempi che ne dimostreranno l’efficacia nel contesto da noi prescelto all’interno di semplici applicazioni.

Per ora, procediamo con l’installazione del broker open source Mosquitto; il pacchetto di installazione include anche due semplici Client MQTT, mosquitto_pubmosquitto_sub, ottimi per provare ad utilizzare il protocollo ed imparare le basi dello scambio dei messaggi. Su piattaforme Linux o macOS, si può procedere all’installazione direttamente da linea di comando.

Linux (Debian)
$ sudo apt-get install mosquitto
macOS

$ brew install mosquitto

$ brew link mosquitto

Per quanto riguarda Windows, a seconda della versione del sistema operativo la procedura può essere più o meno complessa; per quanto riguarda gli scopi per cui useremo il broker, ci interessa principalmente il suo utilizzo su piattaforma Linux Debian (che sarà la prescelta sul Raspberry Pi) ma se volete usare Mosquitto per test su Windows, consiglio di seguire le indicazioni riportate nel seguente tutorial Running Mosquitto MQTT on Windows 10 super easy (sono anche presenti le indicazioni per Windows Vista/7/8).

Una volta installato, Mosquitto può essere avviato semplicemente da linea di comando:

Linux (Debian)
$ mosquitto
macOS
$ brew services start mosquitto

Se si è su Windows, bisognerà avviare il Prompt dei comandi nella cartella in cui è stato installato Mosquitto (generalmente C:\Programmi\mosquitto) ed effettuare la stessa procedura indicata per sistemi Linux.

Con questo tipo di avvio, Mosquitto utilizzerà le opzioni di default per la porta TCP utilizzata (la porta 1883). Una volta installato il broker, possiamo testare i concetti introdotti in precedenza usando i due Client mosquitto_pub e mosquitto_sub. Ad esempio, aprendo due finestre di terminale, scriviamo in ognuna delle due:

$ mosquitto_sub -t test

In questa maniera avremo due subscriber in ascolto sul topic test (l’opzione -t sta appunto per topic). Ora pubblichiamo un messaggio su questo topic aprendo una terza finestra di terminale ed eseguendo il seguente comando:

$ mosquitto_pub -t test -m "prova"

Se tutto ha avuto successo, vedremo la stringa di testo prova apparire sulle finestre di terminale su cui i subscriber erano in esecuzione. Come esercizio, si può provare ad applicare quanto visto precedentemente nella sezione riguardante le wildcard.

Nei prossimi articoli inizieremo ad analizzare i dispositivi presi in considerazione per la realizzazione degli elementi della rete, applicando alcuni dei concetti introdotti nelle righe precedenti.

Introduzione al modulo wifi ESP8266 →
Progettazione dell’applicativo →

Scrivi un commento

Commento