2017-09-20 1 views
0

私はpaho.mqtt.clientを使用しています。MQTTパホが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() 

そして、これはプログラムから出力されますが、右の最初の呼び出しの後message_callback_addコードに、あなたは出力から見ることができるように、ブローカーへの接続が正常に確立され

[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 

立ち往生し、何も起こらない。この時点で私が行うことができるのは、プロセスを強制終了することだけです。 なぜコードが詰まっているのか分かりません。私はドキュメントを見ても何も見つけられませんでした。

+0

私はこれを再現できると思われ、なぜこのように振る舞うべきかわかりません。私はここに記載されているように、Pythonのパホのコードに対して問題を提起するように誘惑される:https://pypi.python.org/pypi/paho-mqtt/1.1#reporting-bugs – hardillb

答えて

1

私はこの問題を自分で解決することができました。ここに回答を投稿すれば、将来誰かを助けるかもしれない。

コードがスタックされている理由は、ミューテックス(デッドロック)問題です。 on_connect()を呼び出す前に message_callback_add()を実行する必要があります。 これはドキュメントを読むのはそれほど簡単ではありませんでした。

+1

私はまだそれが鳴っているとしてバグを起こすだろうあなたが接続する前にサブスクリプションをやってしまうのは間違っています。 – hardillb

+0

私はバグとして報告しました – theAlse

関連する問題