Nella prima parte di questo tutorial ho introdotto il concetto di topics (argomenti in italiano). Ogni messaggio inviato ad un MQTT broker deve essere associato ad un topic e i client che si collegano al broker decidono quali messaggi ricevere sottoscrivendo uno o più topics.
Oggi vedremo più in dettaglio il formato dei topics e le diverse modalità di sottoscrizione.
Un topic è definito da una stringa (formato UTF-8) e consiste in uno o più livelli, separati da uno slash.
Ecco alcuni esempi di topic:
comandi casa/temperatura orto/pomodori/umidità
Un topic deve essere composto da almeno un carattere e può contenere spazi (anche se è sconsigliato).
Per utilizzare un topic non è necessario prima definirlo/crearlo sul broker: il client che invia i messaggi può specificare un qualsiasi topic, purché sia sintatticamente valido.
Wildcards
Un client può sottoscrivere uno o più topic. La sottoscrizione può avvenire in maniera puntuale, specificando il nome esatto del topic al quale ci si vuole sottoscrivere. In alternativa è possibile utilizzare due wildcards, ovvero caratteri speciali per sottoscrivere un insieme di topics.
Il primo wildcard è il carattere +. Tale carattere consente di sottoscrivere un singolo livello di topics.
Vediamo un esempio: sottoscrivendo il topic casa/+/temperatura si effettua la sottoscrizione a tutti i topics che contengono una qualsiasi scritta al posto del carattere +, ad esempio:
[checklist]
- casa/soggiorno/temperatura
- casa/cucina/temperatura
- casa/terrazzo/temperatura
[/checklist]
Ecco invece alcuni esempi di topics che non sono sottoscritti:
[badlist]
- garage/temperatura
- casa/soggiorno/umidità
- casa/terrazzo/destro/temperatura
[/badlist]
L’ultimo esempio spiega nuovamente come il carattere + sia wildcard per un solo livello (quindi non corrisponda ai due livelli terrazzo/destro dell’esempio).
Il carattere wildcard multilivello è #. Tale carattere deve occupare sempre la posizione finale del topic e deve essere preceduto dal carattere /.
Ad esempio, se si sottoscrive il topic casa/interno/# si riceveranno i messaggi dei seguenti topics:
[checklist]
- casa/interno/temperatura
- casa/interno/cucina/temperatura
- casa/interno/cucina/umidità
[/checklist]
mentre non si riceveranno i messaggi dei seguenti topics:
[badlist]
- casa/esterno/temperatura
- garage/umidità
[/badlist]
Proviamo!
Possiamo verificare quanto spiegato sopra grazie al nostro mosquitto. Dopo aver lanciato il server, proviamo a sottoscrivere il topic home/+:
mosquitto_sub.exe -t home/+ -v
(utilizziamo l’opzione -v per visualizzare, insieme al messaggio, anche il topic al quale è stato pubblicato).
Se ora inviamo messaggi a diversi topics, possiamo verificare quali vengono ricevuti e quali no:
Egualmente per il wildcard #:
Grande Luca!!! Come sempre articoli chiari e ben descritti.
Grazie per il lavoro e la condivisione