Sviluppare una App IoT con MQTT, Docker, Raspberry Pi e Python

Michele Stecca
4 min readMar 19, 2022

--

In questo articolo viene descritta la realizzazione di una semplice applicazione IoT su Raspberry Pi che legge dei dati da un sensore di temperatura e umidità e li invia a un server mediante il protocollo MQTT (Message Queue Telemetry Transport).

Figura 1. Il setup completo.

L’applicazione di esempio

Al fine di testare il loop completo è stato installato nel computer portatile il client MQTT open source MQTT X [1]. Esso permette a un utente di inviare il comando “inviami i dati” al Raspberry Pi e di ricevere i dati di temperatura e di umidità in (near) real time.

Figura 2. Il flusso di messaggi MQTT nell’applicazione.

Configurazione del Broker MQTT

Per il Broker MQTT è stato scelto un container Docker configurato per eseguire il software open source Mosquitto. Il laptop in Figura 1 esegue Docker Desktop e la sua interfaccia Ethernet è stata configurata staticamente (ip: 192.168.0.2). Per eseguire il container dare il seguente comando:

docker run -it--name mosquitto -p 192.168.0.2:1883:1883 eclipse-mosquitto

Collegarsi alla CLI del container e modificare il file di configurazione mosquitto.conf aggiungendo le seguenti righe:

listener 1883 0.0.0.0

allow anonymous true (in fase di testing si accettano connessioni anonime).

Configurazione del Raspberry Pi

In questo setup è stato utilizzato un Raspberry Pi 3 Model B sul quale è stato installato Raspberry Pi OS Lite (precedentemente Raspbian)*. La scheda di rete Ethernet è stata configurata staticamente (ip: 192.168.0.10) per essere connessa al laptop dove esegue il Broker MQTT. Sono state installate due librerie con i seguenti comandi:

pip3 install paho-mqtt (Libreria Python per i client MQTT)

pip3 install Adafruit_DHT (Libreria Python per interagire con il sensore DHT11)

Per permettere a Raspberry Pi di leggere i dati dal sensore è necessario attivare il protocollo 1-Wire lanciando l’utility raspi-config e attivando tale protocollo nel menù interfacing option.

*Nota: si ringraziano gli studenti della 4BI dell’ITT Barsanti per l’aiuto fornito in fase di configurazione del Raspberry Pi.

Cablaggio Raspberry Pi/Sensore DHT11

Come descritto in [2], il sensore di temperatura e umidità DHT11 è disponibile con o senza basetta. In questo setup è stata utilizzata la versione con basetta mostrata in Figura 1 dove il pin più a destra va collegato con GND (pin 6 del Raspberry Pi), il pin mediano va collegato a 5V (pin 2 del Raspberry Pi) e il pin più a sinistra contrassegnato dalla lettera S (che rappresenta il pin dove viaggiano i dati) va collegato a GPIO 4 (pin 7 del Raspberry Pi). Vedi Figura 3.

Figura 3. GPIO Pinout, fonte: Raspberry Pi Geek

Nota: alcune versioni del sensore prevedono che sia il pin mediano a trasportare i dati. In questo caso accanto al pin di sinistra è presente il simbolo + e i collegamenti verso il Raspberry Pi vanno invertiti (pin mediano su pin 7 e pin di sinistra del sensore su pin 2). Vedi Figura 4.

Figura 4. Il cablaggio, fonte [2]

Codice Python lato client (Raspberry Pi)

A questo punto è possibile realizzare il codice Python che è in grado di gestire le interazioni di Figura 2.

def on_connect(client, userdata, flags, rc):
print(f"Connected with code {rc}")
client.subscribe("raspberry/dh11_sensor_commands")

Il metodo on_connect si sottoscrive al topic che gestisce l’invio dei comandi da parte del laptop.

def on_message(client, userdata, msg):
#sensor version
sensor = 11
#number of the pin receiving data
gpio = 4
print("Request received")
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
data = 'Temp: {0:0.1f}°C Humidity: {1:0.1f} %'.format(temperature, humidity)
client.publish('raspberry/dh11_sensor_data', payload=data, qos=0, retain=False)
print("Data Sent to MQTT Broker")

Il metodo on_message scatena una lettura dal sensore e l’invio dei dati sul topic dh11_sensor_data quando viene ricevuto un messaggio sul topic dh11_sensor_commands.

Il codice completo è presente su GitHub cliccando qui.

Testare il tutto

Per testare il setup è sufficiente attivare il software MQTT X sul laptop ed eseguire le seguenti operazioni:

  1. Connettersi al Broker MQTT (ip: 192.168.0.2, porta: 1883, credenziali non necessarie);

2. Cliccare su New Subscription per sottoscriversi al topic utilizzato dal Raspberry Pi per pubblicare i dati (nome completo del topic: raspberry/dh11_sensor_data);

3. Inviare una richiesta di lettura dei dati (nella parte bassa della schermata inserire il nome del topic raspberry/dh11_sensor_commands e inviare un messaggio con un qualsiasi payload).

Figura 5. Scambio di messaggi attraverso MQTT X

Sviluppi futuri

E’ stata realizzata una semplice applicazione che ha dimostrato come sia possibile “chiudere il giro” delle comunicazioni tra client e server grazie al protocollo MQTT. Essa rappresenta solamente un punto di partenza per realizzare varie funzionalità, tra le quali: invio di un flusso continuo di dati (in questo esempio MQTT -che per sua natura è un publish&subscribe- è stato utilizzato sostanzialmente come se seguisse il paradigma call&response), memorizzazione di dati in sistemi TSDB (Time Series DB), visualizzazione di dati su dashboard (per es. Grafana, Kibana, ecc.).

Reference

[1] https://mqttx.app/

[2] https://www.meccanismocomplesso.org/dht11-e-dht22-misurare-umidita-e-temperatura-con-raspberry/

--

--

Michele Stecca

Karaoke addicted and Ph.D. in Computer Engineering. High School teacher. #Cybersecurity #BigData, #IoT, #AI, #Education, #Cisco. Opinions are my own.