2017-09-20 1 views
0

J'utilise paho.mqtt.client. Ci-dessous est une version simplifiée du code, mais il montre encore le problème.MQTT paho coincé à l'appel à à message_callback_add

# -*- coding: utf-8 -*- 

import sys 
import os 
import time 
import logging 

from time import sleep 

import paho.mqtt.client as mqtt 

mqtt_server_ip  = "10.42.0.1" 
mqtt_server_port = 1884 

subscriptions_qos =[("doorStatus/status", 0), 
        ("doorStatus/eol",0)] 

def callback_door_status(client, userdata, message): 
    logging.debug("Received %s", message.payload) 

def on_log(client, userdata, level, buf): 
    logging.debug("%s", buf) 

def on_connect(client, userdata, flags, rc): 
    logging.info("Successfully connected to MQTT with result code %s", str(rc)) 
    print("before message_callback_add 1") 
    client.message_callback_add("doorStatus", callback_door_status) 
    print("after message_callback_add") 

    (result, _) = client.subscribe(subscriptions_qos) 
    if (result == mqtt.MQTT_ERR_SUCCESS): 
     logging.info("Successfully subscribed to MQTT topics with result code %s", str(result)) 

def on_message(client, userdata, msg): 
    logging.debug("Received: Topic: %s Body: %s", msg.topic, msg.payload) 

def main(): 
    logger = logging.getLogger('root') 
    logging.basicConfig(format='[%(asctime)s %(levelname)s: %(funcName)20s] %(message)s', level=logging.DEBUG) 

    client = mqtt.Client("master") 
    client.on_log = on_log 
    client.on_connect = on_connect 
    client.on_message = on_message 
    client.connect(mqtt_server_ip, mqtt_server_port, 60) 

    client.loop_forever() 

if __name__ == '__main__': 
    main() 

Et ceci est la sortie du programme:

[2017-09-20 07:06:40,562 DEBUG:    on_log] Received CONNACK (0, 0) 
[2017-09-20 07:06:40,562 INFO:   on_connect] Successfully connected to MQTT with result code 0 
before message_callback_add 1 

Comme vous pouvez le voir sur la sortie, la connexion au courtier est établi avec succès, mais juste après le premier appel à message_callback_add le code reste coincé et rien d'autre ne se passe. À ce stade, la seule chose que je peux faire est de tuer le processus. Je ne sais pas pourquoi le code est bloqué, j'ai aussi regardé la documentation et je n'ai toujours rien trouvé.

+0

Je semble être en mesure de reproduire cela et je ne vois pas pourquoi il devrait se comporter de cette façon. Je serais tenté de soulever un problème avec le code python python comme décrit ici: https://pypi.python.org/pypi/paho-mqtt/1.1#reporting-bugs – hardillb

Répondre

1

J'ai réussi à résoudre le problème moi-même. Poster la réponse ici et cela pourrait aider quelqu'un dans le futur.

La raison pour laquelle le code est bloqué est que je crois à un problème de mutex (blocage mort). message_callback_add() doit être effectuée avant d'appeler on_connect(). Ce n'était pas si futile de lire la documentation.

+1

Je lèverais quand même un bogue comme ça sonne comme si vous finissiez par "faire" un abonnement avant de vous être connecté, ce qui est faux, – hardillb

+0

J'ai signalé comme un bug – theAlse