MQTT - Problème de souscription
Posted: Thu 27 Aug 2020 19:18
Bonjour,
Je suis en train de lire "Pyhton, Raspberry pi et Flask" et j'ai un problème de dialogue Publisher-subscriber en MQTT.
En m'inspirant des exemples proposés dans le livre, j'ai produit les codes suivant:
Pour le subscriber:
Et pour le Publisher:
Observations:
- J'ouvre un terminal et je lance le subscriber:
j'obtiens ceci:
- J'ouvre un second terminal et je lance "mosquitto_pub -h 192.168.1.58 -t "demo/brol" -m "hello world!" -u ********* -P *********
Le premier terminal m'affiche bien le topic et la publication.
- Si par contre, dans ce second terminal, je lance mon script de publisher, tout semble se dérouler normalement dans cette fenêtre (hormis l'un ou l'autre échec)
mais dans le terminal du subscriber, c'est la cata:
Le terminal qui avait annoncé une connexion OK semble redémarrer lors de la réception du message et puis ne fait plus rien.
Si je relance le script de publication, le souscripteur redémarre à nouveau.
Qu'ai-je fait de travers?
Une idée, quelqu'un?
Merci d'avance.
Je suis en train de lire "Pyhton, Raspberry pi et Flask" et j'ai un problème de dialogue Publisher-subscriber en MQTT.
En m'inspirant des exemples proposés dans le livre, j'ai produit les codes suivant:
Pour le subscriber:
Code: Select all
# coding: utf-8
import paho.mqtt.client as mqtt_client
# Configuration
MQTT_BROKER = "192.168.1.**"
MQTT_PORT = 1883
KEEP_ALIVE = 45 # interval en seconde
def on_log( client, userdata, level, buf ):
print( "log: ",buf)
def on_connect( client, userdata, flags, rc ):
print( "Connexion: code retour = %d" % rc )
print( "Connexion: Statut = %s" % ("OK" if rc==0 else "échec") )
def on_message( client, userdata, message ):
print( "Reception message MQTT..." )
print( "Topic : %s" % message.topic )
print( "Data : %s" % message.payload )
# Client(client_id=””, clean_session=True, userdata=None, protocol=MQTTv311, transport=”tcp”)
client = mqtt_client.Client( client_id="client007" )
# Assignation des fonctions de rappel
client.on_message = on_message
client.on_connect = on_connect
client.on_log = on_log
# Connexion broker
client.username_pw_set( username="********", password="**********" )
client.connect( host=MQTT_BROKER, port=MQTT_PORT, keepalive=KEEP_ALIVE )
client.subscribe( "demo/#" )
# Envoi des messages
client.loop_forever()
Code: Select all
# coding: utf-8
import paho.mqtt.client as mqtt_client
from time import sleep
# Configuration
MQTT_BROKER = "192.168.1.**"
MQTT_PORT = 1883
KEEP_ALIVE = 45 # interval en seconde
def on_log( client, userdata, level, buf ):
print( "log: ",buf)
client = mqtt_client.Client( client_id="client007" )
# Assignation des fonctions de rappel
#client.on_log = on_log
# Connexion broker
client.username_pw_set( username="*******", password="********" )
client.connect( host=MQTT_BROKER, port=MQTT_PORT, keepalive=KEEP_ALIVE )
# traitement des message
for i in range(4):
print( "Publication iteration %s" % i )
r = client.publish( "demo/machin-chose", "message %s"%i )
print( " envoyé" if r[0] == 0 else " echec" )
sleep( 1 )
- J'ouvre un terminal et je lance le subscriber:
j'obtiens ceci:
Code: Select all
('log: ', 'Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k45) client_id=client007')
('log: ', "Sending SUBSCRIBE (d0, m1) [('demo/#', 0)]")
('log: ', 'Received CONNACK (0, 0)')
Connexion: code retour = 0
Connexion: Statut = OK
('log: ', 'Received SUBACK')
Le premier terminal m'affiche bien le topic et la publication.
- Si par contre, dans ce second terminal, je lance mon script de publisher, tout semble se dérouler normalement dans cette fenêtre (hormis l'un ou l'autre échec)
Code: Select all
Publication iteration 0
envoyé
Publication iteration 1
envoyé
Publication iteration 2
envoyé
Publication iteration 3
echec
Code: Select all
pi@raspberrypi:~/Documents/Maison_Python $ sudo python test-mqtt-client-sub.py
('log: ', 'Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k45) client_id=client007')
('log: ', "Sending SUBSCRIBE (d0, m1) [('demo/#', 0)]")
('log: ', 'Received CONNACK (0, 0)')
Connexion: code retour = 0
Connexion: Statut = OK
('log: ', 'Received SUBACK')
('log: ', 'Sending CONNECT (u1, p1, wr0, wq0, wf0, c1, k45) client_id=client007')
('log: ', 'Received CONNACK (0, 0)')
Connexion: code retour = 0
Connexion: Statut = OK
Si je relance le script de publication, le souscripteur redémarre à nouveau.
Qu'ai-je fait de travers?
Une idée, quelqu'un?
Merci d'avance.