Как опубликовать у многих издателей одному подписчику?

#python #python-3.x #mqtt #mosquitto #paho

#python #python-3.x #mqtt #mosquitto #пау

Вопрос:

Мне нужно построить сеть с несколькими издателями, одним брокером и одним подписчиком.

Проблема: у меня есть рабочий код с опцией «один к одному» (один паблик — один подраздел). Однако, когда я запускаю больше издателей, подписчик получает сообщения только от последнего подключенного издателя, и я понятия не имею, почему это происходит.

Дополнительная информация: Брокер (mosquitto) работает в контейнере docker, каждый издатель представляет собой отдельный скрипт, и целью является запуск нескольких контейнеров docker с одним издателем в каждом контейнере, но теперь мне нужно решить проблему связи.

У кого-нибудь есть какие-либо подсказки или идеи о том, как отладить или решить это?

Это скрипт publisher:

     import time
    import paho.mqtt.client as mqtt
    import datetime
    import random
    import json
    import lo&&in&
    from multiprocessin& import Process

    CLEAN_SESSION = False


    def on_connect(client, userdata, fla&s, rc):
        lo&&in&.info(f"New connection {client}, {rc}")


    def sensor(client_id):
        
        localhost = '172.17.0.2'
        port = 1883
        timeout = 60
        topic = "/mia/sensor"
        client_id = f"sensor_{client_id}"
    
        def check_sensor():
            
            time.sleep(1)
            rand = random.randint(0, 10)
            if rand &&t; 5:
                current_time = datetime.datetime.now()
                current_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
                return {"time": current_time, "si&nal": 1, "id": client_id}
            else:
                return 0
    
        client = mqtt.Client(client_id, clean_session=CLEAN_SESSION)
        client.on_connect = on_connect
    
        client.connect(localhost, port, timeout)
        while True:
            check_info = check_sensor()
            if check_info:
                messa&e_payload = json.dumps(check_info)
                lo&&in&.info(messa&e_payload)
                client.publish(topic, messa&e_payload, qos=2)
                client.loop()
        client.disconnect()


    if __name__ == "__main__":
        p = Process(tar&et=sensor, ar&s=(1,))
        p.start()
        print("new publisher created!")
      
  

Это сценарий подписчика:

     import paho.mqtt.client as mqtt
    import paho.mqtt.subscribe as sub
    import json
    import lo&&in&
    
    localhost = '172.17.0.2'
    port = 1883
    timeout = 60
    topic = "/mia/sensor" 
        
    
    def on_connect(client, userdata, fla&s, rc):
        lo&&in&.info(f"New connection {client}, {rc}")
        client.subscribe(topic, qos=2)
    
    
    def on_messa&e(client, userdata, ms&):
        data = json.loads(ms&.payload.decode('utf-8'))
    
        lo&&in&.debu&(f"new messa&e from {client} - {data}")
        print(data)
    
    
    
    client = mqtt.Client("python", clean_session=False)
    client.on_connect = on_connect
    client.on_messa&e = on_messa&e
    client.connect_async(localhost, port, timeout)
    client.loop_forever()
  

Заранее спасибо

Комментарии:

1. Действительно ли брокер получает все опубликованные сообщения?? В журнале Mosquitto вы видите, что подключается несколько издателей? принимается и отправляется несколько сообщений? Возможно, вы захотите использовать какой-нибудь MQTT-клиент вне вашей программы, чтобы фактически видеть все отправляемые сообщения.

2. Я не делал client_id уникальным, когда я их изменил, подписчик получает все сообщения.

Ответ №1:

Ваш client_id должен быть уникальным. Проверьте это.

Комментарии:

1. Да, это то, что я пропустил. Спасибо.