MQTT: un protocol de rețea deschis și importanța sa în IoT

Protocol de rețea IoT MQTT

Tine minte numele MQTT, deoarece este un protocol de comunicație de rețea de tip M2M (Machine to Machine) care va suna destul de mult. Devine destul de popular datorită noii ere a Internetului obiectelor sau IoT (Internet of Things) pentru acronimul său în limba engleză. În plus, este un protocol deschis, care oferă multe avantaje.

De fapt, a devenit unul dintre pilonii centrali ai IoT, deoarece este destul de bun pe dispozitive cu unele limitări de transmisie ca acestea. Acronimul MQTT provine de la Transport de telemetrie în coadă de mesaje, un standard deschis de la OASIS și ISO (ISO / IEC 20922) pentru comunicațiile de rețea și care rulează în general pe faimosul TCP / IP.

Protocoale de rețea

Modelul OSI și straturile sale

L protocoale de comunicare Sunt reguli care permit două sau mai multe dispozitive sau sisteme să comunice între ele. Adică este un protocol de transmitere a informațiilor prin diferite mijloace și cu un format definit, fie implementat de software și hardware (sau de ambele).

El estándar a protocolului definește o multitudine de caracteristici de comunicare. Poate trece de la regulile de sincronizare, semantică, sintaxă, format de pachete etc. Și adevărul este că acestea nu sunt neglijabile, deoarece grație acestor protocoale astăzi putem folosi internetul și alte rețele de comunicații ...

Și, desigur, există nu numai un protocol, ci multe. De exemplu, faimosul DNS, FTP, MQTT, HTTP și HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP etc., pentru stratul de aplicație. În timp ce în stratul de transport puteți găsi unele la fel de faimoase precum TCP, UDP etc., precum și cele ale stratului de Internet, cum ar fi IPv4 sau IPv6 (cel care a făcut posibil cel mai mare număr de IP-uri disponibile și sosirea IoT), IPSec etc., și altele din stratul de legătură precum DSL, Ethernet, WiFi, ARP etc.

Despre protocoalele IoT

Protocol MQTT

Desigur, există protocoale de comunicare specifice sau care pot fi aplicate la IoT. Adică, luând în considerare secțiunea anterioară, acestea ar fi o serie de standarde definite, astfel încât două sau mai multe dispozitive IoT să poată comunica și să se înțeleagă și sunt de obicei M2M, adică comunicare mașină la mașină. multe dispozitive IoT conectate și care partajează informații de la senzori sau alte surse.

Datorită numărului mare de dispozitive IoT, aceste protocoale trebuie să îndeplinească cerințe care depășesc limitele lățimii de bandă, vitezei etc. (rețineți că multe dispozitive sunt încorporate și ieftine), ceea ce este de obicei în unele dispozitive. Și mă refer la faptul că trebuie să fie scalabil, pentru a putea adăuga mai multe dispozitive conectate, dacă este necesar și fără a afecta sistemul global.

De asemenea, trebuie să aibă un dependență scăzută cuplarea între dispozitive, astfel încât problemele să nu fie generate dacă un dispozitiv este eliminat. Și, desigur, în același timp, se caută o interoperabilitate ridicată, astfel încât să funcționeze cu un număr mare de dispozitive și sisteme foarte variate, deoarece lumea IoT este destul de eterogenă.

Alte caracteristici utile ar fi ușurința implementării acestora, securitatea, etc. Rețineți că IoT creează provocări mari în ceea ce privește securitatea. Cu atât mai mult cu cât multe dintre dispozitivele conectate sunt de obicei critice în anumite cazuri ... de exemplu, jucării pentru minori.

Concepte importante

Acestea fiind spuse, trebuie spus că soluțiile pentru IoT utilizează un server centralizat pentru a primi mesajele de la toate dispozitivele conectate care le emit și le distribuie tuturor dispozitivelor IoT conectate care ascultă. Serverul respectiv este ceea ce se numește router sau broker. Ceva care este departe de relația convențională client-server în anumite privințe.

În plus, metodologiile pe care le puteți găsi în aceste protocoale de comunicare pentru IoT sunt:

  • PubSub: Publish / Susbcribe este un model de mesagerie în care un dispozitiv (Sub) informează brokerul că dorește să primească un mesaj, în timp ce un alt dispozitiv (Pub) publică mesaje pentru ca brokerul să le distribuie către celelalte dispozitive care le așteaptă.
  • rRPC: Router Remoder Procedure Calls este un alt model de execuție la distanță a procesului. În el, un dispozitiv (Callee) informează brokerul că va efectua o anumită procedură și brokerul îl distribuie către un alt dispozitiv (Apelant) pe care este executat procesul respectiv.

Acum, pentru a realiza aceste metodologii sau tipare, a infrastructura de mesagerie. Și în acest sens se pot distinge două:

  • Coadă de mesaje: serviciu de mesagerie în care este generată o coadă de mesaje unică pentru toți clienții care inițiază un abonament la broker. Acesta din urmă va păstra mesajele stocate până când vor fi livrate clientului. Dacă clientul sau destinatarul nu sunt conectați, acesta este menținut până când este conectat. Aceste tipuri de servicii sunt ca cele utilizate în aplicațiile de mesagerie instant, cum ar fi Telegra, WhatsApp, Messenger etc.
  • Serviciu de mesaje: este un alt serviciu în care brokerul trimite mesajele către clientul destinatar conectat, filtrând după tipul de mesaj. Dacă clientul sau dispozitivul receptor este deconectat, atunci mesajele se pierd (deși poate avea un sistem de înregistrare).

Protocoale IoT

După ce am văzut cele de mai sus, acum să aruncăm o privire mai atentă Protocoale IoT care sunt mai bine cunoscute. Printre cele mai proeminente M2M se numără:

  • AMQP (Protocol avansat de așteptare a mesajelor): este un protocol de tip PubSub al cozii de mesaje. Proiectat pentru a avea o bună interoperabilitate și pentru a asigura fiabilitatea. Mai ales pentru aplicații corporative, performanțe ridicate, rețele cu latență ridicată, critice etc.
  • WAMP (Protocol de mesagerie pentru aplicații web): este un alt protocol deschis de tip PubSub precum rRPC și rulează pe WebSockets.
  • Protocolul de aplicare constrâns (CoAP): este un protocol special conceput pentru aplicații de capacitate redusă.
  • TOMP (Protocol de mesagerie orientată text în flux): protocol foarte simplu și pentru a atinge interoperabilitatea maximă. HTTP este utilizat pentru a transmite mesaje text.
  • XMPP (eXtensible Messaging and Protocol de prezență): un alt protocol utilizat în IoT pentru aplicațiile de mesagerie instantanee și bazat pe XML. Jan acest caz este, de asemenea, deschis.
  • WMQ (coadă de mesaje WebSphere): protocol dezvoltat de IBM. Este de tipul cozii de mesaje, așa cum sugerează și numele său, și este orientat spre mesaj.
  • MQTT: (vezi secțiunea următoare)

Totul despre MQTT

Pachetul MQTT

El Protocol MQTT Este un protocol de comunicare Message Queue, care urmează un model PubSub și de tip M2M, așa cum am menționat deja. Este utilizat pe scară largă în IoT și se bazează pe stiva TCP / IP utilizată pe Internet.

În cazul MQTT, fiecare conexiune este menținută deschisă și este reutilizat în orice comunicare necesară. Ceva diferit de ceea ce se întâmplă în alte protocoale cunoscute, că fiecare comunicare are loc necesită o nouă conexiune.

Avantaj

Avantajele protocolului MQTT sunt destul de evidente în ceea ce privește comunicațiile M2M pentru IoT. În plus față de tot ce s-a spus mai sus, este un protocol care oferă:

  • Scalabilitate, pentru a conecta tot mai mulți clienți.
  • Decuplarea între clienți, pentru o dependență mai mică.
  • Asincronism.
  • Simplitate.
  • Lejeritate pentru a nu consuma prea multe resurse (deși cu securitate TLS / SSL crește).
  • Eficientă din punct de vedere energetic pentru dispozitivele care depind de baterie sau funcționează 24/7, nu are nevoie de o lățime de bandă mare (ideală pentru conexiuni lente, ca unele wireless).
  • Securitate și calitate, pentru o mai mare fiabilitate și robustețe în comunicații.

istorie

MQTT a fost creat în anii 90, cu o versiune timpurie a protocol în 1999. A fost creat de Dr. Andy Stanford-Clark de la IBM și Arlen Nipper de la Cirrus Link (fost Eurotech).

La idee inițială a fost de a crea un protocol pentru a monitoriza o conductă care a călătorit prin deșert, cu un protocol de comunicare eficient (consum redus de lățime de bandă), lumină și un consum redus de energie. Pe atunci era foarte scump, dar acum a devenit un protocol ieftin și deschis.

Protocolul inițial a fost îmbunătățit odată cu apariția versiuni noi, precum MQTT v3.1 (2013) în conformitate cu specificația OASIS (Organizația pentru avansarea standardelor de informații structurate) etc. Trebuie să știți că la început a fost un protocol IBM proprietar, dar că va fi lansat în 2010 și că a ajuns să devină un standard în OASIS ...

Cum funcționează conexiunea MQTT

Utilizează protocolul MQTT un filtru, pentru mesajele care sunt trimise fiecărui client, pe baza unor subiecte sau subiecte care sunt organizate ierarhic. În acest fel, un client poate posta un mesaj pe un anumit subiect. În acest fel, toți acei clienți sau dispozitive conectate care se abonează la subiect vor primi mesaje prin intermediul brokerului.

La fel ca MQ, mesajele vor rămâne în coadă și nu se pierd până când clientul nu a primit acel mesaj.

Conexiunile, așa cum am indicat și eu, sunt făcute prin TCP / IP, iar serverul sau brokerul va ține o evidență a clienților conectați. În mod implicit, dispozitivele vor utiliza porturile de comunicații numărul 1883, deși este posibil să întâlniți și portul 8883 dacă utilizați SSL / TLS pentru securitate suplimentară.

Pentru ca conexiunea să fie posibilă, nu este nevoie doar de clienți, servere și porturi. Și alții pachete sau mesaje trimise pentru ca comunicarea să aibă loc:

  • Stabiliți conexiunea: CONECTARE mesaj / pachet trimis de client cu toate informațiile necesare. Aceste informații includ ID-ul clientului, numele de utilizator, parola etc. Brokerul sau serverul răspunde cu un pachet CONNACK care va informa clientul că conexiunea a fost acceptată, respinsă etc.
  • Trimiteți și primiți mesaje: odată ce conexiunea este stabilită, se publică pachetele sau mesajele cu subiectul și sarcina utilă a mesajului trimis brokerului. Pe de altă parte, clientul sau clienții interesați folosesc pachetele SUBSCRIBE și UNSUSCRIBE pentru a se abona sau a retrage respectivul abonament. Brokerul va răspunde, de asemenea, cu un pachet SUBACK și respectiv UNSUBACK pentru a raporta succesul operațiunii solicitate de client.
  • Menținerea conexiunii: pentru a garanta că conexiunea rămâne deschisă, clienții pot trimite periodic un pachet PINGREQ care va fi asociat cu un pachet PINGRESP de pe server.
  • Încheie conexiunea: când un client se deconectează, acesta trimite un pachet DISCONNECT pentru a raporta acel eveniment.

aceia mesaje sau pachete Cele despre care am vorbit au aceeași structură ca și alte pachete de alte protocoale de rețea:

  • Antet sau antet fix: este o parte fixă ​​care ocupă între 2-5 octeți. Conține un cod de control, ID-ul tipului de mesaj trimis și lungimea acestuia. Între 1-4 octeți sunt folosiți pentru a codifica lungimea, folosind primii 7 biți ai fiecărui octet ca date pentru lungime și un bit suplimentar de continuitate pentru a determina că există mai mult de un octet care alcătuiește lungimea mesajului.
  • Antet variabil: nu este întotdeauna obligatoriu, dar opțional. Este conținut doar în anumite pachete în anumite situații sau mesaje specifice.
  • Conținut sau date: pachetul de date este ceea ce conține de fapt mesajul care trebuie trimis. Poate fi de la câțiva kB până la o limită de 256 MB.

Dacă sunteți interesat să știți codul corespunzător în hexazecimal pentru tipurile de mesaje trimise sunt:

Mesaj Cod
LEGA 0x10
CONNACK 0x20
PUBLICA 0x30
PUBACK 0x40
pubrec 0x50
PUBREL 0x60
pubcomp 0x70
ABONARE 0x80
SUBACK 0x90
DESCRIERE 0xA0
DESFĂȘURAT 0xB0
PINGREQ 0xC =
PINRESP 0xD0
DECONECTAT 0xE0

Calitatea și securitatea comunicațiilor

Un alt detaliu important al mesajelor de MQTT este calitatea serviciului sau QoSși securitate. De aceasta va depinde robustețea sistemului de comunicații în caz de defecțiuni și siguranța acestuia.

În ceea ce privește calitatea sa, se poate determina 3 nivele diferite:

  • QoS 0 (nerecunoaștere)- Mesajul este trimis o singură dată, iar în caz de eșec nu va fi livrat. Se folosește atunci când nu este critic.
  • QoS 1 (recunoașteți): mesajul va fi trimis de câte ori este necesar pentru a garanta livrarea către client. Dezavantajul este că clientul ar putea primi același mesaj de mai multe ori.
  • QoS 2 (asigurat)- Similar cu cele de mai sus, dar garantat să fie livrat o singură dată. Este adesea folosit pentru sisteme mai critice în care este necesară o fiabilitate mai mare.

Pe de altă parte, în ceea ce privește Securitate MQTT, pot fi utilizate diferite măsuri pentru a-i asigura puterea în acest sens. După cum am menționat deja, autentificarea numelui de utilizator și a parolei, ca multe alte protocoale, poate fi asigurată de SSL / TLS. Deși multe dispozitive IoT cu capacități sau resurse mici, ar putea avea probleme cu supraîncărcarea muncii atunci când se utilizează acest tip de comunicație sigură ...

Din acest motiv, multe dispozitive IoT care utilizează MQTT folosesc parole și utilizatori în text plan, ceea ce ar putea face pe cineva să adulmece traficul de rețea pentru a-l obține foarte ușor. Și dacă acest lucru nu este suficient, brokerul poate fi configurat și pentru a accepta conexiuni anonime, ceea ce ar permite oricărui utilizator să stabilească comunicații, implicând un risc mai mare.

Utilizarea MQTT cu Arduino

Arduino UNO cu MQTT

Sigur ca poti utilizați protocolul MQTT cu Arduino și alte plăci de dezvoltare, precum și Rapsberry Pi etc. Pentru a face acest lucru, trebuie să asigurați placa Arduino cu conectivitate, dacă nu o are. De asemenea, biblioteca Client Arduino pentru MQTT vă va ajuta în aceste sarcini. Această bibliotecă este compatibilă cu:

Știți deja că puteți descărca și instala biblioteca în IDE-ul dvs. Arduino folosind comanda: git clone https://github.com/knolleary/pubsubclient.git

De îndată ce la cod pentru a utiliza MQTT în unele aplicații, adevărul este că este simplu. În imaginea Fritzing puteți vedea o placă Arduino UNO la care a fost adăugată conectivitatea prin Arduino Ethernet și a fost conectată și ea un senzor de umiditate și temperatură DHT22, deși ar fi putut fi orice altceva ...

Bine, cu toate acestea, pentru codul pe care trebuie să îl generați Arduino IDE Pentru a lucra cu protocolul MQTT pe Arduino, este atât de simplu:

  • la trimite mesaje 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);
}

  • la primiți mesaje de MQTT ai nevoie doar de placă Arduino UNO și conexiune, cu Arduino Ethernet sau orice alt element. În ceea ce privește codul, un exemplu ar fi:
#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();
}

Amintiți-vă că trebuie să schimbați adresa IP la cea corespunzătoare pentru server și trebuie să schimbați și adresa MAC a adaptorului dvs. de rețea Ethernet sau cea pe care o utilizați, precum și restul codului dacă intenționați să îl adaptați la un proiect diferit. Acesta este doar un exemplu!

Pentru mai multe informații, puteți descărcați gratuit Nuestro Manual PDF cu cursul Arduino IDE pentru a începe programarea.


Fii primul care comenteaza

Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.