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

 

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

 

  • 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!