MQTT: atviro tinklo protokolas ir jo svarba DI

MQTT protokolo tinklas IoT

Prisiminti vardą MQTT, nes tai yra tinklo ryšio protokolo tipas M2M („Machine to Machine“), kuris skambės gana mažai. Jis tampa gana populiarus dėl naujosios daiktų interneto ar daiktų interneto eros dėl akronimo anglų kalba. Be to, tai yra atviras protokolas, suteikiantis daug privalumų.

Tiesą sakant, jis tapo vienu iš centrinių IoT ramsčių, nes jis yra gana geras įrenginiuose, turinčiuose tokius perdavimo apribojimus. Akronimas MQTT kilęs iš Pranešimų laukimas Telemetrijos transportas, atviras tinklo ryšių OASIS ir ISO standartas (ISO / IEC 20922), kuris paprastai veikia garsiajame TCP / IP.

Tinklo protokolai

OSI modelis ir jo sluoksniai

Los ryšio protokolai tai taisyklės, leidžiančios dviem ar daugiau įrenginių ar sistemų bendrauti tarpusavyje. Tai yra protokolas, skirtas perduoti informaciją įvairiomis priemonėmis ir nustatytu formatu, nesvarbu, ar ją įgyvendina programinė ir techninė įranga (ar abi).

El standartinis protokolo apibrėžia daugybę ryšio charakteristikų. Tai gali kilti iš sinchronizavimo taisyklių, semantikos, sintaksės, paketų formato ir kt. Tiesa yra ta, kad jie nėra nereikšmingi, nes šių protokolų dėka šiandien galime naudotis internetu ir kitais ryšių tinklais ...

Žinoma, yra ne tik vienas protokolas, bet ir daug. Pavyzdžiui, garsusis Programos sluoksnio DNS, FTP, MQTT, HTTP ir HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP ir kt. Transporto lygmenyje galite rasti tokius garsius kaip TCP, UDP ir kt., Taip pat interneto sluoksnio, pvz., IPv4 ar IPv6 (tas, kuris leido pasiekti daugiausiai galimų IP ir atvykti internetas), IPSec ir kt., ir kiti nuorodų sluoksnio, pvz., DSL, Ethernet, WiFi, ARP ir kt.

Apie IoT protokolus

MQTT protokolas

Žinoma, yra specialių ryšio protokolų, kuriuos galima pritaikyti DI. Tai reiškia, kad atsižvelgiant į ankstesnį skyrių, jie būtų apibrėžtų standartų serija, kad du ar daugiau daiktų interneto prietaisų galėtų bendrauti ir suprasti vienas kitą, ir paprastai jie yra M2M, tai yra mašinų tarpusavio ryšiai. daugelis IoT įrenginių prijungti ir dalijasi informacija iš jutiklių ar kitų šaltinių.

Dėl didelio daiktų interneto įrenginių skaičiaus šie protokolai turi atitikti reikalavimus, viršijančius pralaidumo, greičio ir kt. (turėkite omenyje, kad daugelis įrenginių yra įdėti ir pigūs), o tai dažniausiai būna kai kuriuose įrenginiuose. Aš turiu omenyje tai turi būti keičiamo dydžio, kad prireikus būtų galima pridėti daugiau prijungtų įrenginių ir nedaryti įtakos pasaulinei sistemai.

Be to, jie turi turėti maža priklausomybė prietaisų sujungimas, kad pašalinus prietaisą nekiltų problemų. Be abejo, tuo pačiu metu siekiama didelio sąveikumo, kad jis veiktų su daugeliu įrenginių ir labai įvairiomis sistemomis, nes IoT pasaulis yra gana nevienalytis.

Kitos naudingos funkcijos būtų paprastas jų įgyvendinimas, saugumasir kt. Atminkite, kad DI kelia didelių iššūkių saugumo aspektu. Dar labiau, kai daugelis prijungtų prietaisų tam tikrais atvejais būna kritiški ... pavyzdžiui, žaislai nepilnamečiams.

Svarbios sąvokos

Be to, reikia pasakyti, kad IoT sprendimai naudoja centralizuotą serverį, kad gautų pranešimus iš visų prijungtų įrenginių, kurie skleidžia ir paskirsto juos visiems prijungtiems IoT įrenginiams, kurie klausosi. Tas serveris yra tai, kas žinoma maršrutizatorius ar brokeris. Kažkas toli gražu nėra įprastas kliento ir serverio santykis.

Be to, metodikos Šiuos interneto protokolus galite rasti:

  • PubSub: „Publish / Susbcribe“ yra pranešimų siuntimo šablonas, kai įrenginys (antrinis) informuoja brokerį, kad jis nori gauti pranešimą, o kitas įrenginys („Pub“) skelbia pranešimus, kuriuos brokeris gali platinti kitiems jų laukiantiems įrenginiams.
  • RPK: Maršrutizatoriaus modifikavimo procedūros iškvietimai yra dar vienas nuotolinio proceso vykdymo modelis. Jame prietaisas („Callee“) praneša brokeriui, kad jis atliks tam tikrą procedūrą, o brokeris ją paskirsto kitam įrenginiui (skambintojui), kuriame vykdomas minėtas procesas.

Norėdami atlikti šias metodikas ar modelius, a susirašinėjimo infrastruktūra. Šia prasme galima išskirti du:

  • Pranešimų eilė: susirašinėjimo paslauga, kai visiems klientams, kurie pradeda brokerio prenumeratą, sukuriama vieno pranešimo eilė. Pastarasis išsaugos žinutes, kol bus pristatytos klientui. Jei klientas ar gavėjas nėra prisijungę, jis palaikomas tol, kol prisijungs. Šios paslaugos yra panašios į tas, kurios naudojamos tiesioginių pranešimų programose, tokiose kaip „Telegra“, „WhatsApp“, „Messenger“ ir kt.
  • Pranešimų tarnyba: tai dar viena paslauga, kurioje brokeris siunčia pranešimus prijungtam gavėjui klientui, filtruodamas pagal pranešimo tipą. Jei klientas arba priėmimo įrenginys atjungtas, pranešimai prarandami (nors jame gali būti tam tikra registravimo sistema).

Daiktų interneto protokolai

Pamatę aukščiau išdėstytus dalykus, dabar pažvelkime atidžiau Daiktų interneto protokolai kurie yra geriau žinomi. Tarp žymiausių M2M yra:

  • AMQP (išplėstinis pranešimų eilės nustatymo protokolas): yra pranešimų eilės „PubSub“ tipo protokolas. Sukurta taip, kad būtų gerai sąveikios ir užtikrintų patikimumą. Ypač įmonių programoms, didelio našumo, didelės delsos tinklams, kritiniams ir kt.
  • WAMP (žiniatinklio programų pranešimų protokolas): tai dar vienas atviras „PubSub“ tipo protokolas, pvz., „rRPC“, ir jis veikia „WebSockets“.
  • CoAP (riboto taikymo protokolas): yra protokolas, specialiai sukurtas mažos talpos programoms.
  • TOMP (srautinio teksto pranešimų siuntimo protokolas): labai paprastas protokolas ir maksimali sąveika. HTTP naudojamas tekstiniams pranešimams perduoti.
  • XMPP („eXtensible Messaging and Presence Protocol“): kitas protokolas, naudojamas IoT tiesioginių pranešimų programoms ir pagrįstas XML. Jan ši byla taip pat yra atvira.
  • WMQ („WebSphere“ pranešimų eilė): IBM sukurtas protokolas. Kaip pranešama iš pavadinimo, jis yra „Message Queue“ tipo ir yra orientuotas į pranešimą.
  • MQTT: (žr. kitą skyrių)

Viskas apie MQTT

MQTT paketas

El MQTT protokolas Tai yra „Message Queue“ ryšio protokolas, kuris atitinka „PubSub“ modelį ir yra M2M tipo, kaip jau minėjau. Jis plačiai naudojamas IoT ir yra pagrįstas TCP / IP kaminu, naudojamu internete.

MQTT atveju kiekvienas ryšys yra atidarytas ir jis pakartotinai naudojamas kiekviename būtiname bendravime. Kažkas skiriasi nuo to, kas vyksta kituose žinomuose protokoluose, kad kiekvienas ryšys vyksta, reikia naujo ryšio.

Pranašumas

MQTT protokolo pranašumai yra gana akivaizdūs kalbant apie M2M ryšius IoT. Be visko, kas pasakyta aukščiau, tai yra protokolas, kuriame pateikiama:

  • Mastelis, kad būtų galima sujungti vis daugiau klientų.
  • Atsiejimas tarp klientų, siekiant mažesnės priklausomybės.
  • Asinchronizmas.
  • Paprastumas.
  • Lengvumas, kad nebūtų sunaudojama per daug išteklių (nors naudojant TLS / SSL saugumą jis padidėja).
  • Energijos taupymas prietaisams, kurie priklauso nuo akumuliatoriaus arba veikia visą parą 24 dienas, jam nereikia didelio pralaidumo (idealiai tinka lėtiems ryšiams, pvz., Kai kuriems belaidžiams).
  • Saugumas ir kokybė, kad ryšys būtų patikimesnis ir tvirtesnis.

istorija

MQTT buvo sukurtas 90-aisiais, su ankstyvąja versija protokolas 1999 m. Jį sukūrė dr. Andy Stanfordas-Clarkas iš IBM ir Arlenas Nipperis iš „Cirrus Link“ (anksčiau „Eurotech“).

La pradinė idėja buvo sukurti protokolą dujotiekiui, einančiam per dykumą, stebėti, naudojant efektyvų ryšio protokolą (mažas pralaidumo vartojimas), šviesą ir mažą energijos suvartojimą. Tuo metu tai buvo labai brangu, bet dabar jis tapo pigiu ir atviru protokolu.

Pradinis protokolas buvo patobulintas pasirodžius naujos versijos, pvz., „MQTT v3.1“ (2013) pagal OASIS („Struktūrizuotų informacijos standartų tobulinimo organizacija“) specifikaciją ir kt. Turėtumėte žinoti, kad pradžioje tai buvo patentuotas „IBM“ protokolas, tačiau jis bus išleistas 2010 m. Ir galų gale tapo OASIS standartu ...

Kaip veikia MQTT ryšys

MQTT protokolas naudoja filtras, kiekvienam klientui siunčiamiems pranešimams, atsižvelgiant į hierarchiškai išdėstytas temas. Tokiu būdu klientas gali paskelbti pranešimą konkrečia tema. Tokiu būdu visi tie klientai ar prijungti įrenginiai, kurie užsiprenumeruoja temą, gaus pranešimus per tarpininką.

Kaip ir MQ, pranešimai liks eilėje ir jie nėra prarasti, kol klientas negavo tos žinutės.

Jungtys, kaip aš taip pat nurodžiau, yra sukurtos per TCP / IP, o serveris ar tarpininkas tvarkys prijungtų klientų registrą. Pagal numatytuosius nustatymus įrenginiai naudos ryšio prievadų numerį 1883, nors 8883 prievadą taip pat galite rasti, jei papildomam saugumui naudojate SSL / TLS.

Kad būtų galima prisijungti, reikalingi ne tik klientai, serveriai ir prievadai. Taip pat kiti siunčiami paketai ar žinutės kad būtų galima bendrauti:

  • Užmegzkite ryšį: PRIJUNGTI kliento atsiųstą pranešimą / paketą su visa reikalinga informacija. Toje informacijoje yra kliento ID, vartotojo vardas, slaptažodis ir kt. Brokeris ar serveris atsako paketu „CONNACK“, kuris informuos klientą, kad ryšys priimtas, atmestas ir t.
  • Siųsti ir gauti pranešimus: Kai ryšys bus užmegztas, PUBLISH paketai ar pranešimai bus naudojami kartu su brokeriui siunčiamo pranešimo tema ir naudinga apkrova. Kita vertus, suinteresuotas klientas ar klientai naudoja SUBSCRIBE ir UNSUSCRIBE paketus, norėdami atitinkamai užsiprenumeruoti arba atšaukti savo abonementą. Brokeris taip pat atsakys paketu „SUBACK“ ir „UNSUBACK“, kad praneštų apie kliento prašomos operacijos sėkmę.
  • Ryšio palaikymas: norėdami garantuoti, kad ryšys išliks atviras, klientai gali periodiškai siųsti iš serverio PINGREQ paketą, kuris bus suderintas su PINGRESP paketu.
  • Baigti ryšį: kai klientas atsijungia, jis išsiunčia ATITIKTI paketą pranešti apie tą įvykį.

Tie žinutes ar paketus Tų, apie kuriuos kalbėjau, struktūra yra tokia pati kaip kitų tinklo protokolų paketų:

  • Antraštė arba fiksuota antraštė: yra fiksuota dalis, užimanti nuo 2 iki 5 baitų. Jame yra kontrolinis kodas, išsiųsto pranešimo tipo ID ir jo ilgis. Ilgiui užkoduoti naudojami nuo 1 iki 4 baitų, naudojant pirmus 7 kiekvieno okteto bitus kaip ilgio duomenis ir papildomą tęstinumo bitą, siekiant nustatyti, ar yra daugiau nei vienas baitas, sudarantis pranešimo ilgį.
  • Kintama antraštė: ne visada yra privaloma, bet neprivaloma. Kai kuriuose paketuose jis yra tik tam tikrose situacijose ar konkrečiuose pranešimuose.
  • Turinys ar duomenys: paketiniai duomenys yra tai, kas iš tikrųjų yra siunčiamas pranešimas. Tai gali būti nuo kelių kB iki 256 MB ribos.

Jei jus domina žinoti atitinkamas kodas šešioliktainiais skaičiais siunčiamų pranešimų tipai yra šie:

Žinutė Kodas
PRISIJUNGTI 0x10
PRISIJUNGIMAS 0x20
VIEŠAI 0x30
PUBACK 0x40
pubrec 0x50
PUBLELIS 0x60
pubcomp 0x70
PRENUMERUOTI 0x80
SUBACK 0x90
NESUTIKRINKITE 0XA0
NEMOKAMA 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
ATJUNGTI 0xE0

Ryšių kokybė ir saugumas

Kita svarbi MQTT pranešimų detalė yra paslaugų kokybė arba QoSir saugumas. Nuo to priklausys ryšio sistemos patikimumas gedimų atveju ir jos saugumas.

Kalbant apie jo kokybę, galima nustatyti 3 skirtingų lygių:

  • QoS 0 (nepripažinimas)- Pranešimas siunčiamas tik vieną kartą, o gedimo atveju jis nebus pristatytas. Jis naudojamas, kai tai nėra kritiška.
  • 1 QoS (patvirtinti): pranešimas bus išsiųstas tiek kartų, kiek reikia, kad garantuotume pristatymą klientui. Trūkumas yra tas, kad klientas tą patį pranešimą galėjo gauti kelis kartus.
  • 2 QoS (užtikrinta)- Panašus į aukščiau pateiktą, tačiau garantuojamas pristatymas tik vieną kartą. Jis dažnai naudojamas kritiškesnėms sistemoms, kur reikia didesnio patikimumo.

Kita vertus, kaip ir MQTT apsauga, siekiant užtikrinti jo stiprumą šiuo atžvilgiu, gali būti naudojamos įvairios priemonės. Kaip jau minėjau anksčiau, vartotojo ir slaptažodžio autentiškumą, kaip ir daugelį kitų protokolų, galima užtikrinti naudojant SSL / TLS. Nors daugeliui daiktų interneto įrenginių, turinčių mažą talpą ar išteklius, naudojant šio tipo saugų ryšį gali kilti problemų dėl per didelės darbo ...

Dėl šios priežasties daugelis IoT įrenginių, naudojančių MQTT, naudoja slaptažodžius ir vartotojus plokštumos tekstas, kas gali priversti uostyti tinklo srautą, kad juos būtų labai lengva gauti. Ir jei to nepakanka, brokeris taip pat gali būti sukonfigūruotas priimti anoniminius ryšius, kurie leistų bet kuriam vartotojui užmegzti ryšius, susijusius su didesne rizika.

MQTT naudojimas su „Arduino“

Arduino UNO su MQTT

Žinoma, jūs galite naudokite MQTT protokolą su „Arduino“ ir kitos kūrimo lentos, taip pat „Rapsberry Pi“ ir kt. Norėdami tai padaryti, turite suteikti „Arduino“ lentai ryšį, jei jis to neturi. Be to, biblioteka „Arduino“ klientas, skirtas MQTT tai padės jums atlikti šias užduotis. Ši biblioteka suderinama su:

Jūs jau žinote, kad galite atsisiųsti ir įdiegti biblioteką „Arduino IDE“ naudodami komandą: „git“ klonas https://github.com/knolleary/pubsubclient.git

Kai tik prie kodo, kad galėtumėte naudoti MQTT kai kuriose programose tiesa ta, kad tai paprasta. „Fritzing“ paveikslėlyje galite pamatyti lentą Arduino UNO prie kurio buvo prijungtas „Arduino Ethernet“ ryšys ir jis taip pat buvo prijungtas a DHT22 drėgmės ir temperatūros jutiklis, nors tai galėjo būti kas kita ...

Gerai, pasakius kodą, kurį turite sugeneruoti „Arduino IDE“ Norint dirbti su „Arduino“ MQTT protokolu, taip paprasta:

  • į siųsti žinutes 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);
}

  • į gauti žinutes MQTT jums reikia tik plokštės Arduino UNO ir ryšys, naudojant „Arduino Ethernet“ ar bet kurį kitą elementą. Kalbant apie kodą, pavyzdys būtų:
#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();
}

Nepamirškite, kad turite pakeisti IP į tinkamą serveriui, taip pat turite pakeisti savo Ethernet tinklo adapterio arba naudojamo MAC adresą, taip pat likusį kodą, jei ketinate jį pritaikyti kitokio projekto. Tai tik pavyzdys!

Norėdami gauti daugiau informacijos, galite atsisiųsti nemokamai our PDF vadovas su „Arduino IDE“ kursu pradėti programuoti.


Būkite pirmas, kuris pakomentuos

Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.