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.