2017-01-19 5 views
1

Я, имеющим немного задержки-вопрос в моем MQTT Python (v2.7) скрипте, который мне интересно ...Реагирования в MQTT с Python

Поэтому у меня есть один запрос устройства функции для другое устройство. Назовем их A и B.

Итак, A отправляет сообщение MQTT, чтобы что-то сделать, а B выполняет эту функцию. У меня есть Отправить его обычным способом публикации. Здесь нет проблем.

B получает изданное сообщение с частью:

def on_message(client, userdata, msg): 
    if msg.topic == "action": 
      >> then do something here << 

Также кажется, нет никаких проблем здесь. Он получает сообщение, и он выполняет действие.

Проблема получает здесь, когда я пытаюсь сообщить, что он собирается, который выглядит следующим образом:

def on_message(client, userdata, msg): 
    if msg.topic == "action": 
      >> then do something here << 
      client.publish("report", payload=message1, qos=2, retain=False) 
      >> then do some more action here << 
      client.publish("report", payload=message2, qos=2, retain=False) 

Проблема заключается не в том, что он не делает действия или что он не делает действие, но, похоже, он будет делать то и другое, а скорее в очень странном порядке, например:

action 
action 
(several seconds wait) 
message1 
message2 

Это не похоже на правду? Как я могу заставить сценарий отправить сообщение до того, как он выполнит вторую часть?

+0

Что вы ищете, что «посылает все сообщения»? Получив на устройстве A? –

+0

Я использую mosquitto_sub для подписки на все темы и просмотра того, что входит. – user5740843

ответ

1

Работает должным образом.

Сетевой цикл представляет собой единственный поток, который уже обрабатывает входящее сообщение. Публикации помещаются в очередь до тех пор, пока функция on_message не завершится, а затем сетевой цикл будет обрабатывать эти поставленные в очередь.

+0

Есть ли способ заставить его работать независимо? Разумеется, должно быть решение этого. – user5740843

+0

Не с одним экземпляром клиента MQTT – hardillb

1

Стек TCP асинхронен. Когда вы вызываете для отправки данных, это не означает, что он немедленно отключается. За вашим кодом работает цикл событий. Если вы хотите что-то сделать последовательно, вы должны разбить свои последовательные задачи на отдельные функции и называть их следующим on_publish(), когда сообщение действительно отправлено.

0

Я был в состоянии отправлять сообщения, используя библиотеку:

import paho.mqtt.publish as mqttc 

и с использованием:

mqttc.single("report", payload=message1, qos=2, hostname=XXXX, port=XXXX) 

, который будет следовать естественному течению сценария и до сих пор посылают сообщение.

+0

Это эффективно работает с двумя отдельными клиентами MQTT – hardillb

+0

@hardillb Я был немного смущен. Однако я понимаю, что вы сейчас имеете в виду. Да. Спасибо, что встретил меня на правильном пути! – user5740843

Смежные вопросы