MQTT: un protocole de réseau ouvert et son importance dans l'IoT

IoT de réseau de protocole MQTT

Souviens toi du nom MQTT, puisqu'il s'agit d'un protocole de communication rĂ©seau de type M2M (Machine to Machine) qui va sonner un peu. Il devient très populaire grĂ¢ce Ă  la nouvelle ère de l'Internet des objets ou IoT (Internet of Things) pour son acronyme en anglais. De plus, c'est un protocole ouvert, ce qui prĂ©sente de nombreux avantages.

En fait, il est devenu l'un des piliers centraux de l'IoT, car il est assez bon sur les appareils avec certaines limitations de transmission comme celles-ci. L'acronyme MQTT vient de Transport de télémétrie Message Queuing, une norme ouverte d'OASIS et ISO (ISO / CEI 20922) pour les communications réseau et qui fonctionne généralement sur le fameux TCP / IP.

Protocoles réseau

Modèle OSI et ses couches

Les protocoles de communication Ce sont des règles qui permettent Ă  deux ou plusieurs appareils ou systèmes de communiquer entre eux. C'est-Ă -dire qu'il s'agit d'un protocole pour transmettre des informations par divers moyens et avec un format dĂ©fini, qu'il soit mis en Å“uvre par logiciel et matĂ©riel (ou les deux).

El standard du protocole dĂ©finit une multitude de caractĂ©ristiques de communication. Cela peut aller des règles de synchronisation, de sĂ©mantique, de syntaxe, de format de paquet, etc. Et la vĂ©ritĂ© est qu'ils ne sont pas nĂ©gligeables, car grĂ¢ce Ă  ces protocoles aujourd'hui, nous pouvons utiliser Internet et d'autres rĂ©seaux de communication ...

Et bien sûr, il n'y a pas qu'un seul protocole, mais plusieurs. Par exemple, les célèbres DNS, FTP, MQTT, HTTP et HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP, etc., pour la couche application. Alors que dans la couche de transport, vous pouvez en trouver des aussi célèbres que TCP, UDP, etc., ainsi que celles de la couche Internet comme IPv4 ou IPv6 (celle qui a rendu possible le plus grand nombre d'adresses IP disponibles et l'arrivée de l'IoT), IPSec, etc., et d'autres de la couche de liaison tels que DSL, Ethernet, WiFi, ARP, etc.

Ă€ propos des protocoles IoT

Protocole MQTT

Bien entendu, il existe des protocoles de communication spĂ©cifiques ou qui peuvent Ăªtre appliquĂ©s au IoT. C'est-Ă -dire que, compte tenu de la section prĂ©cĂ©dente, il s'agirait d'une sĂ©rie de normes dĂ©finies afin que deux ou plusieurs appareils IoT puissent communiquer et se comprendre, et ils sont gĂ©nĂ©ralement M2M, c'est-Ă -dire une communication de machine Ă  machine. de nombreux appareils IoT connectĂ©s et partageant des informations Ă  partir de capteurs ou d'autres sources.

En raison du grand nombre d'appareils IoT, ces protocoles doivent rĂ©pondre Ă  des exigences allant au-delĂ  des limites de bande passante, de vitesse, etc. (notez que de nombreux appareils sont embarquĂ©s et bon marchĂ©), ce qui se trouve gĂ©nĂ©ralement dans certains appareils. Et je veux dire le fait que doit Ăªtre Ă©volutif, pour pouvoir ajouter d'autres appareils connectĂ©s si nĂ©cessaire et sans affecter le système global.

En outre, ils doivent avoir un faible dĂ©pendance couplage entre les appareils, de sorte que des problèmes ne sont pas gĂ©nĂ©rĂ©s si un appareil est retirĂ©. Et bien sĂ»r, dans le mĂªme temps, une forte interopĂ©rabilitĂ© est recherchĂ©e pour qu'il fonctionne avec un grand nombre d'appareils et des systèmes très variĂ©s, car le monde de l'IoT est assez hĂ©tĂ©rogène.

D'autres fonctionnalitĂ©s utiles seraient la facilitĂ© de leur mise en Å“uvre, sĂ©curitĂ©, etc. Gardez Ă  l'esprit que l'IoT crĂ©e de grands dĂ©fis dans le domaine de la sĂ©curitĂ©. D'autant plus que de nombreux appareils connectĂ©s sont gĂ©nĂ©ralement critiques dans certains cas ... par exemple, des jouets pour mineurs.

Concepts importants

Cela dit, il faut dire que les solutions pour l'IoT utilisent un serveur centralisé pour recevoir les messages de tous les appareils connectés qui les émettent et les distribuer à tous les appareils IoT connectés qui sont à l'écoute. Ce serveur est ce qu'on appelle routeur ou courtier. Quelque chose qui est loin de la relation client-serveur conventionnelle à certains égards.

En outre, les méthodologies que vous pouvez trouver dans ces protocoles de communication pour l'IoT sont:

  • PubSub: Publish / Susbcribe est un modèle de messagerie dans lequel un pĂ©riphĂ©rique (Sub) informe le courtier qu'il souhaite recevoir un message, tandis qu'un autre pĂ©riphĂ©rique (Pub) publie des messages que le courtier distribue aux autres pĂ©riphĂ©riques qui les attendent.
  • rRPC: Les appels de procĂ©dure Router Remoder sont un autre modèle d'exĂ©cution de processus Ă  distance. Dans celui-ci, un appareil (AppelĂ©) informe le courtier qu'il effectuera une certaine procĂ©dure et le courtier la distribue Ă  un autre appareil (Appelant) sur lequel ledit processus est exĂ©cutĂ©.

Maintenant, pour mettre en Å“uvre ces mĂ©thodologies ou modèles, un infrastructure de messagerie. Et en ce sens on peut en distinguer deux:

  • Message Queue: service de messagerie oĂ¹ une seule file d'attente de messages est gĂ©nĂ©rĂ©e pour tous les clients qui initient un abonnement au courtier. Ce dernier conservera les messages stockĂ©s jusqu'Ă  leur remise au client. Si le client ou le destinataire n'est pas connectĂ©, il est maintenu jusqu'Ă  ce qu'il soit connectĂ©. Ces types de services sont similaires Ă  ceux utilisĂ©s dans les applications de messagerie instantanĂ©e telles que Telegra, WhatsApp, Messenger, etc.
  • Service de messagerie: c'est un autre service dans lequel le courtier envoie les messages au client destinataire connectĂ©, en filtrant par type de message. Si le client ou le pĂ©riphĂ©rique rĂ©cepteur est dĂ©connectĂ©, les messages sont perdus (bien qu'il puisse disposer d'un système de journalisation).

Protocoles IoT

Après avoir vu ce qui précède, regardons maintenant de plus près Protocoles IoT qui sont mieux connus. Parmi les plus importants du M2M, on trouve:

  • AMQP (protocole avancĂ© de mise en file d'attente de messages): est un protocole de type PubSub de Message Queue. Conçu pour avoir une bonne interopĂ©rabilitĂ© et assurer la fiabilitĂ©. Surtout pour les applications d'entreprise, hautes performances, rĂ©seaux Ă  latence Ă©levĂ©e, critiques, etc.
  • WAMP (protocole de messagerie d'application Web): c'est un autre protocole ouvert de type PubSub comme rRPC, et il fonctionne sur WebSockets.
  • CoAP (protocole d'application contraint): est un protocole spĂ©cialement conçu pour les applications de faible capacitĂ©.
  • TOMP (Protocole de Messagerie OrientĂ©e Texte en Streaming): protocole très simple et pour atteindre une interopĂ©rabilitĂ© maximale. HTTP est utilisĂ© pour transmettre des messages texte.
  • XMPP (protocole de messagerie et de prĂ©sence extensible): un autre protocole utilisĂ© dans l'IoT pour les applications de messagerie instantanĂ©e et basĂ© sur XML. Jan cette affaire est Ă©galement ouverte.
  • WMQ (file d'attente de messages WebSphere): protocole dĂ©veloppĂ© par IBM. Il est du type Message Queue, comme son nom l'indique, et est orientĂ© message.
  • MQTT: (voir section suivante)

Tout sur MQTT

Paquet MQTT

El Protocole MQTT Il s'agit d'un protocole de communication Message Queue, qui suit un modèle PubSub, et de type M2M, comme je l'ai déjà mentionné. Il est largement utilisé dans l'IoT et est basé sur la pile TCP / IP utilisée sur Internet.

Dans le cas de MQTT, chaque connexion est maintenue ouverte et il est réutilisé dans toutes les communications nécessaires. Quelque chose de différent de ce qui se passe dans d'autres protocoles connus, que chaque communication a lieu nécessite une nouvelle connexion.

Avantages

Les avantages du protocole MQTT sont assez évidents en termes de communications M2M pour l'IoT. En plus de tout ce qui a été dit ci-dessus, c'est un protocole qui fournit:

  • ÉvolutivitĂ©, pour connecter de plus en plus de clients.
  • DĂ©couplage entre clients, pour moins de dĂ©pendance.
  • Asynchronisme.
  • SimplicitĂ©.
  • LĂ©gèretĂ© pour ne pas consommer trop de ressources (bien qu'avec la sĂ©curitĂ© TLS / SSL ça monte).
  • Économe en Ă©nergie pour les appareils qui dĂ©pendent de la batterie ou fonctionnent 24h / 7 et XNUMXj / XNUMX, il n'a pas besoin d'une large bande passante (idĂ©al pour les connexions lentes, comme certaines connexions sans fil).
  • SĂ©curitĂ© et qualitĂ©, pour une fiabilitĂ© et une robustesse accrues des communications.

Notre Histoire

MQTT a été créé dans les années 90, avec une première version du protocole en 1999. Il a été créé par le Dr Andy Stanford-Clark d'IBM et Arlen Nipper de Cirrus Link (anciennement Eurotech).

La idée initiale était de créer un protocole pour surveiller un pipeline qui traversait le désert, avec un protocole de communication efficace (faible consommation de bande passante), léger, et cela à faible consommation d'énergie. À l'époque, c'était très cher, mais maintenant c'est devenu un protocole bon marché et ouvert.

Le protocole initial a été amélioré avec l'apparition de nouvelles versions, comme MQTT v3.1 (2013) sous la spécification OASIS (Organization for the Advancement of Structured Information Standards), etc. Il faut savoir qu'au départ c'était un protocole propriétaire IBM, mais qu'il allait sortir en 2010, et qu'il a fini par devenir un standard dans OASIS ...

Comment fonctionne la connexion MQTT

Le protocole MQTT utilise un filtre, pour les messages envoyés à chaque client, en fonction de sujets ou de sujets organisés de manière hiérarchique. De cette manière, un client peut publier un message sur un sujet spécifique. De cette manière, tous les clients ou appareils connectés qui s'abonnent à la rubrique recevront des messages via le courtier.

Tout comme MQ, les messages resteront dans la file d'attente et ils ne sont pas perdus tant que le client n'a pas reçu ce message.

Les connexions, comme je l'ai également indiqué, sont faites via TCP / IP, et le serveur ou le courtier conservera un enregistrement des clients connectés. Par défaut, les périphériques utiliseront les ports de communication numéro 1883, bien que vous puissiez également rencontrer le port 8883 si vous utilisez SSL / TLS pour plus de sécurité.

Pour que la connexion soit possible, non seulement les clients, les serveurs et les ports sont nécessaires. Aussi d'autres colis ou messages envoyés pour que la communication ait lieu:

  • Établir la connexion: Message / paquet CONNECT envoyĂ© par le client avec toutes les informations nĂ©cessaires. Ces informations incluent l'identifiant client, le nom d'utilisateur, le mot de passe, etc. Le courtier ou le serveur rĂ©pond avec un paquet CONNACK qui informera le client que la connexion a Ă©tĂ© acceptĂ©e, rejetĂ©e, etc.
  • Envoyer et recevoir des messages: une fois la connexion Ă©tablie, les packages ou messages PUBLISH sont utilisĂ©s avec le sujet et la charge utile du message envoyĂ© au courtier. D'autre part, le ou les clients intĂ©ressĂ©s utilisent les packages SUBSCRIBE et UNSUSCRIBE pour souscrire ou retirer leur abonnement respectivement. Le courtier rĂ©pondra Ă©galement avec un package SUBACK et UNSUBACK respectivement pour signaler le succès de l'opĂ©ration demandĂ©e par le client.
  • Maintenir la connexion: pour garantir que la connexion reste ouverte, les clients peuvent envoyer pĂ©riodiquement un paquet PINGREQ qui sera mis en correspondance avec un paquet PINGRESP du serveur.
  • Terminer la connexion: lorsqu'un client se dĂ©connecte, il envoie un paquet DISCONNECT pour signaler cet Ă©vĂ©nement.

Ceux messages ou paquets Ceux dont j'ai parlé ont une structure identique à celle des autres paquets d'autres protocoles réseau:

  • En-tĂªte ou en-tĂªte fixe: est une partie fixe qui occupe entre 2 et 5 octets. Il contient un code de contrĂ´le, l'identifiant du type de message envoyĂ© et sa longueur. Entre 1 et 4 octets sont utilisĂ©s pour coder la longueur, en utilisant les 7 premiers bits de chaque octet comme donnĂ©es pour la longueur et un bit supplĂ©mentaire de continuitĂ© pour dĂ©terminer qu'il y a plus d'un octet qui constitue la longueur du message.
  • En-tĂªte variable: n'est pas toujours obligatoire, mais facultatif. Il n'est contenu dans certains packages que dans certaines situations ou messages spĂ©cifiques.
  • Contenu ou donnĂ©es: les donnĂ©es du paquet sont ce qui contient rĂ©ellement le message Ă  envoyer. Cela peut aller de quelques Ko Ă  une limite de 256 Mo.

Si vous souhaitez savoir le code correspondant en hexadécimal pour les types de messages envoyés sont:

Message Code
CONNECTEZ-VOUS MONITORING
CONNECTER MONITORING
PUBLIER MONITORING
PUBLIC MONITORING
public MONITORING
PUBLIER MONITORING
PUB COMP MONITORING
INSCRIPTION MONITORING
SOUS-RETOUR MONITORING
INSCRIRE 0xA0
DÉBALLER 0xB0
PINGRÉQ 0xC =
PINGRESP 0xD0
DÉCONNECTER 0xE0

Qualité et sécurité des communications

Un autre détail important des messages de MQTT est le qualité de service ou QoSet la sécurité. La robustesse du système de communication en cas de panne et sa sécurité en dépendront.

Concernant sa qualitĂ©, il peut Ăªtre dĂ©terminĂ© 3 niveaux diffĂ©rents:

  • QoS 0 (non-reconnaissance)- Le message n'est envoyĂ© qu'une seule fois, et en cas d'Ă©chec, il ne sera pas dĂ©livrĂ©. Il est utilisĂ© lorsqu'il n'est pas critique.
  • QoS 1 (acquitter): le message sera envoyĂ© autant de fois que nĂ©cessaire pour garantir la livraison au client. L'inconvĂ©nient est que le client peut recevoir le mĂªme message plusieurs fois.
  • QoS 2 (assurĂ©)- Similaire Ă  ci-dessus, mais garanti pour Ăªtre livrĂ© une seule fois. Il est souvent utilisĂ© pour des systèmes plus critiques oĂ¹ une plus grande fiabilitĂ© est nĂ©cessaire.

D'autre part, comme pour SĂ©curitĂ© MQTT, diverses mesures peuvent Ăªtre utilisĂ©es pour assurer sa soliditĂ© Ă  cet Ă©gard. Comme je l'ai dĂ©jĂ  mentionnĂ©, l'authentification de l'utilisateur et du mot de passe, comme beaucoup d'autres protocoles, peut Ăªtre assurĂ©e par SSL / TLS. Bien que de nombreux appareils IoT Ă  faibles capacitĂ©s ou ressources puissent avoir des problèmes de surcharge de travail lors de l'utilisation de ce type de communication sĂ©curisĂ©e ...

Pour cette raison, de nombreux appareils IoT qui utilisent MQTT utilisent des mots de passe et des utilisateurs dans texte d'avion, ce qui pourrait inciter quelqu'un Ă  renifler le trafic rĂ©seau pour l'obtenir très facilement. Et si cela ne suffit pas, le courtier peut Ă©galement Ăªtre configurĂ© pour accepter les connexions anonymes, ce qui permettrait Ă  tout utilisateur d'Ă©tablir des communications, ce qui impliquerait un plus grand risque.

Utilisation de MQTT avec Arduino

Arduino UNO avec MQTT

Bien sĂ»r, vous pouvez utiliser le protocole MQTT avec Arduino et d'autres cartes de dĂ©veloppement, ainsi que le Rapsberry Pi, etc. Pour ce faire, vous devez fournir Ă  votre carte Arduino une connectivitĂ©, si elle ne l'a pas. Aussi, la bibliothèque Client Arduino pour MQTT cela vous aidera dans ces tĂ¢ches. Cette bibliothèque est compatible avec:

Vous savez déjà que vous pouvez télécharger et installer la bibliothèque dans votre IDE Arduino à l'aide de la commande: clone git https://github.com/knolleary/pubsubclient.git

Dès que au code pour utiliser MQTT dans certaines applications, la vĂ©ritĂ© est que c'est simple. Dans l'image Fritzing, vous pouvez voir une plaque Arduino UNO Ă  laquelle la connectivitĂ© par Arduino Ethernet a Ă©tĂ© ajoutĂ©e et elle a Ă©galement Ă©tĂ© connectĂ©e un capteur d'humiditĂ© et de tempĂ©rature DHT22, mĂªme si cela aurait pu Ăªtre autre chose ...

Ok, cela dit, pour le code que vous devez générer dans IDE Arduino Pour travailler avec le protocole MQTT sur Arduino, c'est aussi simple que cela:

  • Pour envoyer des messages 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);
}

  • Pour recevoir des messages par MQTT, vous n'avez besoin que de la plaque Arduino UNO et connexion, avec Arduino Ethernet ou tout autre Ă©lĂ©ment. Quant au code, un exemple serait:
#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();
}

N'oubliez pas que vous devez changer l'adresse IP pour celle appropriée pour le serveur, et vous devez également changer l'adresse MAC de votre adaptateur réseau Ethernet ou celui que vous utilisez, ainsi que le reste du code si vous avez l'intention de l'adapter à un projet différent. C'est juste un exemple!

Pour plus d'informations, vous pouvez télécharger gratuitement de notre Manuel PDF avec le cours Arduino IDE pour commencer la programmation.