Python paho MQTT, client.on_publish не вызывается, даже если сообщение отправлено брокеру

#mqtt #python-3.7 #paho

#mqtt #python-3.7 #paho

Вопрос:

Итак, это один из тех вопросов типа «чего-мне-здесь-не-хватает?».

Мой обратный вызов, зарегистрированный для события client.on_publish, никогда не вызывается, даже если сообщения успешно опубликованы брокеру (сообщения журнала не печатаются из обратного вызова, и он не останавливается на точке останова в VS Code). Сообщение, в частности, которое меня интересует, публикуется из обратного вызова on_msg, я пытался опубликовать его вне каких-либо обратных вызовов, но это не имеет значения, сообщение получено брокером, но обратный вызов on_publish никогда не срабатывает.

При отладке я вижу, что во время публикации есть функция, зарегистрированная для обратного вызова on_publish (установлено свойство client._on_publish)

Версия Python 3.7.4

ОС Windows 10

Код, который инициализирует клиента:

 import paho.mqtt.client as mqtt

#configure mqtt client
client = mqtt.Client(config['MQTT']['client_id'])
client.on_connect = on_connect
client.on_message = on_msg
client.on_disconnect = on_disconnect
client.on_publish = on_publish

try:
    client.connect(config["MQTT"]["host"], int(config["MQTT"]["port"]))
except Exception as e:
    log.error("Failed to connect to MQTT broker", exc_info=True)

client.loop_start()
  

Мои обратные вызовы для on_msg и on_publish:

 def on_msg(client, userdata, msg):
    global status_msg_id

    log.debug("on_msg")
    payload = json.loads(msg.payload)
    if payload['id'] == config["MISC"]["session_id"]:
        if payload['result'] == 0:
            log.debug("payload content=ok")
            status_msg_id = client.publish(
                topic = config["MQTT"]["pub_status"],
                payload = json.dumps({'status':'ok'}),
                qos = 2)
        else:
            log.debug("payload content=error")
            client.publish(
                topic = config["MQTT"]["pub_status"],
                payload = json.dumps({'status':'error'}),
                qos = 2)
        log.debug("msg id (mid) of status msg: {}".format(status_msg_id))

def on_publish(client, userdata, mid, granted_qos):
    log.debug("on_publish, mid {}".format(mid))
    # we never get here :(
  

Итак, почему не вызывается функция on_publish, чего мне не хватает?

Ответ №1:

Подпись для on_publish обратного вызова неверна.

Из документов:

on_publish()

on_publish(клиент, пользовательские данные, mid)

Это должно быть:

 def on_publish(client, userdata, mid):
    log.debug("on_publish, mid {}".format(mid))