Il Protocollo MQTT spiegato in modo semplice e chiaro per i non addetti ai lavori.
Immaginiamo di essere in un ristorante di Sushi, quelli con il nastro trasportatore che gira per l’intera sala.
Siamo andati con un gruppo nutrito di amici e ci rendiamo conto che su alcuni tavoli manca la salsa di soia mentre su altri manca il wasabi e c’è una sola bottiglia di salsa di soia senza sale in tutto il locale.
Se dovessimo gestire la situazione seguendo il protocollo HTTP dovremmo agire come segue:
In questo caso i client(i) del ristorante devono rivolgersi necessariamente al cameriere (il server!) quando hanno bisogno di qualcosa, oppure quando vogliono consegnargli le salse che non stanno usando e che potrebbero essere utili ad altri avventori. Questo, tuttavia, accade senza che vi sia mai una comunicazione tra i presenti in sala, che hanno come unico riferimento il cameriere.
Se dovessimo gestire la situazione seguendo il protocollo MQTT potremmo invece agire come segue:
In questo caso il nastro trasportatore è il broker e i client(i) mettono e prendono quello che vogliono sul nastro in modo da condividere risorse e informazioni.
Non è sempre detto che usare il nastro trasportatore sia un metodo efficace per ottenere quello di cui si ha bisogno. Per esempio, se un client(e) volesse delle bacchette nuove, non potrebbe certo prendere quelle usate da qualcun altro; se volesse chiedere il conto, non potrebbe certo essere un commensale a gestire la cassa. Ci sarà per forza bisogno di un cameriere che riceva le richieste dei client(i) e le gestisca singolarmente.
HTTP dunque ha senso quando:
Detta in termini più tecnici le domande di base sono:
Sul nastro trasportatore i clienti possono condividere delle risorse e compiere piccole azioni (ad esempio un commensale gentile potrebbe sbucciare i mandarini per tutti e poi rimetterli sul nastro già sbucciati), ma se serve l’intervento di forze esterne (le bacchette nuove, il conto, la posizione del bagno ecc.) ci sarà sempre bisogno di un server a cui rivolgere le chiamate specifiche.
I più ingegnosi di voi potrebbero aver pensato che si possa usare il nastro trasportatore anche per comunicare con il cameriere, ad esempio scrivendo un bigliettino con la richiesta per poi metterla sul nastro aspettando che il cameriera la veda, la legga e lasci a sua volta sul nastro trasportatore una risposta (delle bacchette nuove, il conto, un bigliettino con le indicazioni per il bagno ecc.).
Questo tipo di approccio presenta evidenti problemi:
In concreto, simulare un’interazione del tipo domanda-risposta (HTTP, domanda al cameriere) con la condivisione diretta di risorse (MQTT, nastro trasportatore) è solitamente sconsigliato ed eccessivamente complesso.
I più ingegnosi di voi potrebbero aver pensato che si possa usare il nastro trasportatore anche per comunicare con il cameriere, ad esempio scrivendo un bigliettino con la richiesta per poi metterla sul nastro aspettando che il cameriera la veda, la legga e lasci a sua volta sul nastro trasportatore una risposta (delle bacchette nuove, il conto, un bigliettino con le indicazioni per il bagno ecc.).
Questo tipo di approccio presenta evidenti problemi:
In concreto, simulare un’interazione del tipo domanda-risposta (HTTP, domanda al cameriere) con la condivisione diretta di risorse (MQTT, nastro trasportatore) è solitamente sconsigliato ed eccessivamente complesso.
Nella nostra analogia del ristorante, il nastro trasportatore rappresenta il broker MQTT che consegna a tutti i client(i) del locale una risorsa che gli è stata affidata.
Così facendo, però, tutti i client(i) del locale si vedrebbero passare sotto il naso tutte le cose che chiunque mette sul nastro trasportatore: le varie pietanze, i mandarini sbucciati, le bacchette, la salsa wasabi, la salsa di soia, la soia senza sale ecc. e dovrebbero perdere tempo per capire se ciò che sta passando sul nastro è quello che effettivamente serve loro in quel momento (ad esempio leggere sull’etichetta di tutte le bottiglie di soia per individuare quella senza sale).
Un broker MQTT in realtà è un meccanismo più avanzato di un semplice nastro trasportatore e, anzi, consente di creare un nastro trasportatore dedicato per ogni tipo di risorsa. Quindi facciamo un esempio:
Questa lista potrebbe essere ulteriormente espansa:
In questo modo, chi ha bisogno della salsa di soia non salata tiene un occhio sul nastro trasportatore (topic) relativo e si attiva solo quando vede passare qualcosa perché saprà che quella è una salsa di soia senza sale che è quello di cui aveva bisogno.
Si noti che nell’MQTT la stessa bottiglia di salsa di soia non salata che passa sul nastro dedicato alla soia non salata passerà comunque anche su quello della salsa di soia generica, su quello delle salse generiche e sul generico nastro “globale” in cui passa ogni cosa.
In questo senso, quindi, i topic (nastri trasportatori dedicati) sono come dei filtri che servono a limitare la tipologia di risorse che chi osserva vede passare. In questo modo chi osserva il nastro trasportatore può decidere di veder passare solo ciò a cui è interessato.
Vuoi avere maggiori informazioni su come sviluppiamo App IoT in DuckMa?