Pour tester et utiliser le protocole MQTT, il est possible d’installer un serveur MQTT grâce à Mosquitto sur un ordinateur Windows ou Linux Une application courante est d’installer Mosquitto sur Raspberry Pi et s’en servir comme serveur MQTT pour des IoT et de la domotique.
Description du protocole MQTT
Le protocole MQTT (Message Queue Telemetry Transport) est un protocole de communication spécifié pour des échanges de données de petite taille sur des réseaux avec beaucoup de délais et une faible bande passante.
Le protocole consiste en un serveur MQTT (broker) sur lequel des clients viennent se connecter. Les clients peuvent éditer (publish) ou s’abonner (subscribe) à un sujet (topic). Les messages publiés sur les topics peuvent donc être échangés entre les clients.
Mosquitto est un serveur MQTT open-source qui permet d’utiliser simplement le protocole MQTT entre différents appareils connectés au même réseau.
Installer le serveur MQTT sous Linux
Sur Linux, on peut installer Mosquitto à l’aide des commandes suivantes
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
Une fois le service installé, il est possible de le gérer avec les commandes suivantes
sudo systemctl stop mosquitto #arrêter
sudo systemctl start mosquitto #démarrer
sudo systemctl restart mosquitto #redémarrer
sudo systemctl status mosquitto #connaitre le status
La configuration du serveur se fait à l’aide du fichier
sudo nano /etc/mosquitto/mosquitto.conf
sudo nano /etc/mosquitto/conf.d/default.conf
Exemple de fichier de configuration
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
port 1883
allow_anonymous true
include_dir /etc/mosquitto/conf.d
Installer le serveur MQTT sous Windows
Sur Windows, télécharger et installer Mosquitto
Une fois installer, entrer la commande suivante dans une invite de commande pour lancer le service
mosquitto
Pour vérifier que le service est bien lancé:
netstat -an | find str 1883
C:\Users\ADMIN>netstat -an | findstr 1883
TCP 127.0.0.1:1883 0.0.0.0:0 LISTENING
TCP [::1]:1883 [::]:0 LISTENING
Le fichier de configuration du serveur se trouve dans le dossier d’installation
C:\Program Files\mosquitto\mosquitto.conf
Tester MQTT
Il est possible d’utiliser mosquitto directement en ligne de commande. Dans un terminal, entrez la commande suivante
mosquitto_sub -h localhost -t test_topic
Dans un autre terminal
mosquitto_pub -h localhost -t test_topic -m "Hello World!"
N.B.: Lancer le code subscriber avant le code publisher
Tester MQTT avec Python
Dans l’exemple suivant, nous allons utiliser mosquitto avec Python afin d’échanger des messages MQTT entre deux scripts python
python -m pip install paho-mqtt
Script Python abonné (subscriber)
#!/usr/bin/env python # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt #import library import time MQTT_BROKER = "localhost" #specify the broker address, it can be IP of raspberry pi or simply localhost MQTT_TOPIC = "test_channel" #this is the name of topic global messageReceived messageReceived=False # callback called when client receives a CONNACK response def on_connect(client, userdata, flags, rc): if rc==0: client.subscribe(MQTT_TOPIC) print("subscribe to {}".format(MQTT_TOPIC)) else: syslog.syslog("bad connection {}".format(rc)) # callback called when a PUBLISH message is received def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload.decode("utf-8"))) global messageReceived messageReceived=True client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect(MQTT_BROKER) client.loop_forever()# use this line if you don't want to write any further code. It blocks the code forever to check for data """ client.loop_start() #use this line if you want to write any more code here delay=0.001 counter=120/delay #2min while messageReceived==False and counter>0: time.sleep(delay) client.loop_stop() """
Script Python éditeur (publisher)
Pour publier sur un topic, il suffit de spécifier l’adresse du serveur(MQTT_BROKER) et le nom du topic sur lequel on publie (MQTT_TOPIC)
#!/usr/bin/env python # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt #import library import time MQTT_BROKER = "localhost" MQTT_TOPIC = "test_channel" client = mqtt.Client("pyScript") client.connect(MQTT_BROKER) msg="Hello World!!" client.publish(MQTT_TOPIC,msg) print("Published {} over MQTT".format(msg)) counter=0 while counter<10: counter+=1 client.publish(MQTT_TOPIC,"counter : {}".format(counter)) print("Published counter : {}".format(counter)) time.sleep(0.001) client.disconnect()
Envoyez un groupe de données ordonnées avec JSON
Le paquet JSON de python est une librairie pratique pour stocker et échanger des données sous forme de fichier JSON.
Script pour envoyer un JSON
Le fichier JSON se présente simplement au format ‘un dictionnaire
import paho.mqtt.client as mqtt #import library import time import json MQTT_BROKER = "localhost" MQTT_TOPIC = "test_channel" client = mqtt.Client("10.3.141.1") client.connect(MQTT_BROKER) json_data = {} json_data['msg'] = "hello World" json_data['index'] = 12 json_data['value'] = 49.3 json_data['list'] = ["alpha","bravo","charlie"] client.publish(MQTT_TOPIC,str(json_data)) print("Published json over MQTT")
Script pour réceptionner un JSON
Dans le script de réception, nous allons rajouter le décodage du json sous forme de dictionnaire
if "{" in msgrec: #decode json data = json.loads(msgrec.replace("'",'"')) for key in data: print("{} : {}".format(key,data[key]))
#!/usr/bin/env python # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt #import library import time import json MQTT_BROKER = "localhost" #specify the broker address, it can be IP of raspberry pi or simply localhost MQTT_TOPIC = "test_channel" #this is the name of topic global messageReceived messageReceived=False # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): if rc==0: client.subscribe(MQTT_TOPIC) print("subscribe to {}".format(MQTT_TOPIC)) else: syslog.syslog("bad connection {}".format(rc)) # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): msgrec=str(msg.payload.decode("utf-8")) print(msg.topic+" "+msgrec) if "{" in msgrec: #decode json data = json.loads(msgrec.replace("'",'"')) for key in data: print("{} : {}".format(key,data[key])) global messageReceived messageReceived=True client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect(MQTT_BROKER) client.loop_forever()