MQTT: un protocollo di rete aperto e la sua importanza nell'IoT

Protocollo MQTT di rete IoT

Ricorda il nome MQTT, poiché è un protocollo di comunicazione di rete di tipo M2M (Machine to Machine) che suonerà molto. Sta diventando molto popolare grazie alla nuova era dell'Internet of Things o IoT (Internet of Things) per il suo acronimo in inglese. Inoltre, è un protocollo aperto, che offre molti vantaggi.

In effetti, è diventato uno dei pilastri centrali dell'IoT, in quanto è abbastanza buono su dispositivi con alcune limitazioni di trasmissione come questi. L'acronimo MQTT deriva da Trasporto telemetrico di Accodamento messaggi, uno standard aperto di OASIS e ISO (ISO / IEC 20922) per le comunicazioni di rete e che generalmente gira sul famoso TCP / IP.

Protocolli di rete

Modello OSI e suoi livelli

I protocolli di comunicazione Sono regole che consentono a due o più dispositivi o sistemi di comunicare tra loro. Cioè, è un protocollo per trasmettere informazioni attraverso vari mezzi e con un formato definito, implementato da software e hardware (o entrambi).

El standard del protocollo definisce una moltitudine di caratteristiche di comunicazione. Può andare dalle regole di sincronizzazione, semantica, sintassi, formato del pacchetto, ecc. E la verità è che non sono trascurabili, poiché grazie a questi protocolli oggi possiamo usare Internet e altre reti di comunicazione ...

E, naturalmente, non esiste un solo protocollo, ma molti. Per esempio, il famoso DNS, FTP, MQTT, HTTP e HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP, ecc. Per il livello dell'applicazione. Mentre nel livello di trasporto se ne possono trovare alcuni famosi come TCP, UDP, ecc., Oltre a quelli del livello Internet come IPv4, o IPv6 (quello che ha reso possibile il maggior numero di IP disponibili e l'arrivo di IoT), IPSec, ecc. e altri dal livello di collegamento come DSL, Ethernet, WiFi, ARP, ecc.

Informazioni sui protocolli IoT

Protocollo MQTT

Ovviamente esistono protocolli di comunicazione specifici o che possono essere applicati a IoT. Vale a dire, considerando la sezione precedente, sarebbero una serie di standard definiti in modo che due o più dispositivi IoT possano comunicare e capirsi, e sono generalmente M2M, cioè comunicazione da macchina a macchina. molti dispositivi IoT collegati e condividono informazioni da sensori o altre fonti.

A causa dell'elevato numero di dispositivi IoT, questi protocolli devono soddisfare i requisiti oltre i limiti di larghezza di banda, velocità, ecc. (tieni presente che molti dispositivi sono incorporati ed economici), che di solito è in alcuni dispositivi. E intendo il fatto che deve essere scalabile, per poter aggiungere più dispositivi connessi se necessario e senza influire sul sistema globale.

Inoltre, devono avere un file bassa dipendenza accoppiamento tra dispositivi, in modo che non vengano generati problemi se un dispositivo viene rimosso. E, naturalmente, allo stesso tempo, viene ricercata un'elevata interoperabilità in modo che funzioni con un gran numero di dispositivi e sistemi molto vari, poiché il mondo dell'IoT è piuttosto eterogeneo.

Altre caratteristiche utili sarebbero la facilità di implementarle, sicurezza, eccetera. Tieni presente che l'IoT sta creando grandi sfide sotto l'aspetto della sicurezza. Ancora di più quando molti dei dispositivi collegati tendono ad essere critici in alcuni casi ... ad esempio, i giocattoli per i minori.

Concetti importanti

Detto questo, va detto che le soluzioni per l'IoT utilizzano un server centralizzato per ricevere i messaggi da tutti i dispositivi connessi che li emettono e li distribuiscono a tutti i dispositivi IoT connessi che sono in ascolto. Quel server è ciò che è noto come router o intermediario. Qualcosa che in qualche modo è lontano dalla tradizionale relazione client-server.

Inoltre, le metodologie che puoi trovare in questi protocolli di comunicazione per IoT sono:

  • PubSub: Publish / Susbcribe è un modello di messaggistica in cui un dispositivo (Sub) informa il broker che desidera ricevere un messaggio, mentre un altro dispositivo (Pub) pubblica messaggi che il broker distribuisce agli altri dispositivi in ​​attesa.
  • rRPC: Router Remoder Procedure Calls è un altro modello di esecuzione di processi remoti. In esso, un dispositivo (Callee) informa il broker che eseguirà una determinata procedura e il broker la distribuisce su un altro dispositivo (Caller) su cui viene eseguito detto processo.

Ora, per attuare queste metodologie o modelli, a infrastruttura di messaggistica. E in questo senso se ne possono distinguere due:

  • Coda messaggi: servizio di messaggistica in cui viene generata una singola coda di messaggi per tutti i client che avviano una sottoscrizione al broker. Quest'ultimo manterrà i messaggi archiviati fino a quando non verranno consegnati al cliente. Se il client o il destinatario non è connesso, viene mantenuto fino alla connessione. Questi tipi di servizi sono come quelli utilizzati nelle app di messaggistica istantanea come Telegra, WhatsApp, Messenger, ecc.
  • Servizio messaggi: è un altro servizio in cui il broker invia i messaggi al client destinatario connesso, filtrando per tipo di messaggio. Se il client o il dispositivo ricevente è disconnesso, i messaggi vengono persi (sebbene possa avere un sistema di registrazione).

Protocolli IoT

Dopo aver visto quanto sopra, ora diamo uno sguardo più da vicino Protocolli IoT che sono meglio conosciuti. Tra i più importanti di M2M ci sono:

  • AMQP (protocollo avanzato di accodamento messaggi): è un protocollo di tipo PubSub di Message Queue. Progettato per avere una buona interoperabilità e garantire affidabilità. Speciale per applicazioni aziendali, alte prestazioni, reti ad alta latenza, critiche, ecc.
  • WAMP (protocollo di messaggistica delle applicazioni Web): È un altro protocollo aperto di tipo PubSub come rRPC e funziona su WebSocket.
  • CoAP (protocollo di applicazione vincolata): è un protocollo appositamente progettato per applicazioni a bassa capacità.
  • TOMP (protocollo di messaggistica orientata al testo in streaming): protocollo molto semplice e per ottenere la massima interoperabilità. HTTP viene utilizzato per trasmettere messaggi di testo.
  • XMPP (protocollo estendibile di messaggistica e presenza): un altro protocollo utilizzato in IoT per le app di messaggistica istantanea e basato su XML. Jan anche questo caso è aperto.
  • WMQ (coda messaggi WebSphere): protocollo sviluppato da IBM. È del tipo Message Queue, come suggerisce il nome, ed è orientato ai messaggi.
  • MQTT: (vedi sezione successiva)

Tutto su MQTT

Pacchetto MQTT

El Protocollo MQTT È un protocollo di comunicazione Message Queue, che segue uno schema PubSub, e di tipo M2M come ho già commentato in precedenza. È ampiamente utilizzato nell'IoT e si basa sullo stack TCP / IP utilizzato su Internet.

Nel caso di MQTT, ogni connessione è mantenuta aperta ed è riutilizzato in ogni comunicazione necessaria. Qualcosa di diverso da quanto accade in altri protocolli noti, che ogni comunicazione avviene richiede una nuova connessione.

Vantaggi

I vantaggi del protocollo MQTT sono abbastanza evidenti in termini di comunicazioni M2M per IoT. Oltre a tutto quanto detto sopra, è un protocollo che prevede:

  • Scalabilità, per connettere sempre più clienti.
  • Disaccoppiamento tra client, per una minore dipendenza.
  • Asincronia.
  • Semplicità.
  • Leggerezza per non consumare troppe risorse (anche se con la sicurezza TLS / SSL si sale).
  • Efficiente dal punto di vista energetico per dispositivi che dipendono dalla batteria o funzionano 24 ore su 7, XNUMX giorni su XNUMX, non necessita di una grande larghezza di banda (ideale per connessioni lente, come alcune wireless)
  • Sicurezza e qualità, per una maggiore affidabilità e robustezza nelle comunicazioni.

Storia

MQTT è stato creato negli anni '90, con una prima versione di protocollo nel 1999. È stato creato dal Dr. Andy Stanford-Clark di IBM e Arlen Nipper di Cirrus Link (ex Eurotech).

La idea iniziale era quello di creare un protocollo per monitorare una pipeline che viaggiava attraverso il deserto, con un protocollo di comunicazione efficiente (basso consumo di banda), leggero e che a basso consumo energetico. All'epoca era molto costoso, ma ora è diventato un protocollo economico e aperto.

Il protocollo iniziale è stato migliorato con la comparsa di nuove versioni, come MQTT v3.1 (2013) secondo la specifica OASIS (Organization for the Advancement of Structured Information Standards), ecc. Dovresti sapere che all'inizio era un protocollo proprietario IBM, ma che sarebbe stato rilasciato nel 2010, e finì per diventare uno standard in OASIS ...

Come funziona la connessione MQTT

Il protocollo MQTT utilizza un filtro, per i messaggi che vengono inviati a ciascun cliente, in base ad argomenti o argomenti organizzati gerarchicamente. In questo modo, un cliente può pubblicare un messaggio su un argomento specifico. In questo modo, tutti quei client o dispositivi connessi che si iscrivono all'argomento riceveranno messaggi tramite il broker.

Come MQ, i messaggi rimarranno nella coda e non vengono persi finché il client non ha ricevuto quel messaggio.

I collegamenti, come ho anche indicato, vengono effettuati tramite TCP / IPe il server o il broker manterrà un record dei client connessi. Per impostazione predefinita, i dispositivi utilizzeranno le porte di comunicazione numero 1883, sebbene potresti anche incontrare la porta 8883 se stai utilizzando SSL / TLS per una maggiore sicurezza.

Affinché la connessione sia possibile, non sono necessari solo client, server e porte. Anche altri pacchi o messaggi inviati affinché la comunicazione avvenga:

  • Stabilisci la connessione: CONNECT messaggio / pacchetto inviato dal client con tutte le informazioni necessarie. Tali informazioni includono l'ID cliente, il nome utente, la password, ecc. Il broker o il server risponde con un pacchetto CONNACK che informerà il client che la connessione è stata accettata, rifiutata, ecc.
  • Invia e ricevi messaggi: una volta stabilita la connessione, vengono utilizzati pacchetti o messaggi PUBLISH con l'argomento e il payload del messaggio inviato al broker. D'altra parte, il cliente oi clienti interessati utilizzano i pacchetti SUBSCRIBE e UNSUSCRIBE rispettivamente per sottoscrivere o ritirare il proprio abbonamento. Il broker risponderà anche con un pacchetto SUBACK e UNSUBACK rispettivamente per segnalare il buon esito dell'operazione richiesta dal cliente.
  • Mantenere la connessione: per garantire che la connessione rimanga aperta, i client possono inviare periodicamente un pacchetto PINGREQ che verrà abbinato a un pacchetto PINGRESP dal server.
  • Fine connessione: quando un client si disconnette invia un pacchetto DISCONNECT per segnalare quell'evento.

quelli messaggi o pacchetti Quelli di cui ho parlato hanno una struttura uguale agli altri pacchetti di altri protocolli di rete:

  • Intestazione o intestazione fissa: è una parte fissa che occupa da 2 a 5 byte. Contiene un codice di controllo, l'ID del tipo di messaggio inviato e la sua lunghezza. Per codificare la lunghezza vengono utilizzati da 1 a 4 byte, utilizzando i primi 7 bit di ciascun ottetto come dati per la lunghezza e un bit aggiuntivo di continuità per determinare che è presente più di un byte che costituisce la lunghezza del messaggio.
  • Intestazione variabile: non è sempre obbligatorio, ma facoltativo. È contenuto in alcuni pacchetti solo in determinate situazioni o messaggi specifici.
  • Contenuto o dati: i dati del pacchetto sono ciò che effettivamente contiene il messaggio da inviare. Può variare da pochi kB fino a un limite di 256 MB.

Se ti interessa sapere il codice corrispondente in esadecimale per i tipi di messaggi inviati sono:

Messaggio Codice
COLLEGARE 0x10
CONNACK 0x20
PUBBLICARE 0x30
PUBBLICO 0x40
pubrec 0x50
PUBBLICO 0x60
pubcomp 0x70
ISCRIVITI 0x80
SUBBACK 0x90
CANCELLA L'ISCRIZIONE 0xA0
INSUBACK 0xB0
PINREQ 0xC =
PINGRESP 0xD0
SCOLLEGARE 0xE0

Qualità e sicurezza delle comunicazioni

Un altro dettaglio importante dei messaggi di MQTT è il file qualità del servizio o QoSe sicurezza. Da ciò dipenderà la robustezza del sistema di comunicazione in caso di guasto e la sua sicurezza.

Per quanto riguarda la sua qualità, può essere determinato 3 livelli diversi:

  • QoS 0 (non riconosciuto)- Il messaggio viene inviato una sola volta e in caso di errore non verrà consegnato. Viene utilizzato quando non è critico.
  • QoS 1 (conferma): il messaggio verrà inviato tutte le volte necessarie per garantire la consegna al cliente. La cosa brutta è che il client potrebbe ricevere lo stesso messaggio più volte.
  • QoS 2 (assicurato)- Simile al precedente, ma garantito per essere consegnato una sola volta. Viene spesso utilizzato per sistemi più critici in cui è necessaria una maggiore affidabilità.

D'altra parte, come per Sicurezza MQTT, varie misure possono essere utilizzate per garantire la sua forza in questo senso. Come ho già commentato prima, l'autenticazione di utente e password, come molti altri protocolli, può essere assicurata tramite SSL / TLS. Sebbene molti dispositivi IoT con capacità o risorse ridotte potrebbero avere problemi con il sovraccarico di lavoro quando si utilizza questo tipo di comunicazione sicura ...

Per questo motivo, molti dispositivi IoT che utilizzano MQTT utilizzano password e utenti in testo piano, che potrebbe indurre qualcuno a rilevare il traffico di rete per ottenerli molto facilmente. E se ciò non bastasse, il broker può anche essere configurato per accettare connessioni anonime, il che consentirebbe a qualsiasi utente di stabilire comunicazioni, comportando un rischio maggiore.

Utilizzo di MQTT con Arduino

Arduino UNO con QTT

Certo che puoi usa il protocollo MQTT con Arduino e altre schede di sviluppo, oltre a Rapsberry Pi, ecc. Per fare ciò, devi fornire alla tua scheda Arduino la connettività, se non ce l'ha. Inoltre, la biblioteca Client Arduino per MQTT ti aiuterà in questi compiti. Questa libreria è compatibile con:

Sai già che puoi scaricare e installare la libreria nel tuo IDE Arduino usando il comando: clone di git https://github.com/knolleary/pubsubclient.git

Appena al codice per utilizzare MQTT in alcune applicazioni, la verità è che è semplice. Nell'immagine di Fritzing puoi vedere una targa Arduino UNO a cui è stata aggiunta la connettività da Arduino Ethernet ed è stata anche collegata un sensore di umidità e temperatura DHT22, anche se avrebbe potuto essere qualcos'altro ...

Ok, detto questo, per il codice che devi generare Arduino IDE Per lavorare con il protocollo MQTT su Arduino, è così semplice:

  • a inviare messaggi MQTT
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

// Direccion MAC del adaptador Ethernet
byte mac[] = { 0xCE, 0xAB, 0x0E, 0x3F, 0xFE, 0xD4 };

// IP del servidor (broker)
IPAddress mqtt_server(192, 168, 1, 4);

// Topic o tema con el que se trabaja
const char* topicName = "test";

DHT dht(DHTPIN, DHTTYPE);
EthernetClient ethClient;
PubSubClient client(ethClient);

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Fallo en Ethernet usando DHCP");
  }
// Puerto 1883 de comunicación
  client.setServer(mqtt_server, 1883);
  dht.begin();
}

void loop()
{
  if (!client.connected()) {
    Serial.print("Conectando ...\n");
    client.connect("Cliente Arduino");
  }
  else {
    // Envío de informacion del sensor de temperatura y humedad
    float temp = dht.readTemperature();
    char buffer[10];
    dtostrf(temp,0, 0, buffer);
    client.publish(topicName, buffer);
  }
  // Tiempo entre envíos en ms (cada 10 segundos)
  delay(10000);
}

  • a ricevere messaggi di MQTT ti serve solo la piastra Arduino UNO e connessione, con Arduino Ethernet o qualsiasi altro elemento. Per quanto riguarda il codice, un esempio potrebbe essere:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Direccion MAC del adaptador Ethernet
byte mac[] = { 0xCE, 0xAB, 0x0E, 0x3F, 0xFE, 0xD4 };

// IP del servidor (broker)
IPAddress mqtt_server(192, 168, 1, 4);

// Topic o tema con el que trabajr
const char* topicName = "test";

EthernetClient ethClient;
PubSubClient client(ethClient);

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("El mensaje ha llegado [");
  Serial.print(topic);
  Serial.print("] ");
  int i=0;
  for (i=0;i<length;i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Fallo en Ethernet al usar configuración DHCP");
  }
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback)
}

void loop()
{
  if (!client.connected()) {
      Serial.print("Conectando ...");
      if (client.connect("rece_arduino")) {
        Serial.println("conectado");
        client.subscribe(topicName);
      } else {
        delay(10000);
      }
  }
  // Cliente a la escucha
  client.loop();
}

Ricorda che devi cambiare l'IP in quello appropriato per il server, e devi anche cambiare l'indirizzo MAC della tua scheda di rete Ethernet o quella che stai utilizzando, così come il resto del codice se intendi adattarlo a un progetto diverso. Questo è solo un esempio!

Per ulteriori informazioni, puoi scarica gratis nostro Manuale in PDF con il corso IDE di Arduino per iniziare a programmare.


Puoi essere il primo a lasciare un commento

Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.