#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))