IoP: Usare Mosquitto come broker Mqtt

In un post precedente avevo utilizzato HiveMQ cloud come broker cui inviare, utilizzando il protocollo MQTT, le misurazioni rilevate da alcuni sensori posti su una scheda Arduino. Come alternativa si potrebbe usare un broker open source chiamato Mosquitto, gestito dalla Eclipse Foundation.

Il modo più semplice per installare e configurare Mosquitto è quello di utilizzare un container Docker ed è proprio quello che ho fatto questa mattina e che descrivo nei paragrafi seguenti.

Cos’è Docker?      (riassuntone)

Docker è un sistema che permette di creare degli ambienti operativi indipendenti ma comunicanti tra di loro su ognuno dei quali girano un insieme minimo di programmi che consentono l’implementazione di uno specifico servizio. L’idea di installare un solo servizio su un container è alla base dei sistemi basati sui microservizi e delle architetture informatiche di tipo SOA (Service Oriented Architecture).

Docker è un po’ una evoluzione del concetto di Macchina Virtuale, la differenza principale tra le due tecnologie è che mentre una Macchina Virtuale esegue dei programmi su un sistema operativo completo, ma su un hardware virtualizzato, un container Docker esegue dei programmi su un sistema operativo virtualizzato. Questo comporta dei vantaggi in termini di semplicità di utilizzo, di scalabilità e di prestazioni.

Questo argomento meriterebbe un post a parte, mi limito a fare un piccolo esempio.

Un servizio come la registrazione a un evento potrebbe essere diviso in servizi più piccoli ognuno dei quali svolge un compito ben preciso: uno potrebbe ospitare il sito web (front-end) che l’utente visita, uno potrebbe contenere il database con i dati degli eventi e degli utenti registrati e uno potrebbe contenere il programma (backend) per la gestione delle prenotazioni e dei pagamenti.

Per poter creare un container è necessario descriverne il contenuto in modo formale e quindi con una sintassi ben precisa in un Dockerfile o in un file YAML e poi eseguire il comando “docker build” (se si è usato un Dockerfile) o il comando “docker-composer up” (se si è usato un file Yaml).

Il modo più semplice per gestire dei container Docker su Windows e Mac è utilizzando il programma Docker Desktop.

Docker Hub è un sito su cui sono pubblicati e messi a disposizione di chiunque un gran numero di immagini (di container) già pre-configurati che si possono scaricare ed utilizzare nei propri progetti.

Esperimento con Docker e Mosquitto

L’esperimento è molto semplice ed è diviso in tre parti:

  1. Personalizzazione di un container partendo dall’immagine ufficiale di Mosquitto.
  2. Creazione ed esecuzione del container personalizzato contenente il broker Mosquitto.
  3. Esecuzione di alcune prove per verificare che con dei client Mqtt installati sul mio computer si potessero inviare (publish) e ricevere (subscrive) dati dal broker Mosquitto installato sul container.

Personalizzazione dell’immagine ufficiale di Mosquitto

In questo repository pubblicato su Bibucket è possibile scaricare il file Dockerfile da utilizzare per costruire il container.

###### Start from the official Eclipse Mosquito image based on Alpine ######
FROM eclipse-mosquitto:latest

### Update Alpine distribution and install useful tools ###
RUN apk update
RUN apk upgrade
RUN apk add bash
RUN apk add bash-completion

# Define volume mount points
VOLUME ["/mosquitto/data", "/mosquitto/log", "/mosquitto/conf"]

# Add the link to the custom configurations directory
RUN echo "include_dir /mosquitto/config/custom" > /mosquitto/config/mosquitto.conf
COPY ./config/custom /mosquitto/config/custom

# Add the file with the allowed accounts
COPY ./config/auth /mosquitto/config/auth
# Encrypt passwords
RUN mosquitto_passwd -U /mosquitto/config/auth/pwd.txt

EXPOSE 1883
 
Le direttive di questo file servono a:
  • creare un container basato sull’ultima versione dell’immagine ufficiale eclipse-mosquitto,
  • aggiornare Alpine che è il sistema operativo dell’immagine,
  • installare alcune utility del sistema operativo (la shell bash in particolare),
  • indicare a Docker quanti e quali volumi creare,
  • copiare dalla cartella del repository all’immagine Docker le cartelle custom e auth contenenti rispettivamente i file custom_config.conf e il file pwd.txt,
  • eseguire il criptaggio delle password presenti nel file pwd.txt,
  • rendere accessibile all’esterno la porta 1883 su cui gira il broker Mqtt.
Il file pwd.txt contiene gli account (nel fomato username:password) che i client mqtt devono utilizzare per accedere al broker.
Le configurazioni aggiinte nel file config/custom/custom_config.conf sono:
 
listener 1883
allow_anonymous false
password_file /mosquitto/config/auth/pwd.txt
 
e servono a fare in modo che il broker Mqtt:
  • si metta in ascolto delle richieste sulla porta 1883,
  • non consenta l’accesso anonimo,
  • consenta l’accesso solo agli account elencati nel file pwd.txt (in questo caso user1 / password1 e user2 / password2).

Creazione ed esecuzione del container

I passi da seguire per creare ed eseguire il container descritto del paragrafo precedente sono:

  1.  Scaricare il contenuto del repository o con il download della cartella iop-broker o clonando il repository (dopo aver installato un client GIT con il comando: git clone https://bitbucket.org/ilclaudio/iop-broker.git)
  2. Aprire una shell e spostarsi nella cartella iop-broker.
  3. Da shell, costruire il container con il comando:
    • docker build -t mosquitto_broker -f Dockerfile .
  4. Da shell eseguire il container con il comando:
    • docker run –name iop-broker -d  -p 1883:1883  mosquitto_broker 

Per verificare che il container sia in esecuzione, lanciare il comando: docker ps.

o usare Docker Desktop:

Test del sistema

A questo punto il broker è in esecuzione, per verificare che funzioni, basta inviare dei dati con un client configurato come publisher e leggere gli stessi dati con un client configurato come subscriber.

Io ho usato:

  • MqttLens per pubblicare dei dati in formato JSON sul topic “casaclaudio/piante“.

  • MqttX per leggere i dati del topic “casaclaudio/#” (Il cancelletto sta a significare di leggere tutti i topic innestati dentro al topic principale).

E, in effetti, inviando i dati da MqttLens (client publisher) a Mosquitto (broker):

Mosquitto (broker) li reinvia a MqttX (client subscriber):

Conclusioni

Nell’ambito del progetto IoP è previsto che ci sia un broker per la raccolta e l’inoltro dei dati misurati dai sensori.  Il broker potrebbe essere installato su un server o su un Raspberry Pi in casa o su un server in cloud. In entrambi i casi la soluzione del container basato su Docker e Mosquitto può essere una soluzione percorribile, come spiegato in questo post. Perlomeno è la soluzione che utilizzerò io.

 

Mqtt clients per Windows:

Altri post legati al progetto:

  1. Il broker e la piantina.
  2. Agrumino Lemon: Prima installazione e configurazione.
  3. Repository del progetto iop-broker.
  4. Mqtt il protocollo per far comunicare le cose.

Fonti e riferimenti:

  1. Sito del progetto Eclipse-mosquitto.
  2. Immagine Docker ufficiale di Mosquitto su Docker Hub.
  3. Cosa sono i microservizi? su AWS.com.
  4. Sito per il download di Docker Desktop.
  5. Sito ufficiale di Docker.
  6. Architettura SOA su Wikipedia.
  7. Domotica per Makers su Html.it.
  8. Mosquitto Username and Password Authentication -Configuration and Testing by Steve.

 

 

3 years ago

Leave a Reply

Your email address will not be published. Required fields are marked *