MQTT: avatud võrguprotokoll ja selle tähtsus IoT-s

MQTT protokollivõrk IoT

Jäta nimi meelde MQTT, kuna see on võrgusideprotokolli tüüp M2M (Machine to Machine), mis hakkab kõlama üsna vähe. See on üsna populaarne tänu asjade Interneti või asjade Interneti uuele ajastule ingliskeelse lühendi tõttu. Lisaks on see avatud protokoll, mis annab palju eeliseid.

Tegelikult on sellest saanud IoT üks keskseid sambaid, kuna see on üsna hea seadmetes, millel on sellised edastamispiirangud nagu need. Lühend MQTT pärineb Sõnumi järjekorras telemeetria transport, OASISe ja ISO (ISO / IEC 20922) avatud standard võrgusuhtluseks ja töötab üldiselt kuulsal TCP / IP-l.

Võrguprotokollid

OSI mudel ja selle kihid

osa sideprotokollid Need on reeglid, mis võimaldavad kahel või enamal seadmel või süsteemil omavahel suhelda. See tähendab, et see on protokoll teabe edastamiseks mitmel viisil ja kindla vorminguga, olgu see tarkvara või riistvara (või mõlema) rakendatud.

El standard protokolli määratleb paljusid sideomadusi. See võib lähtuda sünkroonimise reeglitest, semantikast, süntaksist, pakettvormingust jne. Ja tõsi on see, et need pole tühised, kuna tänu nendele protokollidele saame täna kasutada Internetti ja muid sidevõrke ...

Ja muidugi pole olemas ainult ühte protokolli, vaid palju. Näiteks, kuulus Rakenduskihi DNS, FTP, MQTT, HTTP ja HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP jne. Transpordikihist leiate nii kuulsaid nagu TCP, UDP jne, kui ka Interneti-kihi, näiteks IPv4 või IPv6 (see, mis on võimaldanud suurima arvu saadaolevaid IP-sid ja IoT), IPSec jne ja teised linkikihist nagu DSL, Ethernet, WiFi, ARP jne.

IoT-protokollide kohta

MQTT protokoll

Muidugi on olemas spetsiaalsed sideprotokollid või neid saab rakendada IoT. See tähendab, et arvestades eelmist jaotist, oleksid need määratletud standardite rida, nii et kaks või enam IoT-seadet saaksid üksteisega suhelda ja aru saada ning need on tavaliselt M2M, see tähendab masina-masina suhtlus. paljud IoT-seadmed on ühendatud ja jagavad teavet anduritest või muudest allikatest.

IoT-seadmete suure hulga tõttu peavad need protokollid vastama nõuetele, mis ületavad ribalaiuse, kiiruse jne piiranguid. (pange tähele, et paljud seadmed on sisseehitatud ja odavad), mis on tavaliselt mõnes seadmes. Ja ma mõtlen seda peab olema skaleeritav, et oleks võimalik vajadusel ja globaalset süsteemi mõjutamata lisada rohkem ühendatud seadmeid.

Samuti peavad neil olema a madal sõltuvus seadmete ühendamine, nii et seadme eemaldamisel ei tekiks probleeme. Ja loomulikult taotletakse samal ajal kõrget koostalitlusvõimet, et see töötaks suure hulga seadmete ja väga mitmekesiste süsteemidega, kuna IoT maailm on üsna heterogeenne.

Muud kasulikud funktsioonid oleksid nende rakendamise lihtsus, turvalisus, jne. Pidage meeles, et IoT tekitab turvalisuse osas suuri väljakutseid. Veelgi enam, kui paljud ühendatud seadmed kipuvad teatud juhtudel olema kriitilised ... näiteks alaealiste mänguasjad.

Olulised mõisted

Sellest hoolimata tuleb öelda, et IoT lahendused kasutavad tsentraliseeritud serverit, et saada sõnumeid kõigist ühendatud seadmetest, mis neid väljastavad, ja levitada neid kõigile ühendatud IoT seadmetele, mis kuulavad. See server on nn ruuter või maakler. Midagi, mis on mõnes mõttes tavapärasest kliendi-serveri suhtest kaugel.

Lisaks metoodikad Nendest IoT sideprotokollidest leiate:

  • PubSub: Publish / Susbcribe on sõnumside muster, kus seade (alam) teatab maaklerile, et soovib sõnumit vastu võtta, samal ajal kui mõni teine ​​seade (pubi) avaldab vahendajale sõnumeid, mida levitada teistele neid ootavatele seadmetele.
  • rRPC: Ruuteri remoderi protseduurikõned on protsesside kaugkäivitamise teine ​​muster. Selles teavitab seade (Callee) maaklerit, et ta viib läbi teatud protseduuri ja maakler levitab selle teisele seadmele (helistajale), kus nimetatud protsess viiakse läbi.

Nende meetodite või mustrite teostamiseks a sõnumside infrastruktuur. Ja selles mõttes saab eristada kahte:

  • Sõnumijärjekord: sõnumside teenus, kus kõigi maakleri tellimust alustavate klientide jaoks luuakse üks sõnumijärjekord. Viimane säilitab sõnumeid seni, kuni need kliendile kätte saadetakse. Kui klient või saaja pole ühendatud, säilitatakse seda kuni ühenduse loomiseni. Seda tüüpi teenused on sarnased kiirsuhtlusrakendustes nagu Telegra, WhatsApp, Messenger jms.
  • Sõnumiteenus: see on veel üks teenus, kus maakler saadab sõnumid ühendatud vastuvõtjale, filtreerides sõnumi tüübi järgi. Kui klient või vastuvõttev seade on lahti ühendatud, lähevad sõnumid kaotsi (kuigi sellel võib olla mõni logimissüsteem).

IoT protokollid

Olles ülaltoodut näinud, vaatame nüüd lähemalt IoT protokollid mis on paremini teada. M2M-i silmapaistvamate hulka kuuluvad:

  • AMQP (täiustatud sõnumite järjekorra protokoll): on sõnumijärjekorra PubSubi tüüpi protokoll. Mõeldud hea koostalitlusvõime ja usaldusväärsuse tagamiseks. Spetsiaalne ettevõtte rakendustele, suure jõudlusega, suure latentsusega võrkudele, kriitilistele jne.
  • WAMP (veebirakenduse sõnumside protokoll): see on veel üks avatud PubSubi tüüpi protokoll nagu rRPC ja see töötab WebSocketides.
  • CoAP (piiratud rakenduse protokoll): on spetsiaalselt väikese võimsusega rakenduste jaoks loodud protokoll.
  • TOMP (voogesituse tekstisuunaline sõnumside protokoll): väga lihtne protokoll ja maksimaalse koostalitlusvõime saavutamiseks. HTTP-d kasutatakse tekstsõnumite edastamiseks.
  • XMPP (pikendatava sõnumside ja kohaloleku protokoll): teine ​​protokoll, mida IoT-s kasutatakse kiirsuhtlusrakenduste jaoks ja mis põhineb XML-il. Jan see juhtum on samuti avatud.
  • WMQ (WebSphere'i sõnumijärjekord): IBMi väljatöötatud protokoll. See on sõnumijärjekorra tüüp, nagu nimigi ütleb, ja on sõnumile orienteeritud.
  • MQTT: (vt järgmist jaotist)

Kõik MQTT-st

MQTT pakett

El MQTT protokoll See on sõnumijärjekorra kommunikatsiooniprotokoll, mis järgib PubSubi mustrit ja M2M tüüpi, nagu ma juba mainisin. Seda kasutatakse laialdaselt IoT-s ja see põhineb Internetis kasutataval TCP / IP-korstnal.

MQTT puhul iga ühendus hoitakse lahti ja seda kasutatakse uuesti igas vajalikus suhtluses. Midagi muud, mis juhtub teistes teadaolevates protokollides, et iga suhtlus toimub, on vaja uut ühendust.

Eelis

MQTT-protokolli eelised on IoT jaoks M2M-side osas üsna ilmsed. Lisaks kõigele eelpool öeldule on see protokoll, mis pakub:

  • Skaalautuvus, et ühendada üha uusi kliente.
  • Klientide vahelise lahtisidumine väiksema sõltuvuse tagamiseks.
  • Asünkroonsus.
  • Lihtsus.
  • Kergus, et mitte tarbida liiga palju ressursse (kuigi TLS / SSL-i turvalisuse korral see tõuseb).
  • Energiasäästlik seadmete puhul, mis sõltuvad akust või töötavad ööpäevaringselt, ei vaja see suurt ribalaiust (ideaalne aeglaste ühenduste jaoks, nagu mõned traadita ühendused).
  • Turvalisus ja kvaliteet kommunikatsiooni suurema usaldusväärsuse ja usaldusväärsuse tagamiseks.

ajalugu

MQTT loodi 90ndatel koos varajase versiooniga protokoll 1999. aastal. Selle lõid dr Andy Stanford-Clark IBMist ja Arlen Nipper Cirrus Linkist (endine Eurotech).

La esialgne idee pidi looma protokolli kõrbe läbinud torujuhtme jälgimiseks koos tõhusa sideprotokolliga (madal ribalaiuse tarbimine), valgusega ja madala energiakuluga. Toona oli see väga kallis, kuid nüüd on sellest saanud odav ja avatud protokoll.

Esialgset protokolli täiustati uued versioonid, nagu näiteks MQTT v3.1 (2013) spetsifikatsiooni OASIS (Organisation for the Advancement of Structured Information Standards) järgi jne. Peaksite teadma, et alguses oli see IBMi patenteeritud protokoll, kuid see ilmus 2010. aastal ja lõpuks sai sellest OASISe standard ...

Kuidas MQTT-ühendus töötab

MQTT protokoll kasutab filter, igale kliendile saadetud sõnumite jaoks hierarhiliselt korraldatud teemade või teemade põhjal. Nii saab klient postitada sõnumi kindlal teemal. Nii saavad kõik need kliendid või ühendatud seadmed, kes teemat tellivad, maakleri kaudu sõnumeid.

Nagu ka MQ, sõnumid jäävad järjekorda ja neid ei kaota enne, kui klient on selle teate kätte saanud.

Ühendused, nagu ma ka osutasin, on loodud TCP / IP kauduja server või maakler peab ühendatud klientide üle arvestust pidama. Vaikimisi kasutavad seadmed sidepordi numbrit 1883, ehkki võite leida ka pordi 8883, kui kasutate lisaturvalisuseks SSL / TLS-i.

Ühenduse võimaldamiseks pole vaja ainult kliente, servereid ja porte. Ka teised pakid või saadetud sõnumid suhtluse toimumiseks:

  • Looge ühendus: ÜHENDA kliendi saadetud sõnum / pakett kogu vajaliku teabega. See teave sisaldab kliendi ID-d, kasutajanime, parooli jne. Maakler või server vastab CONNACK paketiga, mis teavitab klienti ühenduse vastuvõtmisest, tagasilükkamisest jne.
  • Sõnumite saatmine ja vastuvõtmine: kui ühendus on loodud, kasutatakse avaldajale paketti või sõnumeid koos vahendajale saadetud teema ja kasuliku koormusega. Teiselt poolt, huvitatud klient või kliendid kasutavad SUBSCRIBE ja UNSUSCRIBE pakette vastavalt oma liitumiseks või tellimuse tühistamiseks. Maakler vastab ka paketi SUBACK ja UNSUBACK kaudu, et anda teada kliendi soovitud toimingu edukusest.
  • Ühenduse säilitamine: ühenduse püsimise tagamiseks saavad kliendid perioodiliselt saata serverist PINGREQ-paketi, mis sobib PINGRESP-paketiga.
  • Lõpeta ühendus: kui klient katkestab ühenduse, saadab ta sellest sündmusest teavitamise jaoks ühenduse katkestamise pakett.

Need sõnumeid või pakette Neil, kellest olen rääkinud, on sama struktuur nagu teistel võrguprotokollide pakettidel:

  • Päis või fikseeritud päis: on fikseeritud osa, mis mahutab 2–5 baiti. See sisaldab kontrollkoodi, saadetud sõnumi tüübi ID ja selle pikkust. Pikkuse kodeerimiseks kasutatakse 1–4 baiti, kasutades pikkuse andmetena iga okteti esimest 7 bitti ja täiendavat järjepidevuse bitti, et teha kindlaks, kas sõnumi pikkuseks on rohkem kui üks bait.
  • Muutuv päis: pole alati kohustuslik, kuid valikuline. Mõnes paketis sisaldub see ainult teatud olukordades või konkreetsetes sõnumites.
  • Sisu või andmed: pakettandmeside sisaldab tegelikult saadetavat sõnumit. See võib olla mõnest kB-st kuni 256 MB-ni.

Kui olete huvitatud teadmisest vastav kood kuueteistkümnendsüsteemis saadetud sõnumite tüübid on järgmised:

sõnum Kood
CONNECT 0x10
TAGASI 0x20
AVALIK 0x30
PUBAKK 0x40
pubrec 0x50
PUBREL 0x60
pubcomp 0x70
TELLI 0x80
TAGASI 0x90
TÕHUSTAMATU 0xA0
VÄLJAVAADE 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
ÜHENDAMINE 0xE0

Side kvaliteet ja turvalisus

Teine oluline detail MQTT sõnumitest on teenuse kvaliteet või QoSja turvalisus. Sellest sõltub sidesüsteemi töökindlus rikete korral ja selle ohutus.

Selle kvaliteedi osas saab seda määrata 3 erinevat taset:

  • QoS 0 (teadmatus)- Sõnumit saadetakse ainult üks kord ja tõrke korral seda ei edastata. Seda kasutatakse siis, kui see pole kriitiline.
  • QoS 1 (kinnitus): sõnumit saadetakse nii mitu korda kui vaja, et tagada kliendile kohaletoimetamine. Negatiivne külg on see, et klient võiks sama sõnumi saada mitu korda.
  • 2. QoS (kindel)- Sarnaselt ülaltoodule, kuid tarnitakse garanteeritult ainult üks kord. Seda kasutatakse sageli kriitilisemate süsteemide jaoks, kus on vaja suuremat töökindlust.

Teiselt poolt, nagu MQTT turvalisus, saab selle tugevuse tagamiseks kasutada erinevaid meetmeid. Nagu ma juba varem mainisin, saab kasutajanime ja parooli nagu ka paljude teiste protokollide autentimise tagada SSL / TLS-i abil. Kuigi paljudel madala võimsuse või ressurssidega IoT-seadmetel võib seda tüüpi turvalise side kasutamisel tekkida probleeme töö ülekoormusega ...

Sel põhjusel kasutavad paljud IQT-seadmed, mis kasutavad MQTT-d, paroole ja kasutajaid tasapinnaline tekst, mis võib panna kedagi võrguliiklust nuuskima, et neid väga hõlpsalt kätte saada. Ja kui sellest ei piisa, saab maakleri konfigureerida ka anonüümsete ühenduste vastuvõtmiseks, mis võimaldaks igal kasutajal luua suurema riskiga sidet.

MQTT kasutamine Arduinoga

Arduino UNO koos MQTT-ga

Muidugi sa suudad kasutage Arduinoga MQTT-protokolli ja muud arendusplaadid, samuti Rapsberry Pi jne. Selleks peate pakkuma oma Arduino tahvlile ühenduse, kui tal seda pole. Samuti raamatukogu Arduino klient MQTT-le see aitab teil neid ülesandeid täita. See teek ühildub järgmisega:

Te juba teate, et saate teegi oma Arduino IDE-sse alla laadida ja installida käsuga: giti kloon https://github.com/knolleary/pubsubclient.git

Niipea kui MQTT kasutamiseks koodile mõnes rakenduses on tõde see, et see on lihtne. Fritzingi pildil näete tahvlit Arduino UNO millele on lisatud Arduino Etherneti ühenduvus ja see on ka ühendatud a niiskuse ja temperatuuri andur DHT22, kuigi see oleks võinud olla midagi muud ...

Ok, sellega öeldes on kood, mille jaoks peate genereerima Arduino IDE Arduinos MQTT-protokolliga töötamiseks on see nii lihtne:

  • et sõnumeid saatma 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);
}

  • et sõnumeid vastu võtta MQTT poolt vajate ainult plaati Arduino UNO ja ühendus Arduino Etherneti või mõne muu elemendiga. Koodi kohta võiks näiteks olla:
#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();
}

Pidage meeles, et peate muutma IP serveri jaoks sobivaks, samuti peate muutma oma Etherneti võrguadapteri või kasutatava aadressi MAC-aadressi, samuti ülejäänud koodi, kui kavatsete seda kohandada teistsugune projekt. See on vaid näide!

Lisateabe saamiseks saate lae alla tasuta nuestro PDF-i kasutusjuhend Arduino IDE kursusega programmeerimise alustamiseks.


Ole esimene kommentaar

Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.