MQTT: een open netwerkprotocol en het belang ervan in het IoT

MQTT-protocol netwerk ivd

Onthoud de naam MQTT, aangezien het een netwerkcommunicatieprotocol is van het type M2M (Machine to Machine) dat nogal wat zal klinken. Het wordt behoorlijk populair dankzij het nieuwe tijdperk van het Internet of Things of IoT (Internet of Things) voor het acroniem in het Engels. Daarnaast is het een open protocol, wat veel voordelen geeft.

In feite is het een van de centrale pijlers van het IoT geworden, aangezien het redelijk goed is op apparaten met een aantal transmissiebeperkingen zoals deze. De afkorting MQTT komt van Message Queuing-telemetrietransport, een open standaard van OASIS en ISO (ISO / IEC 20922) voor netwerkcommunicatie en die doorgaans draait op het bekende TCP / IP.

Netwerkprotocollen

OSI-model en zijn lagen

De communicatieprotocollen Het zijn regels waarmee twee of meer apparaten of systemen met elkaar kunnen communiceren. Dat wil zeggen, het is een protocol om informatie op verschillende manieren en met een gedefinieerd formaat te verzenden, of het nu geïmplementeerd is door software en hardware (of beide).

El standaard van het protocol definieert een groot aantal communicatiekenmerken. Het kan gaan van de regels van synchronisatie, semantiek, syntaxis, pakketformaat, enz. En de waarheid is dat ze niet iets te verwaarlozen zijn, want dankzij deze protocollen kunnen we tegenwoordig internet en andere communicatienetwerken gebruiken ...

En natuurlijk is er niet slechts één protocol, maar er zijn er vele. Bijvoorbeeld, de beroemde DNS, FTP, MQTT, HTTP en HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP, enz., Voor de applicatielaag. In de transportlaag kun je er enkele vinden die beroemd zijn als TCP, UDP, enz., Evenals die van de internetlaag zoals IPv4 of IPv6 (wat het grootste aantal beschikbare IP's en de komst van het IoT mogelijk heeft gemaakt). ), IPSec, enz., En anderen van de linklaag zoals DSL, Ethernet, WiFi, ARP, enz.

Over IoT-protocollen

MQTT-protocol

Natuurlijk zijn er specifieke communicatieprotocollen of die kunnen worden toegepast op de IoT. Dat wil zeggen dat, gezien de vorige sectie, het een reeks gedefinieerde standaarden zou zijn, zodat twee of meer IoT-apparaten kunnen communiceren en elkaar kunnen begrijpen, en het is meestal M2M, dat wil zeggen machine-naar-machine-communicatie. veel IoT-apparaten zijn aangesloten en delen informatie van sensoren of andere bronnen.

Vanwege het grote aantal IoT-apparaten moeten deze protocollen voldoen aan vereisten die verder gaan dan de beperkingen van bandbreedte, snelheid, enz. (Houd er rekening mee dat veel apparaten ingebed en goedkoop zijn), wat meestal in sommige apparaten zit. En ik bedoel het feit dat moet schaalbaar zijn, om indien nodig meer aangesloten apparaten toe te voegen zonder het globale systeem te beïnvloeden.

Ze moeten ook een lage afhankelijkheid koppeling tussen apparaten, zodat er geen problemen ontstaan ​​als een apparaat wordt verwijderd. En natuurlijk wordt tegelijkertijd een hoge interoperabiliteit gezocht, zodat het werkt met een groot aantal apparaten en zeer gevarieerde systemen, aangezien de wereld van IoT behoorlijk heterogeen is.

Andere handige functies zijn het gemak waarmee ze kunnen worden geïmplementeerd, veiligheid, enz. Houd er rekening mee dat het IoT voor grote uitdagingen zorgt op het gebied van beveiliging. Zeker wanneer veel van de aangesloten apparaten in bepaalde gevallen vaak kritiek zijn ... bijvoorbeeld speelgoed voor minderjarigen.

Belangrijke begrippen

Dat gezegd hebbende, moet gezegd worden dat oplossingen voor het IoT een gecentraliseerde server gebruiken om de berichten te ontvangen van alle aangesloten apparaten die ze uitzenden en deze te distribueren naar alle aangesloten IoT-apparaten die luisteren. Die server is wat bekend staat als router of makelaar. Iets dat in sommige opzichten verre van de conventionele client-server-relatie is.

Bovendien de methodologieën die u kunt vinden in deze communicatieprotocollen voor IoT zijn:

  • PubSub: Publish / Susbcribe is een berichtenpatroon waarbij een apparaat (Sub) de broker informeert dat het een bericht wil ontvangen, terwijl een ander apparaat (Pub) berichten publiceert zodat de broker deze kan distribueren naar de andere apparaten die erop wachten.
  • rRPC: Router Remoder Procedure Aanroepen is een ander patroon van procesuitvoering op afstand. Daarin informeert een apparaat (Callee) de makelaar dat het een bepaalde procedure zal uitvoeren en de makelaar distribueert het naar een ander apparaat (beller) waarop dat proces wordt uitgevoerd.

Nu, om deze methodologieën of patronen uit te voeren, a messaging-infrastructuur. En in die zin kunnen er twee worden onderscheiden:

  • Berichtenwachtrij: berichtenservice waarbij één berichtenwachtrij wordt gegenereerd voor alle klanten die een abonnement op de makelaar starten. Deze laatste bewaart de berichten totdat ze bij de klant zijn afgeleverd. Als de cliënt of ontvanger geen verbinding heeft, wordt deze gehandhaafd totdat deze is verbonden. Dit soort services zijn vergelijkbaar met die gebruikt worden in instant messaging-apps zoals Telegra, WhatsApp, Messenger, enz.
  • Berichtenservice: het is een andere service waarbij de makelaar de berichten naar de verbonden ontvangende client stuurt, gefilterd op het type bericht. Als de verbinding met de client of het ontvangende apparaat is verbroken, gaan de berichten verloren (hoewel het mogelijk een logboeksysteem heeft).

IoT-protocollen

Nu we het bovenstaande hebben gezien, laten we het nu eens nader bekijken IoT-protocollen die beter bekend zijn. Tot de meest prominente M2M behoren:

  • AMQP (geavanceerd Message Queuing-protocol): is een PubSub-type protocol van Message Queue. Ontworpen voor een goede interoperabiliteit en om betrouwbaarheid te garanderen. Speciaal voor bedrijfstoepassingen, hoge prestaties, netwerken met hoge latentie, kritiek, enz.
  • WAMP (Web Applicatie Messaging Protocol): het is een ander open protocol van het type PubSub zoals rRPC, en het draait op WebSockets.
  • CoAP (beperkt toepassingsprotocol): is een protocol dat speciaal is ontworpen voor toepassingen met een lage capaciteit.
  • TOMP (Streaming Text Oriented Messaging Protocol): zeer eenvoudig protocol en om maximale interoperabiliteit te bereiken. HTTP wordt gebruikt om tekstberichten te verzenden.
  • XMPP (eXtensible Messaging en Presence Protocol): een ander protocol dat in IoT wordt gebruikt voor instant messaging-apps en is gebaseerd op XML. Jan is ook deze zaak open.
  • WMQ (WebSphere-berichtenwachtrij): protocol ontwikkeld door IBM. Het is van het type Message Queue, zoals de naam suggereert, en is berichtgeoriënteerd.
  • MQTT: (zie volgende sectie)

Alles over MQTT

MQTT-pakket

El MQTT-protocol Het is een Message Queue-communicatieprotocol, dat een PubSub-patroon volgt, en van het M2M-type, zoals ik al heb genoemd. Het wordt veel gebruikt in het IoT en is gebaseerd op de TCP / IP-stack die op internet wordt gebruikt.

In het geval van MQTT, elke verbinding wordt opengehouden en het wordt hergebruikt in alle noodzakelijke communicatie. Iets anders dan wat er gebeurt in andere bekende protocollen, dat elke communicatie plaatsvindt, vereist een nieuwe verbinding.

Voordelen

De voordelen van het MQTT-protocol zijn vrij duidelijk in termen van M2M-communicatie voor IoT. Naast alles wat hierboven is gezegd, is het een protocol dat voorziet in:

  • Schaalbaarheid, om steeds meer klanten te verbinden.
  • Ontkoppeling tussen clients, voor minder afhankelijkheid.
  • Asynchronisme.
  • Eenvoud.
  • Lichtheid om niet te veel bronnen te verbruiken (hoewel het met TLS / SSL-beveiliging omhoog gaat).
  • Energiezuinig voor apparaten die afhankelijk zijn van de batterij of 24/7 werken, het heeft geen grote bandbreedte nodig (ideaal voor langzame verbindingen, zoals sommige draadloze).
  • Beveiliging en kwaliteit, voor meer betrouwbaarheid en robuustheid in communicatie.

Geschiedenis

MQTT is gemaakt in de jaren 90, met een vroege versie van de protocol in 1999. Het is gemaakt door Dr. Andy Stanford-Clark van IBM en Arlen Nipper van Cirrus Link (voorheen Eurotech).

La eerste idee was om een ​​protocol te maken om een ​​pijpleiding die door de woestijn reisde te monitoren, met een efficiënt communicatieprotocol (laag bandbreedteverbruik), licht en dat een laag energieverbruik. Destijds was het erg duur, maar nu is het een goedkoop en open protocol geworden.

Het oorspronkelijke protocol is verbeterd met het verschijnen van nieuwe versies, zoals MQTT v3.1 (2013) onder de OASIS-specificatie (Organization for the Advancement of Structured Information Standards), enz. U moet weten dat het in het begin een eigen protocol van IBM was, maar dat het in 2010 zou worden uitgebracht en dat het uiteindelijk een standaard werd in OASIS ...

Hoe de MQTT-verbinding werkt

Het MQTT-protocol gebruikt een filter, voor de berichten die naar elke klant worden verzonden, op basis van onderwerpen of onderwerpen die hiërarchisch zijn georganiseerd. Op deze manier kan een klant een bericht plaatsen over een specifiek onderwerp. Op deze manier ontvangen al die klanten of aangesloten apparaten die zich abonneren op het onderwerp berichten via de makelaar.

Net als MQ, berichten blijven in de wachtrij en ze zijn niet verloren totdat de klant dat bericht heeft ontvangen.

De verbindingen zijn, zoals ik ook aangaf, gemaakt via TCP / IP, en de server of broker houdt een record bij van de aangesloten clients. Standaard gebruiken de apparaten communicatiepoorten nummer 1883, hoewel u ook poort 8883 kunt tegenkomen als u SSL / TLS gebruikt voor extra beveiliging.

Om de verbinding mogelijk te maken, zijn niet alleen clients, servers en poorten nodig. Ook anderen pakketten of berichten verzonden om communicatie te laten plaatsvinden:

  • Breng verbinding tot stand: CONNECT-bericht / pakket verzonden door de klant met alle benodigde informatie. Die informatie omvat de klant-ID, gebruikersnaam, wachtwoord, enz. De broker of server antwoordt met een CONNACK-pakket dat de klant informeert dat de verbinding is geaccepteerd, geweigerd, enz.
  • Berichten verzenden en ontvangen: zodra de verbinding tot stand is gebracht, worden PUBLISH-pakketten of berichten gebruikt met het onderwerp en de payload van het bericht dat naar de makelaar wordt verzonden. Aan de andere kant gebruiken de geïnteresseerde klant of klanten de pakketten SUBSCRIBE en UNSUSCRIBE om zich respectievelijk in te schrijven of hun abonnement in te trekken. De makelaar zal ook reageren met respectievelijk een SUBACK- en UNSUBACK-pakket om het succes van de door de klant gevraagde operatie te rapporteren.
  • De verbinding onderhouden: om te garanderen dat de verbinding open blijft, kunnen clients periodiek een PINGREQ-pakket verzenden dat wordt gematcht met een PINGRESP-pakket van de server.
  • Verbinding verbreken: wanneer een client de verbinding verbreekt, wordt een DISCONNECT-pakket verzonden om die gebeurtenis te rapporteren.

die berichten of pakketten Degenen waar ik het over heb, hebben dezelfde structuur als andere pakketten van andere netwerkprotocollen:

  • Kop of vaste kop: is een vast gedeelte dat tussen de 2 en 5 bytes in beslag neemt. Het bevat een controlecode, ID van het type bericht dat is verzonden en de lengte ervan. Tussen 1-4 bytes worden gebruikt om de lengte te coderen, waarbij de eerste 7 bits van elk octet worden gebruikt als gegevens voor de lengte en een extra continuïteitsbit om te bepalen dat er meer dan één byte is waaruit de lengte van het bericht bestaat.
  • Variabele header: is niet altijd verplicht, maar optioneel. Het zit alleen in bepaalde pakketten in bepaalde situaties of specifieke berichten.
  • Inhoud of gegevens: de pakketgegevens bevatten het te verzenden bericht. Het kan variëren van een paar kB tot een limiet van 256 MB.

Als u geïnteresseerd bent om te weten de bijbehorende code in hexadecimaal voor de soorten verzonden berichten zijn:

Bericht Code
CONTACT 0x10
AANSLUITEN 0x20
PUBLICEREN 0x30
PUBACK 0x40
publiek 0x50
PUBREL 0x60
pubcomp 0x70
ABONNEER 0x80
SUBACK 0x90
ONSCHULDIG 0xA0
UITZETTEN 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
VERBINDING VERBREKEN 0xE0

Kwaliteit en veiligheid van communicatie

Een ander belangrijk detail van de berichten van MQTT is het servicekwaliteit of QoS, en veiligheid. De robuustheid van het communicatiesysteem bij storingen en de veiligheid ervan zijn hiervan afhankelijk.

Met betrekking tot de kwaliteit kan deze worden bepaald 3 verschillende niveaus:

  • QoS 0 (niet bekend)- Het bericht wordt slechts één keer verzonden en in geval van een storing wordt het niet afgeleverd. Het wordt gebruikt als het niet kritisch is.
  • QoS 1 (bevestigen): het bericht wordt zo vaak verzonden als nodig is om aflevering bij de klant te garanderen. Het vervelende is dat de klant hetzelfde bericht meerdere keren kan ontvangen.
  • QoS 2 (verzekerd)- Vergelijkbaar met hierboven, maar wordt gegarandeerd maar één keer geleverd. Het wordt vaak gebruikt voor meer kritische systemen waar een grotere betrouwbaarheid vereist is.

Aan de andere kant, wat betreft MQTT-beveiligingkunnen verschillende maatregelen worden gebruikt om de sterkte in dit opzicht te waarborgen. Zoals ik al eerder heb vermeld, kan de authenticatie van de gebruikersnaam en het wachtwoord, net als veel andere protocollen, worden verzekerd door middel van SSL / TLS. Hoewel veel IoT-apparaten met lage capaciteiten of bronnen problemen kunnen hebben met de overbelasting van werk bij het gebruik van dit soort beveiligde communicatie ...

Om deze reden gebruiken veel IoT-apparaten die MQTT gebruiken wachtwoorden en gebruikers in vliegtuig tekst, waardoor iemand netwerkverkeer kan opsnuiven om ze heel gemakkelijk te krijgen. En alsof dat nog niet genoeg is, kan de makelaar ook worden geconfigureerd om anonieme verbindingen te accepteren, waardoor elke gebruiker communicatie tot stand kan brengen, wat een groter risico met zich meebrengt.

MQTT gebruiken met Arduino

Arduino UNO met MQTT

Natuurlijk kan je dat gebruik het MQTT-protocol met Arduino en andere ontwikkelborden, evenals de Rapsberry Pi, enz. Om dit te doen, moet u uw Arduino-bord voorzien van connectiviteit, als het deze niet heeft. Ook de bibliotheek Arduino Client voor MQTT het zal u bij deze taken helpen. Deze bibliotheek is compatibel met:

Je weet al dat je de bibliotheek in je Arduino IDE kunt downloaden en installeren met behulp van het commando: git kloon https://github.com/knolleary/pubsubclient.git

Zodra naar de code om MQTT te gebruiken in sommige toepassingen is de waarheid dat het eenvoudig is. In de Fritzing-afbeelding zie je een plaquette Arduino UNO waaraan connectiviteit is toegevoegd door Arduino Ethernet en het is ook aangesloten een DHT22 vochtigheids- en temperatuursensor, hoewel het iets anders had kunnen zijn ...

Oké, met dat gezegd, voor de code die je moet genereren in Arduino IDE Om met het MQTT-protocol op Arduino te werken, is het zo simpel:

  • naar verzend berichten 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);
}

  • naar berichten ontvangen van MQTT heb je alleen de plaat nodig Arduino UNO en verbinding, met Arduino Ethernet of een ander element. Wat betreft de code, zou een voorbeeld zijn:
#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();
}

Vergeet niet dat u het IP-adres moet wijzigen in het juiste IP-adres voor de server, en dat u ook het MAC-adres van uw Ethernet-netwerkadapter of degene die u gebruikt, moet wijzigen, evenals de rest van de code als u van plan bent het aan te passen aan een ander project. Dit is slechts een voorbeeld!

Voor meer informatie kunt u download gratis onze PDF-handleiding met de Arduino IDE-cursus om te beginnen met programmeren.


Wees de eerste om te reageren

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.