Site icon AranaCorp

Mettre en place un serveur MQTT avec Mosquitto

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

Sources

Quitter la version mobile