Communication MQTT

Principe de la communication MQTT

Dans l’exemple ci dessous, l’adresse 192.168.50.31 correspond à l’adresse IP de mon PC sur le réseau WIFI e021

Sur ce PC, je peux tester un échange en local :

Dans un premier terminal :

# Lancement du Broker  
mosquitto -c /etc/mosquitto/conf.d/custom.conf

REMARQUE :

custom.conf

listener 1883
allow_anonymous true
log_type all
log_timestamp true
persistence true
max_inflight_messages 20

Dans un 2ème terminal :

# SUBSCRIBE TO TOPIC test/message
mosquitto_sub -d -h 192.168.50.31 -t test/message

Dans un 3ème terminal :

# PUBLISH MESSAGE IN TOPIC test/message 
mosquitto_pub -d -t test/message -m "hello" -h 192.168.50.31

Dès lors qu’un Broker est présent à une adresse donnée sur un réseau, je peux échanger des messages depuis n’importe quel PC connecté à ce réseau, en faisant uniquement référence au Broker.


Mise en Oeuvre

L’application ci-dessous doit faire en sorte que :

  • Le PC envoie toutes les 3s un message topic ‘control’ valant ‘f’
  • Le Robot envoie toutes les 2s un message topic ’test/lesssage’ valant ‘in the loop’

schema_mqtt.svg

Côté PC

Installations :

si nécessaire, faire au préalable :

pip install paho-mqtt  

Le Broker doit être lancé, dans un autre terminal lancer le programme suivant :

#! /usr/bin/python3
import sys
import paho.mqtt.client as mqtt
import time
########################################################################
def on_message(client, userdata, msg):  
    print(msg.topic+" "+str(msg.payload))  

def on_connect(client, userdata, flags, reason_code, properties):  
    print("Connected with result code {reason_code}")
    #client.subscribe("$SYS/#")

########################################################################
if __name__ == '__main__':


    mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
    mqttc.on_connect = on_connect
    mqttc.connect("localhost", 1883, 60)
    time.sleep(1) 
    mqttc.on_message = on_message
    mqttc.subscribe("test/message",0)

    mqttc.loop_start()
   
    while(1):  
        mqttc.publish("control", "f")
        time.sleep(3) 


########################################################################

 

Côté Robot

Adapter l’adresse IP 192.168.50.x pour qu’elle corresponde à celle du Broker ( votre PC ).

mqtt_min.ft

mqtt.svg

import logging
import time
from fischertechnik.mqtt.MqttClient import MqttClient
from lib.controller import *

ctl = None
client_local = None


def mqtt_callback(message):
    global ctl, client_local
    if not not len(message.payload.decode("utf-8")):
        msg= message.payload.decode("utf-8")
        print("msg rcv ="+msg)
        if message.topic=="control":
            print("control")
            ctl=message.payload.decode("utf-8")

ctl = 0
client_local = MqttClient()
client_local.connect(host='192.168.50.31', port=1883, user='', password='')
time.sleep(2)
if client_local.is_connected():
    client_local.publish(topic='test/message', payload='INIT', qos=0, retain=False)
    client_local.subscribe(topic='control', callback=mqtt_callback, qos=0)
    while True:
        client_local.publish(topic='test/message', payload='in the loop', qos=0, retain=False)
        print(ctl)
        time.sleep(2)