Подпишитесь и прочтите несколько тем на mqtt mosquitto, используя python paho

Мне удалось опубликовать по нескольким темам и прочитать одну из них. Что мне нужно сделать, так это слушать и читать все опубликованные темы и получать сообщения. Это код, который я использую:

  1. Публикуйте сообщения в 3 темы:

    #!/usr/bin/env python3
    
    
    import paho.mqtt.client as mqtt
    
    client = mqtt.Client()
    client.connect("localhost",1883,60)
    client.publish("topic/1", "400 | 350 | 320 | 410");
    client.publish("topic/2", "200 | 350 | 420 | 110");
    client.publish("topic/3", "200 | 350 | 420 | 110");
    
    client.disconnect();
    
  2. Подпишитесь и читайте сообщения по 1 теме

    #!/usr/bin/env python3
    
    import paho.mqtt.client as mqttClient
    import time
    
    def on_connect(client, userdata, flags, rc):
    
    if rc == 0:
    
        print("Connected to broker")
    
        global Connected                #Use global variable
        Connected = True                #Signal connection 
    
    else:
    
        print("Connection failed")
    
    def on_message(client, userdata, message):
    print "Message received : "  + message.payload
    
    Connected = False   
    
    broker_address= "localhost"          
    port = 1883                          
    
    client = mqttClient.Client("Python")          
    client.on_connect= on_connect    
    client.on_message= on_message        
    client.connect(broker_address, port=port)     
    client.loop_start()        
    
    while Connected != True:   
        time.sleep(0.1)
    
    client.subscribe("topic/2")
    try:
    while True:
        time.sleep(1)
    
    except KeyboardInterrupt:
    print "exiting"
    client.disconnect()
    client.loop_stop()
    

person lucian_v    schedule 13.09.2017    source источник
comment
Также существует проблема с вашим кодом публикации, вам необходимо вызывать функцию client.loop между каждой публикацией, чтобы гарантировать, что все они сбрасываются в сетевой стек, или используйте функции одиночной / множественной публикации (pypi.python.org/pypi/paho-mqtt/1.1#id17)   -  person hardillb    schedule 13.09.2017


Ответы (1)


Вы можете вызывать функцию client.subscribe() несколько раз, чтобы подписаться на несколько тем.

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

#!/usr/bin/env python3

import paho.mqtt.client as mqttClient
import time

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to broker")
        client.subscribe("topic/1")
        client.subscribe("topic/2")
        client.subscribe("topic/3")
        client.subscribe("topic/4")

    else:
        print("Connection failed")

def on_message(client, userdata, message):
    print("Message received : "  + str(message.payload) + " on " + message.topic)


broker_address= "localhost"          
port = 1883                          

client = mqttClient.Client("Python")          
client.on_connect= on_connect    
client.on_message= on_message        
client.connect(broker_address, port=port)     
client.loop_start()


try:
    while True:
        time.sleep(1)

except KeyboardInterrupt:
    print("exiting")
    client.disconnect()
    client.loop_stop()

РЕДАКТИРОВАТЬ:

Вы также можете подписаться на несколько тем за один раз, используя следующий синтаксис

client.subscribe([("topic/1", 0), ("topic/2", 0), ("topic/3", 0),("topic/4", 0)])
person hardillb    schedule 13.09.2017
comment
Спасибо за ваше предложение. Кажется, все еще не работает должным образом, так как я получаю ответ только по теме / 1. Я постараюсь понять почему, но еще раз спасибо - person lucian_v; 13.09.2017
comment
Я отредактировал его, чтобы добавить альтернативный способ подписки на несколько тем. - person hardillb; 13.09.2017
comment
Я искал способ получить название темы, по которой отправляется сообщение (при подписке на несколько тем). Искал on_message в источнике библиотеки, и даже intellisense не предсказал свойство topic на message. Вы ответили, сделали свою работу, спасибо! - person roshnet; 24.07.2021