Sistemi di controllo

MQTT e JSON

MQTT è la sigla per Message Queueing for Telemetry Transport, o protocollo per il trasporto di informazioni di telemetria mediante coda di messaggi.

È basato su TCP/IP e quindi il flusso informativo può transitare su una rete locale, non importa se cablatawi-fi. Il protocollo TCP/IP garantisce che non vi sia perdita di informazione, fintanto che persiste la connessione tra le parti in causa.

In aggiunta, MQTT offre la possibilità di ulteriore ridondanza (non ci dilunghiamo su questo aspetto). Utilizzando una connessione protetta (SSL), è possibile ottenere uno scambio di messaggi criptato e sicuro.

Il protocollo è ben standardizzato e consolidato; sono disponibili a titolo gratuito broker per i diversi sistemi operativi, e librerie lato client per la maggior parte dei linguaggi di programmazione.


Come funziona

Il broker svolge il ruolo di server, e tutte le parti interessate a comunicare tra loro per suo tramite rivestono il ruolo di client. I messaggi sono caratterizzati da due componenti principali:

  • Topic (argomento);
  • Payload (contenuto).

Un client, per comunicare, deve innanzitutto connettersi al broker, poi può:

  • Eseguire una o più operazioni subscribe (abbonamento), con le quali dichiara a quali topic è interessato;
  • Eseguire operazioni di publish (pubblicazione), con le quali rende disponibili delle informazioni, sotto forma di messaggio.

L'efficienza del meccanismo è evidente:

  • Un messaggio viene pubblicato solo quando succede qualcosa di rilevante per il sistema;
  • A ogni client vengono recapitati solo i messaggi per i cui topic ha fatto subscribe;

Nel nostro sistema di controllo, per esempio, il messaggio di sistema (dis)attivo viene pubblicato dalla control room, e viene ricevuto dalla logica di controllo.


JSON

Le specifiche MQTT non danno alcuna indicazione sul formato dei messaggi. Questa è una decisione che spetta a chi lo utilizza, e dipende dal tipo di informazione che viene scambiata. Per messaggi non troppo voluminosi, di norma si predilige il formato JSON.

Si tratta di un formato testuale, di tipo chiave-valore, con possibilità di nidificare le informazioni. La specifica è di una sola pagina, a riprova della sua eccezionale semplicità ed efficacia.

Ecco come andiamo a codificare, nel nostro esempio, il payload del messaggio di impostazione del colore giallo lampeggiante di un semaforo:

{ "color" : "yellow", "isFlashing" : true }

Mentre se vogliamo impostare il verde fisso:

{ "color" : "green", "isFlashing" : false }

Il messaggio può valere per entrambi i tipi di semaforo; è il topic che indica a chi è effettivamente rivolto (si veda l'architettura logica):

  • traffic/color: al semaforo stradale;
  • pedestrian/color: al semaforo pedonale.

Ovviamente, la logica di controllo pubblicherà entrambi i messaggi, ma ciascun tipo di semaforo avrà fatto la subscribe solo a quello di proprio interesse.

La rappresentazione delle informazioni in formato JSON ha il grande vantaggio di essere immediatamente comprensibile in fase di test, assistenza, o semplice monitoraggio.

Inoltre è facile, in caso di evoluzione funzionale del sistema, aggiungere nuovi campi, opzionali, mantenendo la compatibilità con l'esistente.


Giorgio Barchiesi
Albo degli Ingegneri Sez. A, N. 4027 della Prov. di Trento
P.IVA 02370260222, C.F. BRC GRG 58L26 C794R

Copyright © 2015-2024 Giorgio Barchiesi - Tutti i diritti riservati