MQTT e' un protocollo per lo scambio di messaggi tra applicazioni ed ambienti ottimizzato per gli ambienti IoT. Per provarlo su MacOS utilizzeremo il message broker Eclipse Mosquitto che e' un Open Source (EPL/EDL). Mosquitto implementa il protocollo MQTT nelle versioni 5.0, 3.1.1 and 3.1.
Naturalmente i contenuti del documento valgono in generale anche per altri ambienti ospite [NdA mutatis mutandis, in particolare sulla parte di installazione].
MQTT e' un sistema per lo scambio di messaggi tra applicazioni.
MQTT (Message Queue Telemetry Transport) e' un protocollo standard (ISO/IEC PRF 20922)
di messaggistica di tipo publish-subscribe M2M (machine to machine).
E' nato nel 1999 per semplificare lo scambio di messaggi tra applicazioni
e trova un largo uso nell'IoT (Internet of Things) perche' e' particolarmente leggero e robusto.
Il componente centrale dell'architettura e' l'MQTT Broker che interagisce con i Client;
in pratica riceve i messaggi dai Publisher e li consegna ai Subscriber.
I messaggi sono raggruppati in categorie chiamate Topic.
Il Topic e' una stringa che puo' essere organizzata in gerarchie con il simbolo /
insomma assomiglia ad un path unix. Ad esempio: house/kitchen/temperature.
Un Subscriber puo' sottoscrivere un Topic esatto oppure utilizzare una wild card.
Con house/+/temperature vengono ricevute le temperature di tutte le stanze
mentre con house/# vengono ricevute tutte le metriche della casa.
Il protocollo MQTT e' molto semplice e prevede un numero limitato
di messaggi: Connect, Subscribe, Publish ed il relativi Ack.
Dal punto di vista tecnico ogni client mantiene una connessione TCP
con il broker. Le porte di default sono le seguenti:
Nel caso in cui una connessione cada il broker si occupa di ritrasmettere i messaggi eventualmente non ricevuti a seconda del QoS (Quality of Service) richiesto:
Il QoS viene applicato due volte, sia per la trasmissione dal publisher al broker
che per la trasmissione dal broker al subscriber.
Il QoS 0 (default) e' il piu' semplice e piu' veloce: il device invia al broker il messaggio
senza alcun controllo. Con QoS 1 il device invia il messaggio fino a che non riceve conferma
da broker. Con QoS 2 viene eseguito un handshake completo per ogni messaggio.
A sua volta il broker invia il messaggio a tutti i client che hanno sottoscritto il Topic
con lo stesso QoS con cui l'ha ricevuto o piu' basso se il client lo ha indicato nella sottoscrizione.
Tra i molti MQTT broker disponibili Eclipse mosquitto e' uno dei piu' completi e diffusi. In questa paginetta utilizzeremo appunto mosquitto su MacOS.
Installiamo mosquitto:
Homebrew installa l'ultima versione di ogni componente
con una configurazione di default gia' operativa...
Per attivare i servizi e' possibile lanciare il programma con
mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
oppure, meglio, attivare il servizio con:
Il file di configurazione di mosquitto e' /usr/local/etc/mosquitto/mosquitto.conf. I parametri presenti ed i default consentono di operare da subito...
E' evidente che la configurazione su macOS e' davvero semplice... ma su gli altri sistemi? Non e' molto piu' complessa: basta seguire quanto riportato sulla documentazione ufficiale!
Per pubblicare messaggi... continuate a leggere!
Con mosquitto, oltre al broker che si occupa della gestione dei messaggi,
sono presenti una serie di comandi di utilita' che vedremo in azione:
mosquitto_pub, mosquitto_sub, mosquitto_rr, mosquitto_password.
Il Topic e' un concetto fondamentale su MQTT perche'
l'invio e la ricezione dei messaggi sono sempre relativi ad un Topic.
$ mosquitto_pub -t home/kitchen/temperature -l
>26.7
>Secondo messaggio
>Terzo
>^C
|
$ mosquitto_sub -t #
26.7
Secondo messaggio
Terzo
|
Abbiamo utilizzato due sessioni ma e' possibile utilizzarne a piacere... ogni messaggio pubblicato da un Publisher verra' ricevuto da tutti i Subscriber attivi. Nell'esempio il Client ha effettuato il Subscribe sul Topic indicato con la wild card # ricevera' quindi tutti i messaggi.
Come e' chiaro dall'esempio il contenuto e' libero... sono le applicazioni
che possono decidere se inviare stringhe, formattare i messaggi in JSON
o con altri formati.
Il topic di un messaggio ha una lunghezza massima di 64KB ed utilizza il formato UTF8.
Il contenuto o payload di un messaggio ha una lunghezza massima di 256MB
[NdA per essere precisi dalla v.5 e' possibile specificare se il payload
e' in UTF-8 o raw, nelle versioni precedenti tutti i messaggi sono raw].
Oltre ai topic creati dagli amministratori o dalle applicazioni ve ne sono alcuni interni. Mosquitto mantiene un Topic $SYS con le principali metriche sulle attivita' svolte.
Con mosquitto_password si impostano i file di password e si gestiscono gli utenti. Le funzioni sono di base...
Questa paginetta e' introduttiva e non presenta molti degli importanti aspetti di MQTT...
sicuramente da approfondire sono le differenze tra i protocolli,
le politiche di retention, la gestione degli errori,
il grande numero di broker disponibili,
e, non da ultimo, gli aspetti sulla sicurezza.
Il nome MQTT proviene dalla linea di prodotti MQ Series di IBM, pero' MQTT non e' una message queue ma un publish-subscribe!
Sono disponibili diverse librerie e client MQTT...
per esempio la simpatica interfaccia grafica visibile nella figura a destra
si installa con:
brew cask install mqtt-explorer
Un altro sistema di messaggistica molto diffuso e' Kafka ma le differenze tecniche e di utilizzo sono notevoli!
Le versioni di MQTT utilizzate in questo documento sono le ultime disponibili,
rispettivamente la 1.6.7 di Mosquitto ed il protocollo MQTT 5.0
(eg. Shared Subscriptions, Error Reporting, Will Delay, ...).
Le versioni piu' recenti e diffuse del protocollo MQTT sono la v.3.1 (2010) rilasciata pubblicamente,
la v.3.1.1 (2014) standard OASIS ed ISO, la v.5.0 (2017) piu' recente e completa.
Andando ad analizzare i bit...
il pacchetto MQTT CONNECT prevede un campo specifico con la versione
che vale 0x03 per la v.3.1, 0x04 per la v.3.1.1 e 0x05 per la v.5.0:
ecco perche' non e' stata rilasciata una v.4 del protocollo!
L'MQTT/UDP e' una versione ulteriormente semplificata dell'MQTT protocol che utilizza lo stack UDP anziche' il TCP e non necessita di un broker... ma e' meno diffuso.
Quale riferimento sulle versioni di MQTT potete utilizzare la seguente tabella (Sources: MQTT.org Wikipedia ):
|
|
|
|
|
|
5 | Production | Shared Subscriptions, more Error Reporting, Will Delay, Message Properties, Session and Message expiry, ... | 5.0 | 2018-07 | |
3.1.1 | Production | OASIS Standard. Protocol version 4 | 3.1.1 | 2014-11 | |
1 | OLD |
Developed by Andy Stanford-Clark (IBM) and Arlen Nipper (Cirrus Link) to monitor an oil pipeline!
(3.1 2010-08): Protocol version 3 | 3.1 | 1999-07 |
Titolo: MQTT su MacOS X
Livello: Medio
Data:
31 Ottobre 2019
Versione: 1.0.0 - 31 Ottobre 2019 🎃 Halloween
Autore: mail [AT] meo.bogliolo.name