MQTT: isang bukas na network network at ang kahalagahan nito sa IoT

MQTT protocol network IoT

Tandaan ang pangalan MQTT, dahil ito ay isang uri ng komunikasyon sa network na uri ng M2M (Machine sa Machine) na medyo tunog. Nagiging tanyag ito salamat sa bagong panahon ng Internet of Things o IoT (Internet of Things) para sa acronym nito sa English. Bilang karagdagan, ito ay isang bukas na protokol, na nagbibigay ng maraming mga pakinabang.

Sa katunayan, ito ay naging isa sa mga gitnang haligi ng IoT, dahil ito ay mahusay sa mga aparato na may ilang mga limitasyon sa paghahatid tulad nito. Ang akronimong MQTT ay nagmula Pagpila ng Mensahe sa Telemetry Transport, isang bukas na pamantayan mula sa OASIS at ISO (ISO / IEC 20922) para sa mga komunikasyon sa network at na sa pangkalahatan ay tumatakbo sa sikat na TCP / IP.

Mga protocol sa network

Model ng OSI at mga layer nito

Los mga protocol ng komunikasyon ang mga ito ay mga patakaran na nagpapahintulot sa dalawa o higit pang mga aparato o system na makipag-usap sa bawat isa. Iyon ay, ito ay isang protokol upang magpadala ng impormasyon sa pamamagitan ng iba't ibang mga paraan at may isang tinukoy na format, ipinatupad man ng software at hardware (o pareho).

El pamantayan ng protocol na tumutukoy sa isang bilang ng mga katangian ng komunikasyon. Maaari itong mapunta sa mga patakaran ng pagsabay, semantiko, syntax, format ng packet, atbp. At ang totoo ay hindi sila isang bagay na bale-wala, dahil salamat sa mga protokol na ito ngayon maaari naming gamitin ang Internet at iba pang mga network ng komunikasyon ...

At syempre, hindi lamang isang protokol, ngunit marami. Halimbawa, ang sikat Ang DNS, FTP, MQTT, HTTP at HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP, atbp, para sa layer ng application. Habang nasa layer ng transportasyon maaari kang makahanap ng ilang tanyag sa TCP, UDP, atbp, pati na rin sa mga layer ng Internet tulad ng IPv4, o IPv6 (ang isa na naging posible sa pinakamalaking bilang ng mga magagamit na mga IP at pagdating ng ang IoT), IPSec, atbp., at iba pa mula sa layer ng link tulad ng DSL, Ethernet, WiFi, ARP, atbp.

Tungkol sa mga IoT protocol

MQTT na protocol

Siyempre, may mga tukoy na mga protocol sa komunikasyon o maaaring mailapat sa IoT. Iyon ay upang sabihin, isinasaalang-alang ang nakaraang seksyon, sila ay magiging isang serye ng mga tinukoy na pamantayan upang ang dalawa o higit pang mga aparato ng IoT ay maaaring makipag-usap at maunawaan ang bawat isa, at kadalasan sila ay M2M, iyon ay, komunikasyon sa machine-to-machine. Mayroong maraming mga aparato ng IoT ang nakakonekta at nagbabahagi ng impormasyon mula sa mga sensor o iba pang mga mapagkukunan.

Dahil sa maraming bilang ng mga aparato ng IoT, ang mga protokol na ito ay dapat na matugunan ang mga kinakailangan na lampas sa mga limitasyon ng bandwidth, bilis, atbp. (tandaan na maraming mga aparato ang naka-embed at murang), na karaniwang sa ilang mga aparato. At ang ibig kong sabihin ay ang katotohanan na dapat scalable, upang makapagdagdag ng higit pang mga konektadong aparato kung kinakailangan at nang hindi nakakaapekto sa pandaigdigang sistema.

Gayundin, kailangan nilang magkaroon ng mababang pagtitiwala pagkabit sa pagitan ng mga aparato, upang ang mga problema ay hindi nabuo kung ang isang aparato ay tinanggal. At syempre, sa parehong oras, isang mataas na interoperability ang hinahanap upang ito ay gumana sa isang malaking bilang ng mga aparato at magkakaibang mga system, dahil ang mundo ng IoT ay medyo magkakaiba-iba.

Ang iba pang mga kapaki-pakinabang na tampok ay ang kadalian ng pagpapatupad ng mga ito, ang seguridad, atbp. Tandaan na ang IoT ay lumilikha ng mahusay na mga hamon sa aspeto ng seguridad. Kahit na higit pa kung marami sa mga konektadong aparato ay karaniwang kritikal sa ilang mga kaso ... halimbawa, mga laruan para sa mga menor de edad.

Mahahalagang konsepto

Sinabi nito, dapat sabihin na ang mga solusyon para sa IoT ay gumagamit ng isang sentralisadong server upang matanggap ang mga mensahe mula sa lahat ng mga konektadong aparato na naglalabas at namamahagi sa mga ito sa lahat ng mga konektadong aparato ng IoT na nakikinig. Ang server na iyon ang kilala bilang router o broker. Isang bagay na malayo sa maginoo na ugnayan ng client-server sa ilang mga paraan.

Bukod dito, ang mga pamamaraan na maaari mong makita sa mga protocol ng komunikasyon para sa IoT ay:

  • PubSub: I-publish / Susbcribe ay isang pattern ng pagmemensahe kung saan ang isang aparato (Sub) ay nagpapaalam sa broker na nais nitong makatanggap ng isang mensahe, habang ang isa pang aparato (Pub) ay naglalathala ng mga mensahe para sa broker na ipamahagi sa ibang aparato / s naghihintay para sa kanila.
  • rRPC: Ang Mga Pagtawag sa Pamamaraan ng Router Remoder ay isa pang pattern ng pagpapatupad ng remote na proseso. Sa loob nito, isang aparato (Callee) ay nagpapaalam sa broker na magsasagawa ito ng isang tiyak na pamamaraan at ipamahagi ito ng broker sa isa pang aparato (Caller) kung saan isinasagawa ang nasabing proseso.

Ngayon, upang maisakatuparan ang mga pamamaraang ito o mga pattern, a imprastraktura ng pagmemensahe. At sa ganitong kahulugan maaaring makilala ang dalawa:

  • Queue ng Mensahe: serbisyo sa pagmemensahe kung saan nabubuo ang isang solong pila sa mensahe para sa lahat ng mga kliyente na nagpasimula ng isang subscription sa broker. Ang huli ay panatilihin ang mga mensahe na nakaimbak hanggang maihatid ang mga ito sa client. Kung ang client o tatanggap ay hindi konektado, pinapanatili ito hanggang sa kumonekta. Ang mga ganitong uri ng serbisyo ay tulad ng mga ginagamit sa instant na apps ng pagmemensahe tulad ng Telegra, WhatsApp, Messenger, atbp.
  • Serbisyo sa Mensahe: ito ay isa pang serbisyo kung saan ipinapadala ng broker ang mga mensahe sa konektadong tatanggap na kliyente, sinasala ayon sa uri ng mensahe. Kung ang kliyente o tumatanggap na aparato ay naka-pagkakakonekta, kung gayon ang mga mensahe ay nawala (bagaman maaaring mayroong ilang sistema ng pag-log).

Mga protocol ng IoT

Nakita ang nasa itaas, ngayon ay tingnan natin nang mas malapit Mga protocol ng IoT mas kilala yan. Kabilang sa mga pinaka kilalang M2M ay:

  • AMQP (Advanced Message Qeuing Protocol): ay isang uri ng proteksyon ng PubSub ng Queue ng Mensahe. Dinisenyo upang magkaroon ng mahusay na interoperability at matiyak ang pagiging maaasahan. Espesyal para sa mga aplikasyon ng korporasyon, mataas na pagganap, mataas na mga network ng latency, kritikal, atbp.
  • WAMP (Web Application Messaging Protocol): ay isa pang bukas na uri ng proteksyon na PubSub tulad ng rRPC, at tumatakbo ito sa WebSockets.
  • Constrained Application Protocol (CoAP): ay isang protokol na espesyal na idinisenyo para sa mga aplikasyon ng mababang kapasidad.
  • TOMP (Protocol ng Pagmemensahe ng Mensahe sa Pag-streaming ng Teksto): napaka-simpleng protocol at upang makamit ang maximum na interoperability. Ginagamit ang HTTP upang magpadala ng mga text message.
  • XMPP (eXtensible Messaging at Presence Protocol): isa pang protokol na ginamit sa IoT para sa mga instant na apps ng pagmemensahe at batay sa XML. Jan ang kaso na ito ay bukas din.
  • WMQ (WebSphere Message Qeuing): protocol na binuo ng IBM. Ito ay uri ng Mensahe ng Queue, tulad ng iminumungkahi ng pangalan nito, at nakatuon sa mensahe.
  • MQTT: (tingnan ang susunod na seksyon)

Lahat tungkol sa MQTT

MQTT package

El MQTT na protocol Ito ay isang protocol ng komunikasyon ng Queue ng Mensahe, na sumusunod sa isang pattern ng PubSub, at ng uri ng M2M, tulad ng nabanggit ko na. Malawakang ginagamit ito sa IoT, at batay sa TCP / IP stack na ginamit sa Internet.

Sa kaso ng MQTT, ang bawat koneksyon ay pinananatiling bukas at ito ay muling ginagamit sa bawat kinakailangang komunikasyon. Isang bagay na naiiba sa kung ano ang nangyayari sa iba pang mga kilalang mga protokol, na ang bawat komunikasyon na nagaganap ay nangangailangan ng isang bagong koneksyon.

Kalamangan

Ang mga kalamangan ng MQTT na protocol ay malinaw sa mga tuntunin ng mga komunikasyon ng M2M para sa IoT. Bilang karagdagan sa lahat ng sinabi sa itaas, ito ay isang protokol na nagbibigay ng:

  • Kakayahang sukatin, upang ikonekta ang higit pa at mas maraming mga customer.
  • Pag-decoupling sa pagitan ng mga kliyente, para sa mas kaunting pagtitiwala.
  • Asynchronism.
  • Pagiging simple.
  • Ang gaan upang hindi maubos ang napakaraming mapagkukunan (bagaman sa seguridad ng TLS / SSL ay umakyat ito).
  • Mahusay na enerhiya para sa mga aparato na nakasalalay sa baterya o gumagana nang 24/7, hindi ito nangangailangan ng isang malaking bandwidth (mainam para sa mabagal na koneksyon, tulad ng ilang mga wireless).
  • Seguridad at kalidad, para sa higit na pagiging maaasahan at pagiging matatag sa mga komunikasyon.

kasaysayan

Ang MQTT ay nilikha noong dekada 90, na may isang maagang bersyon ng protocol noong 1999. Ito ay nilikha ni Dr. Andy Stanford-Clark ng IBM at Arlen Nipper ng Cirrus Link (dating Eurotech).

La paunang ideya ay upang lumikha ng isang protocol upang subaybayan ang isang pipeline na naglakbay sa pamamagitan ng disyerto, na may isang mahusay na komunikasyon protocol (mababang bandwidth pagkonsumo), ilaw, at na isang mababang pagkonsumo ng enerhiya. Sa oras na ito ay napakamahal, ngunit ngayon ito ay naging isang mura at bukas na protokol.

Ang paunang protocol ay pinabuting may hitsura ng mga bagong bersyon, tulad ng MQTT v3.1 (2013) sa ilalim ng pagtutukoy ng OASIS (Organisasyon para sa Pagpapaunlad ng Mga Pamantayan sa Balangkas na Impormasyon), atbp. Dapat mong malaman na sa simula ito ay isang pagmamay-ari na protokol ng IBM, ngunit ito ay ilalabas noong 2010, at natapos itong maging isang pamantayan sa OASIS ...

Paano gumagana ang koneksyon sa MQTT

Gumagamit ang MQTT protocol isang filter, para sa mga mensahe na ipinadala sa bawat kliyente, batay sa mga paksa o paksang naayos nang hierarchically. Sa ganitong paraan, maaaring mag-post ang isang customer ng isang mensahe sa isang tukoy na paksa. Sa ganitong paraan, ang lahat ng mga kliyente o konektadong aparato na nag-subscribe sa paksa ay makakatanggap ng mga mensahe sa pamamagitan ng broker.

Tulad ng MQ, ang mga mensahe ay mananatili sa pila at hindi sila mawala hanggang sa natanggap ng kliyente ang mensahe na iyon.

Ang mga koneksyon, tulad ng ipinahiwatig ko din, ay ginawa sa pamamagitan ng TCP / IP, at ang server o broker ay magtatago ng isang tala ng mga nakakonektang kliyente. Bilang default, ang mga aparato ay gagamit ng mga port ng komunikasyon bilang noong 1883, kahit na maaari mo ring makatagpo ng port 8883 kung gumagamit ka ng SSL / TLS para sa karagdagang seguridad.

Upang posible ang koneksyon, hindi lamang mga kliyente, server at port ang kinakailangan. Pati iba ipinadala ang mga pakete o mensahe para sa komunikasyon na maganap:

  • Itaguyod ang koneksyon: CONNECT mensahe / packet na ipinadala ng client sa lahat ng kinakailangang impormasyon. Kasama sa impormasyong iyon ang customer ID, username, password, atbp. Ang broker o server ay tumutugon gamit ang isang CONNACK packet na magsasabi sa client na ang koneksyon ay tinanggap, tinanggihan, atbp.
  • Magpadala at tumanggap ng mga mensahe: sa sandaling maitaguyod ang koneksyon, i-PUBLISH ang mga pakete o mensahe ay ginagamit kasama ang paksa at ang kargamento ng mensahe na ipinadala sa broker. Sa kabilang banda, ang interesadong kliyente o kliyente ay gumagamit ng mga package na SUBSCRIBE at UNSUSCRIBE upang mag-subscribe o mag-withdraw ng kanilang subscription ayon sa pagkakabanggit. Ang broker ay tutugon din sa isang SUBACK at UNSUBACK package ayon sa pagkakabanggit upang maiulat ang tagumpay ng operasyon na hiniling ng kliyente.
  • Pagpapanatili ng koneksyon: upang garantiya na ang koneksyon ay mananatiling bukas, ang mga kliyente ay maaaring magpadala ng pana-panahong isang PINGREQ packet na maitutugma sa isang pack ng PINGRESP mula sa server.
  • Tapusin ang koneksyon: kapag nakadiskonekta ang isang kliyente ay nagpapadala ito ng isang DISCONNECT packet upang iulat ang kaganapang iyon.

Yung mga mensahe o mga pakete Ang mga napag-usapan ko ay may istraktura na kapareho ng iba pang mga packet ng iba pang mga network protokol:

  • Header o naayos na header: ay isang nakapirming bahagi na sumasakop sa pagitan ng 2-5 bytes. Naglalaman ito ng isang control code, ID ng uri ng mensahe na ipinadala, at ang haba nito. Sa pagitan ng 1-4 bytes ay ginagamit para sa pag-encode ng haba, gamit ang unang 7 piraso ng bawat octet bilang data para sa haba at isang karagdagang piraso ng pagpapatuloy upang matukoy na mayroong higit sa isang byte na bumubuo sa haba ng mensahe.
  • Variable na header: ay hindi palaging sapilitan, ngunit opsyonal. Nakapaloob lamang ito sa ilang mga pakete sa ilang mga sitwasyon o tukoy na mga mensahe.
  • Nilalaman o data: ang data ng packet ay kung ano talaga ang naglalaman ng mensahe na ipapadala. Maaari itong mula sa ilang kB hanggang sa isang 256 MB na limitasyon.

Kung interesado kang malaman ang kaukulang code sa hexadecimal para sa mga uri ng mensahe na ipinadala ay:

mensahe Kodigo
CONNECT 0x10
CONNACK 0x20
I-PUBLISH 0x30
I-PUBACK 0x40
pubrec 0x50
PUBREL 0x60
pubcomp 0x70
SUBSCRBE 0x80
MAG-SUBACK 0x90
I-UNSUSCRIBE 0xA0
UNSUBACK 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
Idiskonekta 0xE0

Kalidad at seguridad ng mga komunikasyon

Ang isa pang mahalagang detalye ng mga mensahe ng MQTT ay ang kalidad ng serbisyo o QoS, at seguridad. Ang pagiging matatag ng sistema ng komunikasyon sa kaganapan ng mga pagkabigo at ang kaligtasan nito ay nakasalalay dito.

Tungkol sa kalidad nito, maaari itong matukoy 3 iba't ibang mga antas:

  • QoS 0 (hindi kilalang kaalaman)- Ang mensahe ay ipinadala lamang nang isang beses, at kung sakaling mabigo ay hindi ito maihatid. Ginagamit ito kapag hindi ito kritikal.
  • QoS 1 (kinikilala): ang mensahe ay ipapadala nang maraming beses kung kinakailangan upang magarantiyahan ang paghahatid sa customer. Ang downside ay ang client ay maaaring makatanggap ng parehong mensahe ng maraming beses.
  • QoS 2 (panigurado)- Katulad ng sa itaas, ngunit garantisadong maihahatid nang isang beses lamang. Ito ay madalas na ginagamit para sa mas kritikal na mga sistema kung saan kailangan ng higit na pagiging maaasahan.

Sa kabilang banda, para sa Seguridad ng MQTT, iba't ibang mga hakbang ay maaaring magamit upang matiyak ang lakas nito sa bagay na ito. Tulad ng nabanggit ko na dati, ang autonication ng username at password, tulad ng maraming iba pang mga protokol, ay maaaring matiyak sa pamamagitan ng SSL / TLS. Bagaman maraming mga aparato ng IoT na may mababang kakayahan, o mapagkukunan, ay maaaring magkaroon ng mga problema sa labis na trabaho kapag gumagamit ng ganitong uri ng ligtas na komunikasyon ...

Para sa kadahilanang ito, maraming mga aparato ng IoT na gumagamit ng MQTT ang gumagamit ng mga password at gumagamit sa teksto ng eroplano, na maaaring makagawa ng isang taong sumisinghot ng trapiko sa network upang madali itong makuha. At kung hindi ito sapat, ang broker ay maaari ring mai-configure upang tanggapin ang mga hindi nagpapakilalang koneksyon, na magpapahintulot sa sinumang gumagamit na magtatag ng mga komunikasyon, na kinasasangkutan ng mas malaking panganib.

Paggamit ng MQTT kasama ang Arduino

Arduino UNO kasama ang MQTT

Syempre kaya mo gamitin ang MQTT protocol sa Arduino at iba pang mga development board, pati na rin ang Rapsberry Pi, atbp. Upang magawa ito, dapat mong ibigay ang iyong Arduino board na may pagkakakonekta, kung wala ito. Gayundin, ang silid-aklatan Arduino Client para sa MQTT makakatulong ito sa iyo sa mga gawaing ito. Ang library na ito ay katugma sa:

Alam mo na na maaari mong i-download at mai-install ang library sa iyong Arduino IDE gamit ang utos: git clone https://github.com/knolleary/pubsubclient.git

Sa lalong madaling panahon sa code upang magamit ang MQTT sa ilang aplikasyon, ang totoo ay simple ito. Sa Fritzing na imahe maaari kang makakita ng isang plaka Arduino UNO kung saan ang pagkakakonekta ay naidagdag ng Arduino Ethernet at nakakonekta din ito isang DHT22 halumigmig at temperatura sensor, kahit na maaaring ito ay maging anupaman ...

Ok, sa nasabing iyon, para sa code na kailangan mong makabuo Arduino IDE Upang gumana sa MQTT protocol sa Arduino, simple lang ito:

  • Sa magpadala ng mga mensahe 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);
}

  • Sa makatanggap ng mga mensahe sa pamamagitan ng MQTT kailangan mo lang ng plato Arduino UNO at koneksyon, sa Arduino Ethernet o anumang iba pang elemento. Tulad ng para sa code, ang isang halimbawa ay:
#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();
}

Tandaan na dapat mong baguhin ang IP sa naaangkop na isa para sa server, at dapat mo ring baguhin ang MAC address ng iyong Ethernet network adapter o ang ginagamit mo, pati na rin ang natitirang code kung balak mong iakma ito ibang proyekto. Ito ay isang halimbawa lamang!

Para sa karagdagang impormasyon, maaari mo pag-download nang libre aming Manwal ng PDF kasama ang kursong Arduino IDE upang simulan ang pag-program.


Maging una sa komento

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.