In breve
MQTT (Message Queuing Telemetry Transport) è un protocollo di messaggistica leggero, basato su pubblicazione e sottoscrizione, creato per dispositivi con collegamento scadente, poca memoria e una batteria che deve durare.
Fu creato nel 1999 da Andy Stanford-Clark di IBM e Arlen Nipper di Arcom, per portare via satellite la telemetria degli oleodotti. Le condizioni erano spietate: la banda costava cara e scarseggiava, il collegamento cadeva di continuo e i dispositivi erano gracili. Quei vincoli hanno plasmato tutto il protocollo: un'intestazione minuscola, un'unica connessione di lunga durata e la capacità di sopravvivere a una caduta senza perdere messaggi.
Oggi MQTT è uno standard OASIS, e la versione 3.1.1 è stata inoltre adottata come norma internazionale ISO/IEC 20922. Ha superato da tempo l'industria petrolifera: case intelligenti, contatori, macchine utensili, automobili e apparecchi medicali ci girano sopra.
Il costo aggiuntivo minimo per messaggio è di due byte. Una singola richiesta HTTP, per confronto, spende centinaia di byte in intestazioni prima di qualsiasi contenuto. Quando un dispositivo riporta una temperatura ogni secondo tramite un modem cellulare in mezzo alla campagna, quella differenza decide il progetto.
Come funziona: pubblicare, sottoscrivere e il broker
In HTTP il client chiede e il server risponde. In MQTT nessuno chiede nulla a nessuno: un dispositivo pubblica un messaggio in un topic, e tutti coloro che hanno sottoscritto quel topic lo ricevono. Il mittente non sa chi legge, né se qualcuno legge; il destinatario non sa chi ha inviato. L'unica cosa che li lega è il nome del topic.
Al centro c'è sempre un broker — un server che tiene le connessioni, custodisce l'albero delle sottoscrizioni e distribuisce i messaggi. Senza di lui il modello non funziona: è il broker a trasformare «inviato nel vuoto» in «consegnato a tutti quelli a cui serve».
Che cosa fa il broker
- Accetta e mantiene le connessioni: migliaia insieme, per anni senza interruzione.
- Verifica chi si collega: nome utente e password, un certificato o un token.
- Decide che cosa può fare ogni client: i permessi di pubblicare e sottoscrivere si concedono per topic.
- Confronta ogni messaggio pubblicato con l'albero delle sottoscrizioni e ne distribuisce le copie.
- Conserva lo stato: ultimi valori noti (retain), code per i client assenti e conferme rimaste in sospeso.
- Tiene d'occhio chi è vivo e pubblica il testamento di chi sparisce.
Disaccoppiare mittente e destinatario non è un dettaglio tecnico, ma il senso stesso del modello. Puoi sostituire un sensore, aggiungere un secondo consumatore o agganciare un'analisi di lato senza riscrivere nulla: tutti parlano con un topic, non tra loro.
Topic e caratteri jolly
Un topic è una stringa di livelli separati da barre. Nulla va registrato in anticipo: pubblicare in un topic nuovo lo crea sul momento.
ufficio/piano2/stanza14/temperatura
ufficio/piano2/stanza14/umidita
ufficio/piano2/stanza15/temperatura
Una sottoscrizione può abbracciare interi rami grazie a due caratteri jolly:
| Jolly | Significato | Esempio | Che cosa abbraccia |
|---|---|---|---|
+ | esattamente un livello | ufficio/piano2/+/temperatura | la temperatura di ogni stanza del secondo piano |
# | tutto ciò che sta sotto, questo livello compreso | ufficio/# | tutti i topic dell'ufficio |
Il jolly # vale solo come ultimo livello: ufficio/#/temperatura non è un filtro valido. I topic distinguono maiuscole e minuscole, e ufficio/piano2 e ufficio/piano2/ sono due topic diversi.
$ sono riservati al server stesso — di solito $SYS, che porta le statistiche del broker. I caratteri jolly non li raggiungono: sottoscrivere # non mostrerà $SYS, che richiede un filtro esplicito.Qualità del servizio: QoS 0, 1 e 2
MQTT lascia scegliere quanta fatica spendere per consegnare ogni messaggio. Il livello si imposta separatamente in pubblicazione e in sottoscrizione; vale il minore dei due.
| Livello | Garanzia | Come funziona | Quando serve |
|---|---|---|---|
| QoS 0 | al massimo una volta | spedisci e dimentica, senza conferma | telemetria frequente, in cui la lettura successiva arriva comunque un secondo dopo |
| QoS 1 | almeno una volta | il destinatario risponde PUBACK; il silenzio significa rispedire | eventi che non si possono perdere ma che si possono vedere due volte |
| QoS 2 | esattamente una volta | un handshake di quattro pacchetti che scarta i duplicati | comandi e fatturazione, dove una ripetizione è un difetto |
Il costo sale con la garanzia: QoS 2 sono quattro pacchetti invece di uno, più stato a entrambe le estremità. Resisti alla tentazione di «usare 2 dappertutto per sicurezza»: diecimila sensori che pubblicano ogni secondo in QoS 2 caricano un broker di un ordine di grandezza in più, senza alcun vantaggio.
Retain, Last Will, sessioni e keep-alive
Retain — l'ultimo valore noto
Un messaggio ordinario raggiunge solo chi è iscritto in quel momento. Un messaggio con il flag retain viene inoltre ricordato dal broker e consegnato a ogni nuovo iscritto nell'istante in cui si iscrive. È la risposta standard all'eterno problema del pannello che si apre vuoto e tale resta finché un sensore non si degna di inviare la lettura successiva.
Un topic conserva esattamente un messaggio ritenuto: l'ultimo. Per cancellarlo, pubblica un payload vuoto nello stesso topic con il flag retain.
Last Will — un messaggio per quando cade la linea
Nel collegarsi, un client può consegnare al broker un testamento: un topic, un payload e le sue opzioni. Se la connessione muore in malo modo — senza pacchetto DISCONNECT —, il broker pubblica quel messaggio al posto suo. Lo schema classico è un topic ritenuto device/42/status che riceve online alla connessione e porta offline come testamento. Il sistema sa sempre chi è presente, senza alcun sondaggio.
Sessioni: pulite e persistenti
Una sessione pulita dura esattamente quanto la connessione: alla disconnessione le sottoscrizioni sono dimenticate. Una persistente sopravvive alla caduta: il broker ricorda le sottoscrizioni e accoda i messaggi QoS 1 e 2 mentre il client è assente, per consegnargli l'arretrato al ritorno. Per un dispositivo che si sveglia una volta all'ora, è l'unico modo di non perdere nulla.
Keep-alive — accorgersi che la linea è morta
Una connessione TCP interrotta può sembrare perfettamente viva a entrambe le estremità per parecchio tempo. Perciò il client dichiara un intervallo di keep-alive e, non avendo altro da dire, invia un ping. Non sentendo nulla per un intervallo e mezzo, il broker dà il client per scomparso, chiude la connessione e pubblica il suo testamento.
Le versioni: 3.1, 3.1.1 e 5.0
Nella pratica se ne incontrano tre, e le differenze non sono cosmetiche.
| Versione | Anno | Stato | Che cosa conta |
|---|---|---|---|
| MQTT 3.1 | 2010 | superata | la specifica IBM; identificatori client limitati a 23 caratteri; oggi non c'è motivo di sceglierla |
| MQTT 3.1.1 | 2014 | standard OASIS, ISO/IEC 20922 | la versione più diffusa; supportata praticamente da tutto |
| MQTT 5.0 | 2019 | standard OASIS | una revisione sostanziale: proprietà dei pacchetti, codici di motivo, sottoscrizioni condivise |
A parte sta MQTT-SN, un protocollo fratello per reti senza TCP: ZigBee, collegamenti radio, UDP. Non è «una versione di MQTT» ma una specifica a sé; a quelle reti si dà un gateway che traduce il traffico in MQTT ordinario.
Che cosa porta davvero MQTT 5.0
La versione 5 è nata da fastidi accumulati sul campo. Le cose che pesano di più:
- Codici di motivo. In 3.1.1 un rifiuto sembrava un socket chiuso in silenzio, e restava da indovinare. In 5.0 il server dice di che si tratta: password errata, nessun permesso su quel topic, pacchetto troppo grande.
- Proprietà dei pacchetti. Un messaggio può portare metadati:
Content Type,Correlation Data, coppie chiave-valore a piacere. Prima tutto questo veniva infilato nel payload o nel nome del topic. - Richiesta e risposta. I campi
Response TopiceCorrelation Datarendono il normale RPC uno schema di prima classe invece di una convenzione arrangiata. - Sottoscrizioni condivise tramite
$share/gruppo/filtro: più istanze di un consumatore si dividono il flusso. È bilanciamento del carico e tolleranza ai guasti a livello di protocollo. - Durate di sessioni e messaggi.
Session ExpiryeMessage Expirypermettono di dire «tienilo un giorno, poi dimenticalo» invece della scelta secca tra pulita e non pulita. - Controllo di flusso.
Receive Maximumlimita quanti messaggi non confermati viaggiano insieme, eMaximum Packet Sizeprotegge un dispositivo piccolo da un pacchetto che non riesce a digerire. - Alias dei topic. Un nome lungo viene inviato una volta e poi sostituito da un numero di due byte: un risparmio vero sulle gerarchie profonde.
- Identificatori di sottoscrizione, No Local, Retain As Published, Retain Handling. Piccolezze che eliminano vecchie trappole: sentire l'eco dei propri messaggi, una valanga di ritenuti a ogni riconnessione, non sapere da quale sottoscrizione sia arrivato un messaggio.
- Testamento differito. Il
Will Delay Intervalevita che un'oscillazione momentanea faccia scattare un allarme: il testamento viene pubblicato solo se il client non torna in tempo.
La conclusione pratica: comincia i progetti nuovi in 5.0. Sottoscrizioni condivise e codici di errore comprensibili risparmiano settimane di debug, e la compatibilità con i dispositivi vecchi non si perde.
MQTT contro HTTP e le alternative
«Perché MQTT se esiste REST?» è una domanda legittima. La differenza non è di moda, ma di direzione e di costo di una conversazione.
| MQTT | HTTP / REST | |
|---|---|---|
| Modello | pubblicazione e sottoscrizione, molti a molti | richiesta e risposta, uno a uno |
| Chi comincia | entrambi i lati: il server può inviare in qualsiasi momento | solo il client; il server tace finché non lo interroghi |
| Connessione | una sola, di lunga durata | di solito una nuova per ogni richiesta |
| Costo aggiuntivo | da 2 byte | centinaia di byte di intestazioni |
| Venire a sapere di un cambiamento | arriva da solo | interrogare a intervalli |
| Comportamento alla caduta | code, rinvii, retain, un testamento | la richiesta semplicemente fallisce |
| Più forte in | telemetria, comandi, eventi | documenti, file, integrazioni, il web |
L'interrogazione periodica lo rende evidente. Per sapere di un evento entro un secondo via HTTP, mille dispositivi devono chiedere mille volte al secondo, e quasi ogni risposta sarà «niente di nuovo». In MQTT l'evento arriva da solo nell'istante in cui accade, e nel frattempo non costa traffico.
E CoAP, AMQP e WebSocket
- CoAP è REST su UDP per nodi molto piccoli. Più leggero di MQTT, ma non offre né code né consegna affidabile senza fatica.
- AMQP è più pesante e più ricco: instradamento elaborato, transazioni, code di livello aziendale. Sensato tra server, eccessivo per un sensore.
- WebSocket è un trasporto, non un'alternativa: MQTT stesso viaggia su WebSocket per funzionare dentro un browser.
- Sparkplug B non è un rivale ma uno strato sopra MQTT: detta come nominare i topic e codificare i payload nei sistemi industriali, perché software SCADA di fornitori diversi capiscano gli stessi dati.
Trasporto, porte e payload
MQTT viaggia su TCP e chiede soltanto una consegna affidabile e ordinata. Le porte consuete:
| Porta | Che cos'è |
|---|---|
1883 | MQTT su TCP, non cifrato |
8883 | MQTT su TLS — la porta standard di una connessione protetta |
80 / 443 | MQTT su WebSocket: spesso l'unica via d'uscita da un browser o attraverso un firewall aziendale rigido |
Per il protocollo un payload è solo una sequenza di byte. MQTT non sa nulla del contenuto e non impone nulla: JSON, CBOR, protobuf, un semplice numero o un'immagine vanno bene allo stesso modo. Il limite formale è di 256 MB, ma in pratica tutto ciò che supera qualche centinaio di kilobyte spetta a HTTP, mentre su MQTT viaggia soltanto un collegamento.
Nella pratica domina JSON: una persona lo legge, ogni linguaggio lo analizza ed è abbastanza compatto. Su un collegamento stretto un formato binario si guadagna il posto — ed è esattamente lì che aiuta la proprietà Content Type di MQTT 5.0, dichiarando con onestà che cosa c'è dentro.
Sicurezza
MQTT non cifra nulla da solo: sulla porta 1883 nome utente e password viaggiano in chiaro. La sicurezza nasce da tre strati indipendenti, e nessuno di essi è facoltativo.
Cifrare il canale
TLS sulla porta 8883. Per i dispositivi troppo deboli per TLS, l'unica scelta decorosa è tenerli su una rete isolata e non lasciar uscire nulla se non attraverso un gateway.
Autenticazione
Il classico è nome utente e password nel pacchetto CONNECT. Più rigoroso: i certificati client, con il dispositivo che presenta il proprio e il broker che ne verifica la firma. Più flessibile: JWT, con il dispositivo che porta un token firmato e a tempo, e la revoca che non richiede modifiche sul broker. I broker migliori sanno anche leggere gli account da un database esterno, da un file CSV o da un servizio HTTP, così l'elenco dei dispositivi non deve esistere in doppia copia.
Permessi sui topic
L'autenticazione risponde a «chi sei»; l'autorizzazione a «che cosa puoi fare». Le liste di controllo degli accessi dicono quali topic un client può leggere e quali può scrivere. L'impostazione giusta è negare tutto tranne ciò che è esplicitamente consentito.
#. Basta che qualcuno estragga un'immagine del firmware perché un attaccante veda tutto il traffico del sistema e possa comandare qualsiasi dispositivo. Confina ogni dispositivo al proprio ramo: device/{id}/# e nulla di più.A questo si aggiungono limiti di cadenza in pubblicazione (perché un solo dispositivo impazzito non seppellisca il broker), una dimensione massima dei pacchetti e la solita igiene di rete: il pannello del broker non ha nulla da fare affacciato su internet.
Dove si usa davvero MQTT
Casa intelligente e automazione degli edifici
Il campo più vasto per numeri. Home Assistant, Zigbee2MQTT, ESPHome e openHAB dialogano tutti attraverso un broker MQTT, che fa anche da collante tra apparecchi di produttori diversi: una presa, un sensore di perdite e un termoregolatore di tre marche collaborano alla perfezione, perché ciascuno si limita a scrivere nel proprio topic.
Industria e SCADA
Letture di macchina, stato della linea, contatori delle ore. La disposizione classica è un gateway che legge Modbus od OPC UA dagli impianti e ripubblica via MQTT, dopo di che SCADA, uno storico e un sistema di manutenzione predittiva consumano tutto insieme senza darsi fastidio. È qui che Sparkplug B e le sottoscrizioni condivise di MQTT 5.0 si guadagnano il posto.
Contatori e servizi pubblici
Contatori d'acqua, gas, elettricità e calore: dispositivi a batteria che si svegliano una volta all'ora, comunicano una lettura e tornano a dormire. Qui sessioni persistenti e retain fanno il grosso del lavoro: il server vede sempre l'ultimo valore anche se un contatore si farà vivo solo di sera.
Trasporti e telematica
Coordinate, consumo di carburante, stato del vano refrigerato, comportamento del conducente. Il collegamento è una rete cellulare che sparisce nei tunnel e fuori città. Code e riconsegna dopo la riconnessione trasformano una connessione a brandelli in un flusso continuo di dati.
Energia, agricoltura, sanità
Impianti solari e cabine elettriche, sistemi di irrigazione e stazioni meteo, monitor per pazienti e frigoriferi per vaccini. Ciò che hanno in comune: molti punti, un collegamento debole, eventi che non si possono perdere e la necessità di sapere subito di un guasto.
Città intelligenti e logistica
Illuminazione pubblica, parcheggi, cassonetti che segnalano quanto sono pieni, tracciamento delle merci e temperatura della catena del freddo. Decine di migliaia di dispositivi che inviano messaggi brevi e radi: esattamente il profilo di carico per cui MQTT è stato progettato.
Progettare i topic: decisioni che conviene prendere presto
Lo schema dei topic è l'API del tuo sistema. Cambiarlo dopo fa male, perché firmware e server vanno aggiornati insieme. Qualche regola che fa risparmiare tempo.
- Dal generale al particolare.
stabilimento/capannone3/linea2/macchina7/temperaturapermette di sottoscrivere a qualsiasi livello. L'ordine inverso rende inutili i caratteri jolly. - Dai all'identificatore del dispositivo un livello suo. È questo che consente a una sola regola ACL di confinare un dispositivo al proprio ramo.
- Nessuna barra iniziale.
/ufficio/tempcrea un primo livello vuoto: lecito, ma fonte duratura di confusione. - Solo lettere latine, cifre, trattino e trattino basso. Gli spazi e i caratteri
+,#e$nei nomi provocano guasti che nessuno si aspetta. - Non codificare mai dati variabili nel topic.
sensor/42/temp/21.5è un errore: il valore va nel payload, altrimenti il broker si ritrova con un albero di topic senza limiti e retain diventa inutile. - Separa lo stato dai comandi. Per esempio
device/42/stateper ciò che il dispositivo comunica edevice/42/cmdper ciò che gli si ordina. Altrimenti l'eco dei propri comandi finirà per mandare in circolo la logica. - Retain per lo stato, non per la telemetria. Retain serve per l'«ultimo stato noto» e non ha senso per un flusso di letture.
v1 in testa al topic oggi non costa nulla e, tra due anni, ti permetterà di distribuire un nuovo formato di payload senza rompere un parco di dispositivi vecchi.Scegliere un broker
I broker sono molti, e la scelta di solito si riduce a una manciata di domande.
- MQTT 5.0 è supportato per intero? Il supporto parziale è frequente, e lo si scopre quasi sempre nel momento peggiore.
- Si vede che cosa succede? Poter osservare chi è connesso, quali topic sono vivi e che cosa passa in questo momento fa risparmiare ore di debug. Un broker senza pannello trasforma ogni problema in archeologia dei log.
- Come si creano i dispositivi? Con migliaia di essi, farlo a mano è escluso: serve un'API o account in un database esterno.
- Sopravvive a un riavvio? Messaggi ritenuti, sessioni persistenti e code devono arrivare al disco, altrimenti un riavvio pianificato significa perdere dati.
- Quali limiti offre? Un dispositivo impazzito non deve mettere in ginocchio il sistema: i limiti di cadenza e di volume contano.
- Quanto costa e dove gira? Un servizio in cloud è comodo finché non comincia a farsi pagare a messaggio; un server proprio va amministrato, ma i dati restano tuoi.
Per un'installazione piccola o media — da una casa intelligente a uno stabilimento con qualche migliaio di punti — di norma basta un solo broker su una macchina modesta. Il clustering serve molto meno spesso di quanto sembri in fase di progetto; più spesso conviene collegare due broker indipendenti con un bridge che inoltri solo i topic che contano.
Partire in cinque minuti
Il modo più rapido per capire tutto questo è avviare un broker e guardare i messaggi di persona. Su Debian o Ubuntu sono tre comandi:
sudo wget -qO /usr/share/keyrings/elx-repo.gpg https://repo.um-d.ru/elx-repo.gpg
echo "deb [signed-by=/usr/share/keyrings/elx-repo.gpg] https://repo.um-d.ru stable main" | sudo tee /etc/apt/sources.list.d/elx-repo.list
sudo apt-get update && sudo apt-get install elxmqttbroker
Il pannello si apre su http://tuo-server:8567. Crea un utente e prova lo scambio con un client qualsiasi — gli strumenti da console di mosquitto, per esempio:
# in una finestra — sottoscrivere tutto ciò che il dispositivo invia
mosquitto_sub -h localhost -u sensor-42 -P password -t 'sensor-42/#' -v
# in un'altra — pubblicare una lettura
mosquitto_pub -h localhost -u sensor-42 -P password -t 'sensor-42/temp' -m '21.5'
# lo stesso, ma ricordato per i futuri iscritti
mosquitto_pub -h localhost -u sensor-42 -P password -t 'sensor-42/temp' -m '21.5' -r
Poi gioca con il flag retain, scollega un iscritto e guarda che cosa si accumula in una sessione persistente, imposta un testamento e stacca il cavo. Mezz'ora così insegna più di qualsiasi articolo, questo compreso.
Risposte rapide
Che cos'è MQTT in parole semplici?
È un modo per far scambiare ai dispositivi messaggi brevi tramite un intermediario. Un dispositivo invia un messaggio a un «topic» con un nome, e ogni programma che ha sottoscritto quel topic lo riceve subito. Mittente e destinatario non sanno nulla l'uno dell'altro, ed è proprio questo a permettere di cambiare o aggiungere l'uno o l'altro in modo indipendente.
A che cosa mi serve un broker MQTT?
Il broker è il server che tiene le connessioni con tutti i dispositivi, ne verifica i permessi, confronta i messaggi pubblicati con le sottoscrizioni e distribuisce le copie. MQTT non funziona senza di lui: pubblicazione e sottoscrizione si incontrano dentro il broker.
In che cosa MQTT 5.0 differisce da 3.1.1?
Soprattutto: codici di motivo comprensibili al posto di una connessione chiusa in silenzio, proprietà dei pacchetti che portano metadati, richiesta e risposta come schema di prima classe, sottoscrizioni condivise per distribuire il carico tra consumatori, durate controllabili di sessioni e messaggi, controllo di flusso e alias dei topic che fanno risparmiare banda.
Conviene passare a MQTT 5.0?
Per i progetti nuovi sì: i vantaggi sono reali e la compatibilità si mantiene. Un sistema 3.1.1 esistente non ha bisogno di una migrazione urgente: le due versioni girano insieme sullo stesso broker, quindi i dispositivi possono essere spostati poco per volta, man mano che si aggiorna il firmware.
Quale QoS devo usare?
QoS 0 per la telemetria frequente, dove perdere una lettura non conta. QoS 1 per gli eventi che non si possono perdere, purché il destinatario sappia scartare i duplicati. QoS 2 solo per comandi e fatturazione, dove rielaborare è inaccettabile. Mettere QoS 2 dappertutto «per sicurezza» è il modo più semplice di sovraccaricare un broker.
Che cosa significa retain in MQTT?
È un flag che dice al broker di ricordare un messaggio e di consegnarlo a ogni nuovo iscritto nel momento in cui si iscrive. Per ogni topic se ne conserva solo l'ultimo. È la risposta standard a «mostra subito lo stato attuale invece di aspettare il prossimo aggiornamento del sensore». Si cancella pubblicando un payload vuoto con lo stesso flag.
Che cos'è un Last Will?
Un messaggio che il client consegna al broker al momento della connessione e che il broker pubblica al posto suo se la connessione muore senza una disconnessione pulita. Di solito serve a segnare un dispositivo come offline, così il sistema viene a sapere della perdita senza sondaggi.
MQTT è sicuro?
Il protocollo non cifra nulla da solo: sulla porta 1883 la password viaggia in chiaro. La sicurezza nasce da TLS sulla porta 8883, dall'autenticazione con password, certificato o JWT, e dalle liste di accesso per topic che funzionano negando tutto ciò che non è esplicitamente consentito.
Quanti dispositivi regge un broker?
Dipende dal broker e dal carico, ma come ordine di grandezza: un solo processo su un server comune regge senza sforzo decine di migliaia di connessioni simultanee con telemetria tipica. Il limite di solito non è il numero di dispositivi, ma il ritmo dei messaggi e il QoS richiesto.
MQTT funziona nel browser?
Sì, tramite MQTT su WebSocket. I browser non possono aprire connessioni TCP arbitrarie, perciò il protocollo viene avvolto in un WebSocket — il che permette a un pannello web di sottoscrivere i topic direttamente, senza server intermedi.
Che cosa significano + e # nei topic?
Sono caratteri jolly per le sottoscrizioni. Il + sostituisce esattamente un livello del topic; il # copre tutti i livelli restanti e vale solo alla fine di un filtro. In un topic con caratteri jolly non si può pubblicare: servono soltanto per sottoscrivere.
Perché MQTT è meglio di HTTP per l'internet delle cose?
Non richiede interrogazioni periodiche: il messaggio arriva da solo quando l'evento accade. Il costo aggiuntivo parte da due byte invece che da centinaia, la connessione è unica e duratura, e code, rinvii e retain portano il sistema attraverso una caduta senza perdere dati. Per rapporti, file e integrazioni, HTTP resta lo strumento migliore.