2017-09-20 4 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

나는 이것을 재현 할 수있는 것처럼 보입니다. 왜 이런 식으로 행동해야하는지 알 수 없습니다. 나는 여기에 설명 된대로 파이썬 파 호 코드에 대한 이슈를 제기하고 싶다. https://pypi.python.org/pypi/paho-mqtt/1.1#reporting-bugs – hardillb

답변

1

직접 문제를 해결할 수있었습니다. 여기에 답변을 게시하면 나중에 도움이 될 것입니다.

코드가 멈추는 이유는 뮤텍스 (dead lock) 문제입니다. on_connect()을 호출하기 전에 message_callback_add()을 수행해야합니다. 문서를 읽는 것이 그렇게 쉬운 일은 아니 었습니다.

+1

나는 소리가 난다. 당신이 연결하기 전에 구독을 "끝내는 것"처럼, 틀린, – hardillb

+0

나는 버그로보고했다. – theAlse