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()

Clair et simple, simple et clair. Merci
Merci beaucoup!
sudo apt-get install mosquitto-clients
et non
sudo apt-get install mosquitto-client
Merci beaucoup! corrigé