MQTT: en åben netværksprotokol og dens betydning i IoT

MQTT-protokolnetværk IoT

Husk navnet MQTT, da det er en netværkskommunikationsprotokol type M2M (Machine to Machine), der kommer til at lyde ganske lidt. Det bliver ganske populært takket være den nye æra af tingenes internet eller IoT (tingenes internet) for dets forkortelse på engelsk. Derudover er det en åben protokol, som giver mange fordele.

Faktisk er det blevet en af ​​de centrale søjler i IoT, da det er ret godt på enheder med nogle transmissionsbegrænsninger som disse. Forkortelsen MQTT kommer fra Meddelelseskø telemetri transport, en åben standard fra OASIS og ISO (ISO / IEC 20922) til netværkskommunikation, og som generelt kører på den berømte TCP / IP.

Netværksprotokoller

OSI-model og dens lag

masse kommunikationsprotokoller De er regler, der tillader to eller flere enheder eller systemer at kommunikere med hinanden. Det vil sige, det er en protokol til at transmittere information på forskellige måder og med et defineret format, hvad enten det er implementeret af software og hardware (eller begge dele).

El standard i protokollen definerer en lang række kommunikationsegenskaber. Det kan gå fra reglerne for synkronisering, semantik, syntaks, pakkeformat osv. Og sandheden er, at de ikke er noget ubetydelige, da vi takket være disse protokoller i dag kan bruge internettet og andre kommunikationsnetværk ...

Og selvfølgelig er der ikke kun en protokol, men mange. For eksempel, den kendte DNS, FTP, MQTT, HTTP og HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP osv. Til applikationslaget. Mens du er i transportlaget kan du finde nogle så berømte som TCP, UDP osv. Såvel som dem fra internetlaget som IPv4 eller IPv6 (hvilket har muliggjort det største antal tilgængelige IP'er og ankomsten af ​​IoT ), IPSec osv. Og andre fra linklaget, såsom DSL, Ethernet, WiFi, ARP osv.

Om IoT-protokoller

MQTT-protokol

Der er selvfølgelig specifikke kommunikationsprotokoller, eller som kan anvendes på IoT. Det vil sige i betragtning af det foregående afsnit ville de være en række definerede standarder, så to eller flere IoT-enheder kan kommunikere og forstå hinanden, og de er generelt M2M, det vil sige maskine til maskinkommunikation. mange IoT-enheder tilsluttet og deler information fra sensorer eller andre kilder.

På grund af det store antal IoT-enheder skal disse protokoller opfylde krav ud over begrænsningerne for båndbredde, hastighed osv. (bemærk, at mange enheder er indlejrede og billige), som normalt findes i nogle enheder. Og jeg mener det faktum skal være skalerbar, for at kunne tilføje flere tilsluttede enheder, hvis det er nødvendigt og uden at påvirke det globale system.

De skal også have en lav afhængighed kobling mellem enheder, så der ikke genereres problemer, hvis en enhed fjernes. Og selvfølgelig søges der høj interoperabilitet, så det fungerer med et stort antal meget forskellige enheder og systemer, da IoT-verdenen er ret heterogen.

Andre nyttige funktioner er nemme at implementere dem, sikkerhed, etc. Husk, at IoT skaber store udfordringer i sikkerhedsaspektet. Endnu mere, når mange af de tilsluttede enheder normalt er kritiske i visse tilfælde ... for eksempel legetøj til mindreårige.

Vigtige begreber

Når det er sagt, skal det siges, at løsninger til IoT bruger en central server til at modtage meddelelserne fra alle de tilsluttede enheder, der udsender, og distribuere dem til alle de tilsluttede IoT-enheder, der lytter. Denne server er det, der er kendt som router eller mægler. Noget der på nogle måder er langt fra det konventionelle klient-server-forhold.

Endvidere metoderne som du kan finde i disse kommunikationsprotokoller til IoT er:

  • PubSub: Publish / Susbcribe er et meddelelsesmønster, hvor en enhed (Sub) informerer mægleren om, at den ønsker at modtage en besked, mens en anden enhed (Pub) offentliggør beskeder, som mægleren distribuerer til den / de andre enheder, der venter på dem.
  • rRPC: Router Remoder Procedure Calls er et andet mønster for ekstern procesudførelse. I den informerer en enhed (Callee) mægleren om, at den vil udføre en bestemt procedure, og mægleren distribuerer den til en anden enhed (Caller), som processen udføres på.

Nu for at udføre disse metoder eller mønstre, a meddelelsesinfrastruktur. Og i denne forstand kan man skelne mellem to:

  • Meddelelseskø: messaging-tjeneste, hvor der genereres en enkelt meddelelseskø til alle klienter, der starter et abonnement på mægleren. Sidstnævnte gemmer meddelelserne, indtil de leveres til klienten. Hvis klienten eller modtageren ikke er forbundet, opretholdes den, indtil den er tilsluttet. Disse typer tjenester er som dem, der bruges i instant messaging-apps som Telegra, WhatsApp, Messenger osv.
  • Meddelelsestjeneste: det er en anden tjeneste, hvor mægleren sender beskederne til den tilsluttede modtagerklient, filtreret efter typen af ​​besked. Hvis klienten eller modtagerenheden er afbrudt, går beskederne tabt (selvom det muligvis har noget logningssystem).

IoT-protokoller

Efter at have set ovenstående, lad os nu se nærmere på det IoT-protokoller der er bedre kendt. Blandt de mest fremtrædende af M2M er:

  • AMQP (Advanced Message Queuing Protocol): er en PubSub-protokol af Message Queue. Designet til at have god interoperabilitet og sikre pålidelighed. Specielt til virksomhedsapplikationer, høj ydeevne, netværk med høj latens, kritiske osv.
  • WAMP (Web Application Messaging Protocol): er en anden åben PubSub-type protokol som rRPC, og den kører på WebSockets.
  • CoAP (begrænset applikationsprotokol): er en protokol, der er specielt designet til applikationer med lav kapacitet.
  • TOMP (Streaming Text Oriented Messaging Protocol): meget enkel protokol og for at opnå maksimal interoperabilitet. HTTP bruges til at overføre tekstbeskeder.
  • XMPP (eXtensible Messaging and Presence Protocol): en anden protokol, der bruges i IoT til instant messaging-apps og baseret på XML. Jan denne sag er også åben.
  • WMQ (WebSphere Message Queuing): protokol udviklet af IBM. Det er af typen Message Queue, som navnet antyder, og er beskedorienteret.
  • MQTT: (se næste afsnit)

Alt om MQTT

MQTT-pakke

El MQTT-protokol Det er en meddelelseskø kommunikationsprotokol, der følger et PubSub-mønster og af M2M-typen, som jeg allerede har nævnt. Det bruges i vid udstrækning i IoT og er baseret på TCP / IP-stakken, der bruges på Internettet.

I tilfælde af MQTT, enhver forbindelse holdes åben og det genbruges i al nødvendig kommunikation. Noget andet end hvad der sker i andre kendte protokoller, at hver kommunikation finder sted, kræver en ny forbindelse.

Advantage

Fordelene ved MQTT-protokollen er meget tydelige med hensyn til M2M-kommunikation til IoT. Ud over alt sagt ovenfor er det en protokol, der giver:

  • Skalerbarhed for at forbinde flere og flere kunder.
  • Afkobling mellem klienter for mindre afhængighed.
  • Asynkronisme.
  • Enkelhed.
  • Let for ikke at forbruge for mange ressourcer (selvom det med TLS / SSL-sikkerhed går op).
  • Energieffektivt til enheder, der er afhængige af batteri eller fungerer 24/7, det har ikke brug for stor båndbredde (ideel til langsomme forbindelser, som f.eks. Nogle trådløse).
  • Sikkerhed og kvalitet for større pålidelighed og robusthed i kommunikationen.

historie

MQTT blev oprettet i 90'erne med en tidlig version af protokol i 1999. Det blev oprettet af Dr. Andy Stanford-Clark fra IBM og Arlen Nipper fra Cirrus Link (tidligere Eurotech).

La indledende idé var at oprette en protokol til overvågning af en rørledning, der rejste gennem ørkenen, med en effektiv kommunikationsprotokol (lav båndbreddeforbrug), lys og at et lavt energiforbrug. På det tidspunkt var det meget dyrt, men nu er det blevet en billig og åben protokol.

Den oprindelige protokol blev forbedret med udseendet af nye versioner, såsom MQTT v3.1 (2013) under OASIS-specifikationen (Organisation for fremme af strukturerede informationsstandarder) osv. Du burde vide, at det i starten var en proprietær IBM-protokol, men at den ville blive frigivet i 2010, og det endte med at blive en standard i OASIS ...

Sådan fungerer MQTT-forbindelsen

MQTT-protokollen bruger et filter, for de meddelelser, der sendes til hver klient, baseret på emner eller emner, der er organiseret hierarkisk. På denne måde kan en kunde sende en besked om et bestemt emne. På denne måde modtager alle de klienter eller tilsluttede enheder, der abonnerer på emnet, beskeder via mægleren.

Som det er MQ, meddelelser forbliver i køen og de går ikke tabt, før klienten har modtaget denne besked.

Forbindelserne, som jeg også antydede, er oprettet via TCP / IP, og serveren eller mægleren vil registrere de tilsluttede klienter. Enhederne bruger som standard kommunikationsporte nummer 1883, selvom du muligvis også støder på port 8883, hvis du bruger SSL / TLS for ekstra sikkerhed.

For at forbindelsen er mulig, er der ikke kun behov for klienter, servere og porte. Også andre pakker eller beskeder sendt for kommunikation at finde sted:

  • Opret forbindelse: CONNECT besked / pakke sendt af klienten med alle de nødvendige oplysninger. Disse oplysninger inkluderer kunde-id, brugernavn, adgangskode osv. Mægleren eller serveren reagerer med en CONNACK-pakke, der informerer klienten om, at forbindelsen blev accepteret, afvist osv.
  • Send og modtag beskeder: når forbindelsen er oprettet, bruges PUBLICER pakker eller meddelelser med emnet og nyttelasten af ​​meddelelsen sendt til mægleren. På den anden side bruger den eller de interesserede klienter SUBSCRIBE- og UNSUSCRIBE-pakker til at abonnere eller trække deres abonnement tilbage. Mægleren vil også svare med henholdsvis en SUBACK- og UNSUBACK-pakke for at rapportere om succesen af ​​den operation, som klienten har anmodet om.
  • Vedligeholdelse af forbindelsen: for at garantere, at forbindelsen forbliver åben, kan klienter periodisk sende en PINGREQ-pakke, der matches med en PINGRESP-pakke fra serveren.
  • Afslut forbindelse: når en klient afbryder forbindelsen, sender den en DISCONNECT-pakke for at rapportere hændelsen.

De der beskeder eller pakker Dem, jeg har talt om, har en struktur, der er den samme som andre pakker med andre netværksprotokoller:

  • Header eller fast header: er en fast del, der optager mellem 2-5 byte. Den indeholder en kontrolkode, ID for den sendte beskedstype og dens længde. Mellem 1-4 bytes bruges til at kode længden ved hjælp af de første 7 bits i hver oktet som data for længden og en ekstra kontinuitetsbit for at bestemme, at der er mere end en byte, der udgør meddelelsens længde.
  • Variabel overskrift: er ikke altid obligatorisk, men valgfri. Det er kun indeholdt i nogle pakker i visse situationer eller specifikke meddelelser.
  • Indhold eller data: pakkedataene er det, der rent faktisk indeholder den besked, der skal sendes. Det kan være fra nogle få kB til en 256 MB grænse.

Hvis du er interesseret i at vide den tilsvarende kode i hexadecimal for de typer meddelelser, der sendes, er:

besked Kode
FORBINDE 0x10
KONTAKT 0x20
OFFENTLIGGØRE 0x30
PUBACK 0x40
pubrec 0x50
PUBREL 0x60
pubcomp 0x70
TILBAGE 0x80
SÆLG 0x90
OPLYSNING 0xA0
AFBACK 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
KOBLE FRA 0xE0

Kvalitet og sikkerhed for kommunikation

En anden vigtig detalje i meddelelserne fra MQTT er servicekvalitet eller QoSog sikkerhed. Kommunikationssystemets robusthed i tilfælde af fejl og dets sikkerhed afhænger af dette.

Med hensyn til kvaliteten kan det bestemmes 3 forskellige niveauer:

  • QoS 0 (ikke-kendskab)- Meddelelsen sendes kun en gang, og i tilfælde af fejl vil den ikke blive leveret. Det bruges, når det ikke er kritisk.
  • QoS 1 (anerkend): meddelelsen sendes så mange gange som nødvendigt for at garantere levering til kunden. Ulempen er, at klienten kunne modtage den samme besked flere gange.
  • QoS 2 (sikret)- Svarende til ovenstående, men leveres kun én gang. Det bruges ofte til mere kritiske systemer, hvor der er behov for større pålidelighed.

På den anden side, hvad angår MQTT-sikkerhed, kan forskellige foranstaltninger anvendes til at sikre dets styrke i denne henseende. Som jeg allerede har kommenteret før, kan godkendelse af brugeren og adgangskoden, som mange andre protokoller, sikres ved hjælp af SSL / TLS. Selvom mange IoT-enheder med lav kapacitet eller ressourcer kan have problemer med overbelastning af arbejde, når de bruger denne type sikker kommunikation ...

Af denne grund bruger mange IoT-enheder, der bruger MQTT, adgangskoder og brugere i flytekst, hvilket kunne få nogen til at snuse netværkstrafik for at få dem meget let. Og hvis det ikke er nok, kan mægleren også konfigureres til at acceptere anonyme forbindelser, hvilket gør det muligt for enhver bruger at etablere kommunikation med større risiko.

Brug af MQTT med Arduino

Arduino UNO med MQTT

Selvfølgelig kan du brug MQTT-protokollen med Arduino og andre udviklingskort såvel som Rapsberry Pi osv. For at gøre dette skal du give dit Arduino-kort forbindelse, hvis det ikke har det. Også biblioteket Arduino-klient til MQTT det vil hjælpe dig i disse opgaver. Dette bibliotek er kompatibelt med:

Du ved allerede, at du kan downloade og installere biblioteket i din Arduino IDE ved hjælp af kommandoen: git-klon https://github.com/knolleary/pubsubclient.git

Så snart til koden for at bruge MQTT i en eller anden applikation er sandheden, at det er simpelt. På Fritzing-billedet kan du se en plak Arduino UNO til hvilken forbindelse via Arduino Ethernet er blevet tilføjet, og den er også blevet tilsluttet en DHT22 fugtigheds- og temperaturføler, selvom det kunne have været noget andet ...

Okay, når det er sagt, for den kode, du skal generere i Arduino IDE At arbejde med MQTT-protokollen på Arduino er det så simpelt:

  • til sende beskeder 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);
}

  • til modtage beskeder af MQTT behøver du kun pladen Arduino UNO og forbindelse med Arduino Ethernet eller ethvert andet element. Med hensyn til koden vil et eksempel være:
#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();
}

Husk, at du skal ændre IP til den rette til serveren, og du skal også ændre MAC-adressen på din Ethernet-netværksadapter eller den, du bruger, såvel som resten af ​​koden, hvis du har til hensigt at tilpasse den til et andet projekt. Dette er bare et eksempel!

For mere information kan du download gratis Nuestro PDF-vejledning med Arduino IDE-kurset for at starte programmeringen.


Vær den første til at kommentere

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.