Démarrer avec Node.js et MQTT

-

Introduction

Comme nous le savons peut-être déjà, Node.js est un moteur et un moteur d’exécution JavaScript asynchrone et événementiel, qui alimentent une grande partie des applications en réseau côté serveur qui existe aujourd’hui. Dans ce billet, nous allons explorer l’interaction entre Node.js et MQTT, un protocole de publication/abonnement (pub/sub) et une norme pour le monde de l’Internet des objets (IoT).

Dans cet article, nous prévoyons de couvrir uniquement les API et fonctions MQTT publiques et importantes, et d’explorer un script simple d’éditeur et d’abonné dans Node.js.

Qu’est-ce que MQTT ?

En 1999, Andy Standford-Clark d’IBM et Arlen Nipper ont conçu la version initiale du protocole MQTT. À l’époque, l’objectif était de créer un protocole capable de prendre en charge une faible bande passante, léger et consommant un minimum de ressources, car les appareils connectés par liaison satellite sont très coûteux.

Il existe deux versions de la spécification : MQTT 3.1.1 et MQTT 5.0.0. La plupart des MQTT brokers commerciaux prennent désormais en charge MQTT 5, mais de nombreux services cloud gérés IoT ne prennent en charge que MQTT 3.1.1, qui était la version la plus populaire et la plus largement prise en charge.

Il est fortement recommandé que les nouveaux déploiements IoT utilisent la version 5.0.0 (approuvée en 2018), car ses nouvelles fonctionnalités se concentrent davantage sur les systèmes robustes et l’évolutivité native du cloud. Vous pouvez lire les points saillants et les différences détaillées entre les deux versions sur la page GitHub de MQTT.

Voir aussi mon article sur Websocket vs. MQTT vs. CoAP : Quel est le meilleur protocole ?

Utilisation

MQTT est un protocole client-serveur léger qui met en œuvre le modèle de transport de messages pub/sub et a été utilisé pour connecter des pairs/appareils distants dans des applications IoT critiques, des communications Machine-to-Machine (M2M) et de nombreux autres domaines qui nécessitent une interface fluide pour le transport de messages avec une bande passante limitée, mais des performances exceptionnelles. C’est le résultat de sa conception simple, de sa facilité d’utilisation et de sa spécification ouverte.

MQTT est géré par le comité de pilotage technique d’OASIS depuis 2014. Le comité supervise le maintien, la mise à jour et la pérennisation de la norme, y compris l’organisation des documents relatifs aux cas d’utilisation et la protection de ses droits de propriété intellectuelle.

Elle s’appuie sur TCP/IP, une pile réseau de bas niveau fiable et orientée connexion, avec une couche de transport indépendante de la structure des données utiles, permettant un modèle de réseau de communication bidirectionnel, hôte à hôte, ordonné et correct.

Le modèle pub/sub permet également de distribuer des messages d’une application à plusieurs applications différentes en même temps. Toutefois, dans ce cas, l’éditeur et l’abonné sont généralement des applications indépendantes (découplées) et ne sont reliés que par un courtier ou un serveur. Par exemple, la célèbre plate-forme de messagerie pub/sub RabbitMQ utilise MQTT sous le capot.

Installation de notre bibliothèque client

Pour installer MQTT.js, exécutez la commande suivante :

npm install mqtt --save

Notez que MQTT.js regroupe une commande pour interagir avec un broker. Pour avoir l’interface du protocole MQTT disponible sur votre chemin système, nous pouvons l’installer globalement :

npm install mqtt -g 

Création d’un client de publication MQTT

Créons maintenant un client MQTT qui publie des messages. Pour ce faire, nous pouvons importer la bibliothèque MQTT.js et utiliser la méthode connect.

const mqtt = require('mqtt')

require('dotenv').config()

const clientId = 'mqttjs_' + Math.random().toString(8).substr(2, 4)

const client = mqtt.connect(process.env.BROKER_URL, {
  clientId: clientId,
  clean: false,
})

console.log(process.env.BROKER_URL, 'client', clientId)

Remarquez que nous avons ajouté l’URL BROKER_URL à notre fichier d’environnement. Comme nous pouvons le voir, la méthode connect accepte une URL donnée (URL du serveur de courtage) et un objet optionnel d’options de serveur. Les protocoles acceptés peuvent être MQTT, ws, wss, tcp, tls et ainsi de suite. La méthode connect renvoie un client connecté.

Publication de données et de messages
Une fois connecté à un courtier, un client MQTT peut envoyer des messages presque immédiatement. L’événement de publication prend une charge utile de message et un nom de sujet, que le courtier peut utiliser pour identifier les parties abonnées. Il y a également une option de rappel qui vérifie s’il y a une erreur ou si le paquet de messages a été transmis.

Le type de message publié ou le paquet envoyé possède les attributs suivants :

  • topicName
  • dupFlag
  • qos
  • payload
  • packetId ou messageId
  • retainFlag

Lorsqu’un client envoie un message à un broker, ce dernier traite le message en fonction de certains critères définis par un développeur. Ces critères doivent inclure le niveau de QoS, qui détermine le type de garantie qu’a un message d’atteindre les destinataires prévus et assure les garanties de livraison des messages.

L’étape de traitement consiste généralement à lire, accuser réception et identifier les clients qui se sont abonnés aux sujets. La dernière étape consiste à envoyer les messages aux clients abonnés.

Voici le code complet du fichier publisher.js, y compris certaines des méthodes/API publiques :

const mqtt = require('mqtt')

require('dotenv').config()

const clientId = 'mqttjs_' + Math.random().toString(8).substr(2, 4)

const client = mqtt.connect(process.env.BROKER_URL, {
  clientId: clientId,
  clean: false,
})

console.log(process.env.BROKER_URL, 'client', clientId)

const topicName = process.env.TOPIC_NAME
console.log('topicName', topicName)

client.on('connect', function (connack) {
  console.log('client connected', connack)

  // on client conection publish messages to the topic on the server/broker
  const payload = ['Hello world', 'Welcome to the test connection']

  // assumming messages comes in every 3 seconds to our server and we need to publish or proecess these messages
  setInterval(() => {
    const rancomkeyId = 'key_' + Math.random().toString(8).substr(2, 8)
    console.log('Message published with key:', rancomkeyId)

    const payloadSend = [...payload, [rancomkeyId]]
    client.publish(
      process.env.TOPIC_NAME,
      JSON.stringify(payloadSend),
      { qos: 1, retain: true },
      (PacketCallback, err) => {
        if (err && err.cmd !== 'publish') {
          console.log('MQTT publish packet', err)
        }
      }
    )
  }, 3000)
})

client.on('error', function (err) {
  console.log('Error: ' + err)
  if (err.code == 'ENOTFOUND') {
    console.log(
      'Network error, make sure you have an active internet connection'
    )
  }
})

client.on('close', function () {
  console.log('Connection closed by client')
})

client.on('reconnect', function () {
  console.log('Client trying a reconnection')
})

client.on('offline', function () {
  console.log('Client is currently offline')
})

Ensuite, nous pouvons aller de l’avant et implémenter le client d’abonnement, qui consomme les messages sur les sujets.

Abonnement aux messages

Pour recevoir des messages sur les sujets qui nous intéressent, le client appelle l’événement subscribe auprès du broker. Le message souscrit contient généralement une charge utile de paquet de messages.

Notez que les clients abonnés doivent connaître à l’avance la structure des données qu’ils recevront, afin de pouvoir les traiter de manière appropriée. L’éditeur envoie des messages à un sujet particulier dans le courtier dans un format particulier, et l’abonné prévu de ce message a besoin de savoir comment ces données sont structurées, afin qu’ils soient en mesure de les traiter correctement sans casser l’application.

Le code complet du client abonné est présenté dans le fichier ci-dessous.

const mqtt = require('mqtt')

require('dotenv').config()

const client = mqtt.connect(process.env.BROKER_URL)

const topicName = process.env.TOPIC_NAME

// connect to same client and subscribe to same topic name
client.on('connect', () => {
  // can also accept objects in the form {'topic': qos}
  client.subscribe(topicName, (err, granted) => {
    if (err) {
      console.log(err, 'err')
    }
    console.log(granted, 'granted')
  })
})

// on receive message event, log the message to the console
client.on('message', (topic, message, packet) => {
  console.log(packet, packet.payload.toString())
  if (topic === topicName) {
    console.log(JSON.parse(message))
  }
})

client.on('packetsend', (packet) => {
  console.log(packet, 'packet2')
})

Conclusion

MQTT offre un modèle de messagerie bidirectionnelle pub/sub adapté aux zones où la bande passante du réseau est limitée. Les services sont indépendants de nos principales applications puisqu’ils sont découplés, et les brokers ou les serveurs peuvent être mis à l’échelle individuellement.

Voici une liste de projets open source exploitant le protocole MQTT sur GitHub. Les détails de notre application de démonstration se trouvent sur GitHub, et vous pouvez également trouver les détails de la norme MQTT sur GitHub.

Alfredhttps://www.alfreddagenais.com
Je suis un développeur Web Full Stack sénior. Chaque jour est pour moi une journée de plus pour découvrir de nouvelles idées. Le développement web et l'informatique sont omniprésents dans mon quotidien. Pour que la créativité soit à son maximum, il ne faut pas avoir peur d’expérimenter et nous avons tous que le Web est infiniment grand pour expérimenter nos idées.

Buy me a coffee Paypal Patreon Ko-Fi

Share this article

Recent posts

Popular categories

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici

Recent comments