Introduzione
In questa guida vedremo come installare e configurare un server MQTT su Raspberry Pi, più comunemente chiamato broker MQTT in quanto di occuperà di “passare” i messaggi pubblicati agli altri ascoltatori (Client).
Come funziona MQTT?
In poche parole, il protocollo MQTT a differenza dei protocolli client/server, ha al suo centro un broker (server che andremo a configurare) che si occupa di ricevere tutti i messaggi in arrivo dai vari destinatari (ad esempio un ESP8266), ogni destinatario o client pubblicherà questi messaggi su un determinato argomento (topic) e tutti i client che sono iscritti a quel topic riceveranno il messaggio. Un po’ come visitare YouTube e visualizzare i vari video dei canali a cui siamo iscritti.
Per ulteriori informazioni consiglio di visitare il sito web ufficiale del protocollo: https://mqtt.org/
Materiale hardware
Raspberry Pi
Micro SD
Adat. Micro SD
Materiale Software
- Raspberry Pi OS installato su un Raspberry Pi
O - Un computer/server con una distribuzione Debian/Ubuntu
Procedura
Per prima cosa sarà necessario aggiungere il repository contenente i pacchetti necessari all’installazione, iniziamo con l’aprire una finestra di riga di comando o una connessione SSH al nostro dispositivo e lanciamo i comandi:
- Per Debian/Raspberry Pi OS:
wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key sudo apt-key add mosquitto-repo.gpg.key cd /etc/apt/sources.list.d/
A questo punto verifichiamo la versione di Debian installata con il comando: lsb_release -a
In base alla versione di Debian installata, eseguiamo il comando corrispondente:
-
- Buster:
sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list
- Stretch:
sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
- Jessie:
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
- Buster:
- Per Ubuntu:
Ci basterà lanciare il seguente comando:
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
Successivamente procediamo all’aggiornamento delle informazioni sui pacchetti
sudo apt update
Installiamo Mosquitto (Broker) e client (Per testare successivamente il funzionamento)
sudo apt install mosquitto sudo apt install mosquitto-clients
A questo punto il server di mosquitto verrà automaticamente installato come servizio, possiamo verificarlo con il comando:
sudo service mosquitto status
Di default Mosquitto non permette connessioni dall’esterno e l’accesso anonimo, necessario per i nostri test, procediamo quindi con il fermare il servizio e a creare in file di configurazione che imposti questi parametri:
Fermiamo il servizio: sudo service mosquitto stop
Creiamo il file di configurazione: sudo nano /etc/mosquitto/conf.d/testconf.conf
All’interno aggiungiamo le seguenti righe:
listener 1883 allow_anonymous true
Utilizziamo i tasti CTRL+X per uscire, alla richiesta di salvare premere Y e successivamente invio per confermare il nome del file.
Questa volta, se andremo a verificare lo stato del servizio con il comando sudo service mosquitto status
vedremo che il nostro file è stato caricato:
Il parametro listener permette di configurare la porta di ascolto per il broker MQTT, in questo caso 1883 (Porta di default).
Il parametro allow_anonymous permette di configurare l’accesso anonimo al broker, in questo caso a true per consentirne.
Possiamo quindi procedere con un semplice test di comunicazione, andremo a collegarci tramite mosquitto-clients al broker appena configurato.
Test di connessione al broker
Una volta configurato il broker, è possibile procedere ad un primo test per verificare se i messaggi che pubblichiamo vengono correttamente inviati a tutti i client.
Verifichiamo che il broker sia in ascolto sulla porta che è stata configurata nel file di configurazione creato prima con il comando:
sudo netstat -at
A questo punto possiamo provare a collegarci in ascolto su un topic con una finestra SSH e con un’altra pubblicheremo dei messaggi di test.
Iscriviamoci ad un topic di test sulla prima finestra con il comando:
mosquitto_sub -d -t topicTest
L’opzione -d permette di visualizzare i messaggi di debug (in caso di errori i messaggi verranno visualizzati).
L’opzione -t indica verso quale topic vogliamo iscriverci, i topic hanno necessità di essere creati prima di iscriversi/pubblicare messaggi e possono essere qualsiasi stringa noi vogliamo. (Il limite massimo è di 65536 bytes per la lunghezza della stringa di topic, a meno che non abbiate esigenze specifiche, basteranno per qualsiasi stringa).
Una volta iscritti apriamo un’altra finestra SSH e pubblichiamo un messaggio verso il topic a cui abbiamo effettuato l’iscrizione con il comando:
mosquitto_pub -d -t topicTest -m "Ciao!"
Sulla prima finestra (Dove ascoltavamo i messaggi per il topic “topicTest”) verrà visualizzato il messaggio pubblicato, confermando che il broker MQTT appena installato è in grado di svolgere la sua funzione correttamente.
È possibile pubblicare un messaggio di test da una macchina remota utilizzando il comando
mosquitto_pub -d -t topicTest -h 192.168.1.157 -m "Ciao!"
Il parametro -h permette di specificare l’host a cui collegarsi (Specificare l’indirizzo IP o l’hostname).
Rendere sicura la comunicazione utilizzando nome utente e password
È possibile modificare la configurazione del broker MQTT in modo da accettare comunicazioni solo utilizzando user e password, vediamo come.
Per prima cosa è necessario creare un file di testo contenente l’anagrafica degli utenti che vogliamo abilitare e le relative password, nello schema nomeutente:password (1 per riga) ad esempio:
test:testpassword mario:mariorossi
Creiamo il file in una cartella, in questo esempio andrò a creare il file nella cartella /home/pi/brokerusers/pwfile.txt
Creo la cartella: mkdir brokerusers
Ci posizioniamo all’interno: cd brokerusers
Creo il file: nano pwfile.txt
Inserisco all’interno del file gli utenti definiti prima:
Chiudo con CTRL+X e y per confermare il salvataggio.
Tramite una utility messa a disposizione del pacchetto mosquitto-clients possiamo andare a cifrare le password inserite nel file, per farlo utilizziamo il comando:
mosquitto_passwd -U pwfile.txt
Eseguito il comando se andiamo nuovamente ad aprire il file vedremo che le password all’interno sono state cifrate:
Ora possiamo procedere alla modifica del file di configurazione del broker MQTT per bloccare le connessioni senza user e password abilitati.
Copiamo il file cifrato all’interno della cartella /etc/mosquitto:
sudo cp pwfile.txt /etc/mosquitto/pwfile.txt
Fermiamo il servizio del broker:
sudo service mosquitto stop
Modifichiamo il file di configurazione:
sudo nano /etc/mosquitto/conf.d/testconf.conf
Disattivando il parametro allow_anonymous (da true a false) e aggiungendo la riga password_file con il path del file copiato in precedenza.
Salviamo le modifiche, e procediamo all’avvio del broker:
sudo service mosquitto start
In quanto ora solo gli utenti abilitati possono iscriversi/pubblicare messaggi se proviamo ad utilizzare i comandi precedenti, non funzioneranno e la connessione verrà rifiutata:
È necessario specificare nei comandi di iscrizione e pubblicazione username e password validi (in questo caso quelli indicati nel password file)
Per iscriversi:
mosquitto_sub -d -t topicTest -u mario -P mariorossi
Dove il parametro -u indica l’username e -P la password.
Per pubblicare:
mosquitto_pub -d -t topicTest -u mario -P mariorossi -m "Ciao!"
Anche qui -u indica l’username da utilizzare e -P la password.
A questo punto il nostro broker MQTT sarà protetto da eventuali attacchi in caso volessimo esporre il nostro server in rete, le connessioni verranno accettate solo da utenti consentiti.
Conclusione
MQTT è il protocollo più diffuso in ambito di IoT in quanto permette di scambiare messaggi in modo sicuro e utilizzando pochissime risorse. È possibile utilizzarlo su gran parte delle schede di sviluppo (esp8266, arduino ecc)
Questo è il primo di una serie di articoli su MQTT, per qualsiasi dubbio o domanda non esitare a lasciare un commento!