Quando un sensore di temperatura deve comunicare il suo valore, il modo più intuitivo sarebbe inviarlo direttamente a chi lo usa: l'hub, l'app, il termostato. Con decine di dispositivi questa rete di collegamenti diretti diventa ingestibile. MQTT risolve il problema con un'idea semplice: tutti parlano con un solo intermediario, il broker, che smista i messaggi a chi li ha chiesti.
Il modello publish/subscribe
In MQTT esistono due ruoli, che uno stesso dispositivo può avere contemporaneamente.
- Chi pubblica (publish) invia un messaggio su un certo argomento, il topic.
- Chi si iscrive (subscribe) a quel topic riceve tutti i messaggi che vi vengono pubblicati.
Chi pubblica non sa chi riceverà il messaggio, e chi riceve non sa chi l'ha inviato. Il broker fa da centralino. Questo disaccoppiamento è il motivo per cui MQTT si adatta così bene all'IoT: aggiungere un nuovo dispositivo che ascolta non richiede di modificare quelli esistenti.
I topic
Un topic è una stringa gerarchica separata da barre, simile al percorso di una cartella:
casa/soggiorno/temperatura
casa/soggiorno/umidita
casa/cucina/luce/stato
casa/cucina/luce/comando
Per iscriversi a più topic insieme si usano due caratteri jolly:
+sostituisce un solo livello:casa/+/temperaturariceve la temperatura di tutte le stanze;#sostituisce tutti i livelli successivi:casa/cucina/#riceve tutto ciò che riguarda la cucina.
Una buona struttura dei topic, decisa all'inizio, rende il sistema leggibile anche dopo anni. Conviene separare i topic di stato, su cui il dispositivo comunica come si trova, da quelli di comando, su cui riceve ordini.
Livelli di qualità del servizio (QoS)
MQTT permette di scegliere quanto garantire la consegna di ogni messaggio.
| QoS | Garanzia | Uso tipico |
|---|---|---|
| 0 | al massimo una volta, senza conferma | letture frequenti di sensori |
| 1 | almeno una volta, possibili duplicati | comandi e notifiche |
| 2 | esattamente una volta | casi in cui un duplicato crea problemi |
Per un sensore che invia la temperatura ogni minuto, perdere una lettura non è grave: QoS 0 basta. Per il comando di chiusura di un'elettrovalvola conviene almeno QoS 1. QoS 2 è più pesante e serve raramente in casa.
Messaggi retained e last will
Due funzioni rendono MQTT particolarmente pratico.
- Retained: il broker conserva l'ultimo messaggio di un topic e lo consegna subito a chi si iscrive dopo. Un'app che si apre conosce immediatamente lo stato della luce senza aspettare il prossimo aggiornamento.
- Last Will and Testament: al momento della connessione il dispositivo comunica al broker un messaggio da pubblicare se si disconnette in modo anomalo. Tipicamente si pubblica «offline» su un topic di disponibilità, così l'hub sa che il dispositivo non risponde.
Un broker in casa
Il broker più diffuso per uso domestico è Mosquitto, leggero e open source. Gira senza problemi su un Raspberry Pi o su un mini PC, spesso accanto all'hub domotico. Molti dispositivi con firmware alternativo, schede ESP32 e strumenti come Zigbee2MQTT lo usano come punto di scambio.
Per verificare che tutto funzioni bastano due comandi dei client a riga di comando, in due finestre diverse:
mosquitto_sub -h 192.168.1.10 -t 'casa/#' -v
mosquitto_pub -h 192.168.1.10 -t 'casa/test' -m 'ciao'
Se nella prima finestra compare il messaggio, broker e rete sono a posto.
Sicurezza: le impostazioni minime
Un broker configurato male permette a chiunque sulla rete di leggere tutti i dati e inviare comandi. Le regole di base sono poche:
- autenticazione obbligatoria con utente e password, disattivando l'accesso anonimo;
- utenti distinti per dispositivi diversi, con permessi limitati ai topic necessari;
- cifratura TLS, soprattutto se il traffico esce dalla rete locale: la porta standard senza cifratura è la 1883, quella con TLS la 8883;
- nessuna esposizione diretta su internet: per l'accesso da fuori meglio passare da una VPN.
Quando MQTT non serve
Con pochi dispositivi dello stesso ecosistema, o con dispositivi Matter, l'hub gestisce già la comunicazione e MQTT aggiunge solo complessità. Diventa utile quando si costruiscono dispositivi propri, si integrano marchi diversi o si vogliono far parlare tra loro sistemi separati.
In sintesi
- MQTT usa un broker centrale e il modello publish/subscribe per far comunicare i dispositivi.
- I topic sono gerarchici; i jolly
+e#permettono iscrizioni multiple. - Il livello QoS va scelto in base all'importanza del messaggio.
- Retained e Last Will danno stato immediato e rilevamento delle disconnessioni.
- Autenticazione, permessi per topic e niente esposizione su internet sono il minimo indispensabile.