Nelle applicazioni domotiche non sempre l’oggetto che intendiamo controllare risiede fisicamente nelle vicinanze della centralina che gestisce l’impianto ed è quindi facilmente collegabile tramite fili ai GPIO del Raspberry. In questi casi si rende necessario prevedere sistemi che permettano di interagire con oggetti posti in lontananza. Sfruttare la copertura della rete Wi-Fi è sicuramente un ottimo, nonché economico, approccio. Per la comunicazione tra Raspberry e gli oggetti intelligenti utilizzeremo il protocollo MQTT.
Prima di continuare è necessario avere delle nozioni di base sul funzionamento del protocollo MQTT, a tal proposito potete visionare un nostro contenuto sull'argomento. Qui tratteremo gli aspetti "pratici". Per poter comunicare via MQTT è necessario installare un broker, che è l’elemento software deputato a ricevere e smistare i messaggi. Utilizzeremo Mosquitto, uno dei più comuni.
Installazione Mosquitto
Potremo usare il comando sudo apt-get install mosquitto -y per installare Mosquitto sul Raspberry Pi.
Adoperando il comando sudo apt-get install mosquitto-clients -y saremo opzionalmente in grado di installare anche i clients, questi, anche se non strettamente necessari, consentiranno di compiere esperimenti per verificare il funzionamento nonché fare debug.
Aggiungere un livello di sicurezza a Mosquitto
Per rendere più difficile l’accesso a Mosquitto con il comando cd /etc/mosquitto rechiamoci nella cartella dove è installato. Con il comando sudo nano p.txt creiamo un nuovo file di testo sfruttando l'editor nano.
Il file p.txt conterrà nome utente e password. Potete anche cambiarne il nome a patto che, nei passaggi successivi, teniate in debita considerazione il fatto di averlo modificato. Aperto l’editor con il file vuoto scriviamo semplicemente un nome utente e una password in chiaro separati da due punti.
utente:password
Salviamo con CTRL+O e CTRL+X. Adesso, adoperando il comando sudo mosquitto_passwd –U p.txt rendiamo illeggibile la password utilizzando la specifica funzionalità inclusa con Mosquitto.
Se visioniamo nuovamente il file “p.txt” con l’editor noteremo che la password è criptata. Adesso facciamo in modo che per collegarci a Mosquitto sia necessario fornire utente e password. Digitando sudo nano mosquitto.conf operiamo sulla configurazione.
Alla fine del file trovere la linea che carica la configurazione standard come a seguire.
include_dir /etc/mosquitto/conf.d
Dovremo sostituirla con quanto subito sotto.
allow_anonymous false
password_file /etc/mosquitto/p.txt
Ovviamente allow_anonymous false preclude l'accesso anonimo, mentre la riga successiva fornisce il percorso al file in cui sono registrati nomi utente e password. Come ulteriore livello di sicurezza è anche possibile fare in modo che il broker si metta in ascolto su una porta diversa da quella standard (1883). Basta aggiungere la riga seguente.
listener 1883
Sostituite 1883 con il valore che preferite, avendo l'accortezza che sia utilizzabile e libero, per la scelta della porta valgono le stesse considerazioni già effettuate quando abbiamo modificato la porta di NodeRed. Salviamo e chiudiamo con CTRL-O e CTRL-X. Con sudo reboot riavviamo il Raspberry.
Prove di funzionamento di Mosquitto
Se nell'installazione di Mosquitto abbiamo incluso anche l'installazione dei client avremo a disposizione due utili tools: mosquitto_sub e mosquitto_pub. Permettono, rispettivamente, di sottoscrivere un topic e di pubblicare messaggi su uno specifico topic. Ricordiamo che un "topic" MQTT rappresenta una sorta di "casella postale" nella quale possiamo reperire uno specifico messaggio (che ha una proprietà, chiamata payload, contenenete una stringa che può, ad esempio, essere il valore restituito da un sensore).
Sul Raspberry apriamo due finestre terminale. In una proveremo a pubblicare messaggi su MQTT e nell’altra tenteremo di riceverli. Digitiamo mosquitto_sub –P [password] –u [user] –t test –v (rispettando maiuscole e minuscole).
Ai valori [password] e [user] sostituite i valori che avete impostato nel file di password (altrimenti omettete questi due parametri se non avete impostato utente/password). Nel caso in cui abbiate modificato il numero di porta è necessario anche specificarla aggiungendo –p [numero porta] al comando, altrimenti non sarà necessario. Il flag –v permette di avere un output “verbose”, ad esso viene aggiunto anche il nome completo del topic, cosa che può tornare utile quando andremo a fare esperimenti su più topic per distinguere da dove provengono i messaggi. Con mosquitto_sub --help otterrete l’elenco completo dei comandi disponibili. Il client si è messo in ascolto sul topic che abbiamo battezzato test per cui non appena saranno recapitati messaggi in questo topic, questi verranno visualizzati. Nella seconda finestra terminale pubblichiamo un messaggio sul topic “test” mediante il comando:
mosquitto_pub –P [password] –u [user] –t test –m prova
Ricordatedi aggiungere il flag –p se avete modificato la porta. Il valore dopo il flag –m rappresenta il payload (contenuto) del messaggio. Dopo aver premuto invio, il messaggio "prova" compare nella finestra in cui abbiamo lanciato mosquitto_sub.
Il subscriber ha ricevuto il messaggio “prova” inviato sul topic “test”. E' possibile scaricare qui questo esempio, da importare in NodeRedcome abbiamo visto nella lezione precedente.
A seguire
Nelle prossime lezioni illustreremo tutto l'occorrente per utilizzare un NodeMCU operando da Arduino IDE, questo ci consentirà di realizzare i nostri "oggetti intelligenti" che comunicheranno con NodeRed tramite MQTT.