Registrare i dati dei sensori via MQTT

closeQuesto articolo è stato pubblicato 5 anni 3 mesi 3 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi.

Nel progetto La Domotica fai-da-me ho inserito alcuni sensori che leggono i dati ambientali di casa e li trasmettono al server in mo tale che questo possa memorizzarli in un DB. Tutti i sensori sviluppati fin qui inviando i dati facendo una chiamata web, nello specifico una http-GET di questo tipo:

http://[ip_server]/?tipo=temperatura&luogo=bagno&dato=22,5

Sul server è attivo un server web che riceve la chiamata, legge i dati e li memorizza nel DB. Tutto facile, anche a livello di codice.

Esiste però un protocollo, sviluppato specificamente per i sensori IoT, che ha alcune caratteristiche molto interessanti:

  • E’ molto molto facile da implementare lato server
  • E’ molto molto facile da implementare su qualunque dispositivo (nel mio caso sulle schede ESP8266), ci sono milioni di librerie
  • Ha pochissimo overhead di dati (vedi dopo)
  • La trasmissione del dato consuma molta meno energia di una chiamata http. Questo allunga la durata delle batterie, cosa molto interessante
  • Funziona su qualunque mezzo di trasmissione.

Cos’è l’overhead di dati?

Quando viene trasmesso un dato sui canali digitali, una serie di bit all’interno del pacchetto che trasporta il dato è dedicata al protocollo di trasmissione. Senza scendere troppo nel dettaglio, ogni volta che devo trasmettere un numero (una temperatura, ad esempio), oltre ai Byte necessari per la sua trasmissione, devo comunicare nel modo corretto prima con la rete e poi con il server. Questa cosa in http consuma un sacco di bytes, in MQTT molti di meno. Meno bytes da trasmettere equivale a meno energia consumata e vita più lunga delle batterie. Per chi vuole approfondire, questo è un test pratico del consumo di dati tra http e MQTT.

Andiamo sul pratico

Come prima cosa è necessario installare il server MQTT, che il protocollo chiama Broker. Il Broker non fa altro che stare lì in attesa che qualcuno gli invii un messaggio, per poi renderlo disponibile a tutti quelli che sono iscritti a broker e a un determinato argomento.

Dai, la faccio un po’ più semplice.

Ogni sensore che ha un dato da comunicare parla con il server [broker] e gli dice:

“Ciao, io sono il sensore di temperatura del balcone [topic], questa è la temperatura che leggo: 20°C [payload]”

Il Broker riceve la comunicazione e dice

“Questo messaggio è per tutti quelli a cui interessa [sono iscritti] la temperatura del balcone [topic], l’ultima lettura è 20°C [payload]”

Tutti i dispositivi in rete che sono interessati [iscritti] alla temperatura del balcone [topic] riceveranno il messaggio e ne faranno quel che vogliono. Nel caso di questo progetto, ci sarà un programma, sempre installato sul server, che prenderà il dato e lo memorizzerà nel database.

Per avere informazioni molto più dettagliate sul protocollo basta fare riferimento al sito ufficiale di MQTT.

Non avevo detto di andare sul pratico?

Allora è il caso di mettere mano al server.

Una volta fatto accesso via SSH è necessario installare mosquitto, il server MQTT che farà da broker. Tutti comandi sono per un PC/Raspberry che usa una distribuzione Ubuntu/Debian.

sudo apt-get install mosquitto

Fatto. Il broker è pronto ed operativo. E’ però necessario fare in modo che il sistema venga avviato in automatico al riavvio del sistema.

sudo systemctl enable mosquitto.service

E come si fa ad essere certi che il servizio (su Linux si chiama demone, ad essere precisi) sia operativo?

sudo service mosquitto status

Il risultato dovrebbe essere più o meno questo

● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker    Loaded: loaded (/etc/init.d/mosquitto; generated)    
Active: active (running) since Wed 2018-12-26 17:13:45 CET; 4min 49s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/mosquitto.service
└─737 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

dic 26 17:13:45 lubunuc systemd[1]: Starting LSB: mosquitto MQTT v3.1 message broker...
dic 26 17:13:45 lubunuc mosquitto[731]: * Starting network daemon: mosquitto
dic 26 17:13:45 lubunuc mosquitto[731]: ...done.
dic 26 17:13:45 lubunuc systemd[1]: Started LSB: mosquitto MQTT v3.1 message broker.

Come ogni servizio in Linux è possibile fermarlo, avviarlo, riavviarlo

sudo service mosquitto sart/stop/restart #uno dei tre, ovviamente

Il server è attivo, ma è necessario capire se funziona correttamente, quindi serve installare i client di mosquitto

sudo apt-get install mosquitto-clients

Per fare le prove è necessario avere due sessioni SSH aperte sul server. Nella prima si deve sottoscrivere un Topic in modo da vedere cosa iene pubblicato sul nostro server, in quel topic. Questo lo si fa nella prima finestra

mosquitto_sub -d -t topicDiProva

Abbiamo fatto la sottoscrizione a topicDiProva, adesso è necessario mandare un messaggio in questo topic. Lo facciamo dalla seconda finestra

mosquitto_pub -d -t topicDiProva -m "Ciao!"

Abbiamo mandato il messaggio Ciao! al topic topicDiProva con questo risultato a video

Client mosqpub|5326-lubunuc sending CONNECT 
Client mosqpub|5326-lubunuc received CONNACK
Client mosqpub|5326-lubunuc sending PUBLISH (d0, q0, r0, m1, 'topicDiProva', ... (5 bytes))
Client mosqpub|5326-lubunuc sending DISCONNECT

E nella finestra dove avevamo il programma che aveva sottoscritto il topicDiProva?

Client mosqsub|4784-lubunuc received PUBLISH (d0, q0, r0, m0, 'topicDiProva', ... (5 bytes)) 
Ciao!

Il sistema funziona, possiamo iniziare ad usarlo, con i due passi seguenti:

  • Creare un programma che riceva i dati e li memorizzi nel DB
  • Creare un sensore che invii i dati al broker.

Nota finale

Il broker MQTT potrebbe anche essere installato su un server in cloud, come ad esempio una VPS, in questo caso è necessario passare la comunicazione in SSL e autenticarla. Nel caso di questo progetto tutto passa sulla rete di casa, è indipendente dalla connessione Internet e non ci preoccupa se i dati passano in chiaro, a casa nostra non ci sono malintenzionati nella nostra rete (o almeno ce lo si augura).

Il progetto è rilasciato con licenza GPL V.3 (Open Source), quindi puoi prenderlo, fartelo a casa, modificarlo e pubblicarlo a nome tuo. Se lo condividi modificato devi citare questo sito (www.iltucci.com) come fonte principale.

2 pensieri riguardo “Registrare i dati dei sensori via MQTT”

Nota importante, da leggere prima di commentare

Questo è un blog scritto per passione, non fornisco quindi risposte di tipo professionale, se avete bisogno di un aiuto tecnico rivolgetevi ad un professionista di fiducia, non offendetevi se mi astengo dal rispondere. Vi ringrazio per la comprensione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.