Поиск MQTT PUBACK из обратного вызова on_log с использованием в классе не удается, но он работает в виде плоского сценария - PullRequest
0 голосов
/ 22 ноября 2018

Первый скрипт работает, то есть вызываются обратные вызовы и заканчивается печать puback: True

Второй скрипт, где я использую класс A, не работает.Обратные вызовы не вызываются, и они заканчиваются на a.puback: False

Я не уверен, что моя проблема в том, что обратные вызовы не работают таким образом, и в таком случае, как я могу заставить мой класс работать с этими PahoMQTT обратные вызовы?или если это что-то более тонкое.

РАБОТАЕТ:

def on_log_puback(client, userdata, level, buf):
    global puback
    if 'PUBACK' in buf:
        puback = True
        print "PUBACK!"

def on_connect(client, userdata, flags, rc):
    print "Connect code: ", rc

def on_disconnect(client, userdata, flags, rc=0):
    print "Disconnect code: ", rc

def on_message(client, userdata, msg):
    print "    Message: ", str(msg.payload.decode("utf-8", "ignore"))

def stop():
    print ("stopping loop")
    client.loop_stop()
    print "disconnecting"
    client.disconnect()

import paho.mqtt.client as mqtt 
import time

client     = mqtt.Client("Luke, I am your client") 
mqtt.Client.connected_flag = False 

client.on_connect     = on_connect  
client.on_disconnect  = on_disconnect
client.on_log         = on_log_puback 
client.on_message     = on_message

status = client.connect(host="test.mosquitto.org",
                        keepalive=60, port=1883)
print "connect status: ", status
time.sleep(2)

print "loop_start"
client.loop_start()
time.sleep(1)

sret = client.subscribe("test_topic")
print "subscribe returns sret: ", sret
time.sleep(2)

# initialize global
puback = False

# test publish with qos=1
status, msg_id = client.publish(topic="test_topic",
                                payload="hello!",
                                qos=1, retain=True)   
print "publish status: ", status
time.sleep(2)

print "puback: ", puback

stop()

НЕ РАБОТАЕТ:

import paho.mqtt.client as mqtt 
import time

class A(object):
    def __init__(self):

        client                = mqtt.Client("Luke, I am your client") 
        self.client           = client
        mqtt.Client.connected_flag = False

        client.on_connect     = self.on_connect  
        client.on_disconnect  = self.on_disconnect
        client.on_log         = self.on_log_puback 
        client.on_message     = self.on_message

        status = client.connect(host="test.mosquitto.org",
                                keepalive=60, port=1883)
        print "connect status: ", status
        time.sleep(2)

        print "loop_start"
        client.loop_start()
        time.sleep(1)

        sret = client.subscribe("test_topic")
        print "subscribe returns: ", sret
        time.sleep(2)

        # initialize global
        puback = False

        # test publish with qos=1
        status, msg_id = client.publish(topic="test_topic",
                                        payload="hello!",
                                        qos=1, retain=True)   
        print "publish status: ", status
        time.sleep(2)

        self.puback = puback

    def on_log_puback(client, userdata, level, buf):
        global puback
        if 'PUBACK' in buf:
            puback = True
            print "PUBACK!"

    def on_connect(client, userdata, flags, rc):
        print "Connect code: ", rc

    def on_disconnect(client, userdata, flags, rc=0):
        print "Disconnect code: ", rc

    def on_message(client, userdata, msg):
        print "    Message: ", str(msg.payload.decode("utf-8", "ignore"))

    def stop(self):
        print ("stopping loop")
        self.client.loop_stop()
        print "disconnecting"
        self.client.disconnect()

a = A()

time.sleep(2)
print 'a.puback: ', a.puback
a.stop()

1 Ответ

0 голосов
/ 22 ноября 2018

Нашел это.Когда я переместил обратные вызовы в класс, например, on_log_puback(self,...), я просто забыл добавить self в начало аргументов.Теперь все работает хорошо.

...