MQTT: un protocol obert de xarxa i la seva importància en el IOT

MQTT protocol xarxa Iot

Recorda el nom MQTT, Ja que és un protocol de comunicació en xarxa tipus M2M (Machine to Machine) que va sonar bastant. Està popularitzant bastant gràcies a la nova era de l'Internet de les coses o IOT (Internet of Things) per les sigles en anglès. A més, es tracta d'un protocol obert, el que dóna bastants avantatges.

De fet, s'ha transformat en un dels pilars centrals de l'IOT, ja que és bastant bo en dispositius amb algunes limitacions de transmissió com aquests. Les sigles MQTT provenen de Transport de telemetria de missatges en cua, Un estàndard obert de OASIS i ISO (ISO / IEC 20922) per a comunicacions en xarxa i que s'executa, generalment, sobre el famós TCP / IP.

Protocols de xarxa

OSI model i les seves capes

Els protocols de comunicació són regles que possibiliten que dos o més dispositius o sistemes es puguin comunicar entre si. És a dir, és un protocol per transmetre informació a través de diversos mitjans i amb un format definiu, ja siguin implementats per programari i per maquinari (o tots dos).

El estàndard de l'protocol defineix multitud de característiques de la comunicació. Pot anar des de les regles de sincronització, semàntica, sintaxi, format de paquets, etc. I la veritat és que no són una cosa menyspreable, ja que gràcies a aquests protocols avui podem usar Internet i altres xarxes de comunicació ...

I per descomptat, no només hi ha un sol protocol, sinó molts. Per exemple, els famosos DNS, FTP, MQTT, HTTP i HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP, etc., per a la capa d'aplicació. Mentre que en capa de transport es poden trobar alguns tan famosos com TCP, UDP, etc., així com els de la capa d'Internet com IPv4, o el IPv6 (el que ha possibilitat major quantitat d'IPs disponibles i l'arribada de l'IOT) , IPSec, etc., i altres de la capa d'enllaç com DSL, Ethernet, WiFi, ARP, etc.

Sobre els protocols de IOT

protocol MQTT

Per descomptat, hi ha protocols de comunicació específics o que es poden aplicar a l' IO. És a dir, vist el de l'apartat anterior, serien una sèrie de normes definides perquè dos o més dispositius Iot es puguin comunicar i entendre entre si, i en general són M2M, és a dir, comunicació de màquina a máquina.Gracias a ells pot haver molts dispositius de IOT connectats i compartint informació de sensors o d'altres fonts.

A causa de la gran quantitat de dispositius Iot, aquests protocols han de complir uns requisits més enllà de les limitacions d'ample de banda, velocitat, etc. (Tingues en compte que molts dispositius són encastats i barats), que sol haver-hi en alguns dispositius. I em refereixo a el fet que han de ser escalables, Per poder afegir més dispositius connectats si cal i sense que afectin el sistema global.

A més, han de tenir una baixa dependència d'acoblament entre dispositius, perquè no es generin problemes si es retira un dispositiu. I per descomptat, a l'una, es busca una alta interoperabilitat perquè funcioni amb una gran quantitat de dispositius i sistemes molt variats, ja que el món de l'IOT és força heterogeni.

Altres característiques útils seria la facilitat d'implementar-los, la seguretat, Etc. Tingues en compte que el IOT està generant grans desafiaments en l'aspecte de la seguretat. Més encara quan molts dels dispositius connectats solen ser crítics en certs casos ... per exemple, joguines de menors d'edat.

conceptes importants

Dit això, cal dir que les solucions per al IOT usen un servidor centralitzat per rebre els missatges de tots els dispositius connectats que emeten i els distribueix a tots els dispositius connectats IOT que estan a l'escolta. Aquest servidor és el que es coneix com router o broker. Una cosa que dista de la relació client-servidor convencional en alguns sentits.

D'altra banda, les metodologies que pots trobar en aquests protocols de comunicació per IOT estan:

  • PubSub: Publish / Susbcribe és un patró de missatgeria on un dispositiu (Sub) informa el broker que vol rebre un missatge, mentre un altre dispositiu (Pub) publica missatges perquè el broker els distribueixi a l'altre / s dispositiu / s que els espera.
  • rRPC: Router Remoder Procedure Calls és un altre patró d'execució remota de processos. En ell, un dispositiu (Callee) informa el broker que realitzarà cirto procediment i el broker el distribueix a un altre dispositiu (Caller) en el qual s'executa aquest procés.

Ara bé, per a realitzar aquestes metodologies o patrons, es necessiten d'una infraestructura de missatgeria. I en aquest sentit es poden distingir dos:

  • Cua de missatges: Servei de missatgeria on es genera una sola cua de missatges per a tots els clients que inicien una subscripció al broker. Aquest últim mantindrà els missatges emmagatzemats fins que són lliurats a client. Si el client o destinatari no estigués connectat, es manté fins que es connecta. Aquest tipus de serveis són com els usats en apps de missatgeria instantània com telegrama, Whatsapp, Messenger, etc.
  • Servei de missatges: És un altre servei en el qual el broker envia els paraments a el client destinatari connectat, filtrant pel tipus de missatge. Si el client o dispositiu receptor és en línia, llavors es perden els missatges (tot i que pot tenir algun sistema de registre).

protocols IOT

Vist l'anterior, ara anem a veure una mica més de prop els protocols d'IOT que són més coneguts. Entre els més destacats de M2M estan:

  • AMQP (Advanced Message Queuing Protocol): És un protocol de tipus PubSub de Message Queue. Dissenyat per tenir una bona interoperabilitat i assegurar la fiabilitat. Especial per a aplicacions corporatives, d'alt rendiment, xarxes d'alta latència, crítiques, etc.
  • WAMP (Web Application Messaging Protocol): És un altre protocol obert de tipus PubSub com rRPC, i s'executa sobre WebSockets.
  • COAP (Constrained Application Protocol): És un protocol dissenyat especialment per a aplicacions de baixa capacitat.
  • TOMP (Streaming Text Oriented Messaging Protocol): Protocol molt simple i per aconseguir la màxima interoperabilitat. S'empra HTTP per transmetre missatges de text.
  • XMPP (eXtensible Messaging and Presence Protocol): Un altre protocol emprat en IOT per apps de missatgeria instantània i basat en XML. Gen aquest cas també és obert.
  • WMQ (WebSphere Message Queue): Protocol desenvolupat per IBM. És de tipus Message Queue, com el seu nom indica, i orientat a missatges.
  • MQTT: (Vegeu següent apartat)

Tot sobre MQTT

paquet de MQTT

El protocol MQTT és un protocol de comunicació Message Queue, que segueix un patró PubSub, i de tipus M2M com ja he comentat anteriorment. S'usa àmpliament en el IOT, i es basa en la pila TCP / IP usada a Internet.

En el cas de MQTT, cada connexió es manté oberta i es reutilitza en cada comunicació necessària. Una cosa diferent al que passa en altres protocols coneguts, que es realitza cada comunicació necessita una nova connexió.

Avantatges

Els avantatges de l'protocol MQTT són força evidents pel que fa a comunicacions M2M per IOT. A més de tot el que s'ha dit anteriorment, és un protocol que aporta:

  • Eescalabilidad, per connectar més i més clients.
  • Desacoblament entre clients, per menor dependència.
  • Asincronisme.
  • Senzillesa.
  • Lleugeresa per no consumir massa recursos (tot i que amb seguretat TLS / SSL puja).
  • Eficiència energètica per a dispositius que depenen de bateria o funcionen 24/7, no necessita d'un gran ample de banda (ideal per a connexions lentes, com algunes sense fils).
  • Seguretat i qualitat, per a major fiabilitat i robustesa en comunicacions.

Història

MQTT va ser creat en els anys 90, amb una primera versió de l' protocol el 1999. Va ser creat pel Dr. Andy Stanford-Clark d'IBM i Arlen Nipper de Cirrus Link (anteriorment Eurotech).

La idea inicial era crear un protocol per monitoritzar un oleoducte que viatjava a través del desert, amb un protocol de comunicació eficient (consum baix d'ample de banda), lleuger, i que un baix consum energètic. En aquest moment va ser molt costós, però ara s'ha transformat en un protocol barat i obert.

El protocol inicial va ser millorat amb l'aparició de noves versions, com la MQTT v3.1 (2013) sota l'especificació OASIS (Organization for the Advancement of Structured Information Standards), etc. Has de saber que a el principi era un protocol propietari d'IBM, però que seria alliberat en 2010, i es va acabar transformant en estàndard a OASIS ...

Funcionament de la connexió MQTT

El protocol MQTT fa servir un filtre, Per als missatges que són enviats a cada client, basat en topics o temes que s'organitzen de forma jeràrquica. D'aquesta manera, un client publico un tema en un topic concret. D'aquesta manera, tots aquells clients o dispositius connectats que es subscriguin a l'topic, rebran missatges per mitjà de l'broker.

Com és MQ, els missatges es mantindran en la cua i no es perden fins que el client no ha rebut aquest missatge.

Les connexions, com també vaig indicar, es realitzen per mitjà de TCP / IP, I el servidor o broker mantindrà un registre dels clients connectats. Per defecte, els dispositius faran servir ports de comunicació nombre 1883, tot i que també pots trobar-te amb un port 8883 si està utilitzant SSL / TLS per a més seguretat.

Perquè la connexió sigui possible, no només calen clients, servidor i ports. també altres paquets o missatges enviats perquè la comunicació es realitzi:

  • establir connexió: Missatge / paquet CONNECT enviat pel client amb tota la informació necessària. Aquesta informació inclou la identificació de client, el nom d'usuari, contrasenya, etc. El broker o servidor respon amb un paquet CONNACK que informarà el client que la connexió va ser acceptada, rebutjada, etc.
  • Enviar i rebre missatges: Un cop establerta la connexió s'usen paquets o missatges PUBLISH amb el topic o tema i el payload de l'missatge enviat a l'broker. D'altra banda, el client o clients interessats fan servir paquets SUBSCRIBE i unsuscribe per subscriure o retirar la seva subscripció respectivament. El broker respondrà també amb un paquet SUBACK i UNSUBACK respectivament per informar de l'èxit de l'operació demanada pel client.
  • Manteniment de la connexió: Per garantir que la connexió continua oberta, els clients poden enviar periòdicament un paquet PINGREQ que serà correspost amb un paquet PINGRESP de servidor.
  • finalitzar connexió: Quan un client es desconnecta envia un paquet DISCONNECT per informar d'aquest esdeveniment.

aquests missatges o paquets dels quals he parlat tenen una estructura igual que altres paquets d'altres protocols de xarxa:

  • Header o capçalera fixa: És una part fixa que ocupa entre 2-5 bytes. Conté un codi de control, ID de l'tipus de missatge enviat, i la seva longitud. Entre 1-4 bytes són usats per a la codificació de la longitud, usant els 7 primers bits de cada octet com a dada per a la longitud i un bit addicional de continuïtat per determinar que hi ha més d'un byte que componen la longitud de l'missatge.
  • capçalera variable: No és sempre obligatòria, sinó opcional. Només la contenen alguns paquets en certes situacions o missatges concrets.
  • Contingut o data: Les dades de l'paquet són els que realment contenen el missatge que es pretén enviar. Pot tenir des d'uns quants kB fins a 256 MB de límit.

Si t'interessa conèixer el codi corresponent en hexadecimal per als tipus de missatges enviats són:

Missatge Codi
CONNECT 0x10
CONNACK 0x20
PUBLICA 0x30
PUBACK 0x40
PUBREC 0x50
PUBREL 0x60
PUBCOMP 0x70
SUSBSCRBE 0x80
SUBACK 0x90
unsuscribe 0xA0
DESEMBALLAR 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
DESConnectar 0xE0

Qualitat i seguretat de les comunicacions

Un altre detall important dels missatges per MQTT és la qualitat de el servei o QoS, I la seguretat. D'això dependrà la robustesa de el sistema de comunicació davant fallades i la seguretat de la mateixa.

Quant a la seva qualitat es poden determinar 3 nivells diferents:

  • QoS 0 (unacknowledge): El missatge només s'envia una vegada, i en cas de fallada no es lliuraria. Es fa servir quan no és crític.
  • QoS 1 (acknowledge): El missatge s'enviarà tantes vegades com es necessiti fins a garantir l'entrega a client. El dolent és que el client podria rebre diverses vegades un mateix missatge.
  • QoS 2 (assured): Similar a l'anterior, però es garanteix que només es lliura una única vegada. Es sol usar per a sistemes més crítics on es necessita major fiabilitat.

D'altra banda, pel que fa a la seguretat de MQTT, Es poden fer servir diverses mesures per garantir la seva fortalesa en aquest sentit. Com ja he comentat abans, la autonticación de l'usuari i contrasenya, com molts altres protocols, es pot assegurar mitjançant SSL / TLS. Encara que molts dispositius Iot amb capacitats, o recursos baixos, podrien tenir problemes amb la sobrecàrrega de treball a l'usar aquest tipus de comunicació segura ...

Per aquest motiu, molts aparells IOT que fan servir MQTT fan servir contrasenyes i usuaris en text pla, El que podria fer que algú en esnife el tràfic de xarxa les pugui obtenir de forma molt fàcil. I si això és poc, també es pot configurar el broker per acceptar connexions anònimes, el que permetria a qualsevol usuari establir comunicacions, implicant major risc.

Utilitza MQTT amb Arduino

Arduino UNO amb MQTT

Per descomptat, pots utilitzar el protocol MQTT amb Arduino i altres plaques de desenvolupament, així com amb la Rapsberry Pi, etc. Per a això, has de dotar la teva placa Arduino de connectivitat, si no la té. A més, la biblioteca Arduino Client for MQTT t'ajudarà en aquestes tasques. Aquesta biblioteca és compatible amb:

Ja saps que pots descarregar i instal·lar la biblioteca al teu Arduino IDE utilitzant la comanda: git clone https://github.com/knolleary/pubsubclient.git

Quant a el codi per utilitzar MQTT en alguna aplicació, la veritat és que és senzill. A la imatge de Fritzing pots veure una placa Arduino UNO a la qual se li ha afegit connectivitat per Arduino Ethernet i també s'ha connectat un sensor d'humitat i temperatura DHT22, Encara que podria haver estat qualsevol altra cosa ...

Bé, dit això, per al codi que has de generar en IDE Arduino per treballar amb el protocol MQTT en Arduino, és així de simple:

  • Per a la enviar missatges 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);
}

  • Per a la rebre missatges per MQTT només necessites la placa Arduino UNO i connexió, amb Arduino Ethernet o qualsevol altre element. Pel que fa a el codi, un exemple seria:
#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();
}

Recorda que hauràs de canviar la IP per l'adequada de servidor, i també has alterar l'adreça MAC del teu adaptador de xarxa Ethernet o el que estiguis fent servir, així com la resta de codi, si pretens adaptar-lo a un projecte diferent. Això és només un exemple!

Per a més informació, pots descarregar de forma gratuïta nostre manual en PDF amb el curs d'Arduino IDE per iniciar a la programació.


Sigues el primer a comentar

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.