MQTT su MacOS X

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].

Architettura MQTT

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. MQTT Architettura 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.

Installazione e configurazione

Installiamo mosquitto:

brew install 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:

brew services start mosquitto

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!

Pubblish - Subscribe

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.

MQTT sample

$ 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...

Varie ed eventuali

MQTT mqtt Explorer 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 ):

Version
Status
Features
Last release
Date
Notes
5 Production Shared Subscriptions, more Error Reporting, Will Delay, Message Properties, Session and Message expiry, ... 5.02018-07
3.1.1 Production OASIS Standard. Protocol version 4 3.1.12014-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.11999-07


Titolo: MQTT su MacOS X
Livello: Medio (2/5)
Data: 31 Ottobre 2019
Versione: 1.0.0 - 31 Ottobre 2019 🎃 Halloween
Autore: mail [AT] meo.bogliolo.name