如何与许多发布者一起发布一个订阅者?

时间:2020-08-10 12:24:41

标签: python python-3.x mqtt mosquitto paho

我需要建立一个由多个发布者,一个经纪人和一个订户组成的网络。

问题: 我有一个带有一对一选项的工作代码(一个发布-一个子)。但是,当我运行更多的发布者时,订阅者仅从最近连接的发布者那里收到消息,而我不知道为什么会这样。

更多信息:Broker(mosquitto)在docker容器中工作,每个发布者是一个单独的脚本,目标是在每个容器中与一个发布者一起运行多个docker容器,但是现在我需要解决通信问题。

有人对如何调试或解决此问题有任何线索或想法吗?

这是发布者脚本:

    import time
    import paho.mqtt.client as mqtt
    import datetime
    import random
    import json
    import logging
    from multiprocessing import Process

    CLEAN_SESSION = False


    def on_connect(client, userdata, flags, rc):
        logging.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 > 5:
                current_time = datetime.datetime.now()
                current_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
                return {"time": current_time, "signal": 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:
                message_payload = json.dumps(check_info)
                logging.info(message_payload)
                client.publish(topic, message_payload, qos=2)
                client.loop()
        client.disconnect()


    if __name__ == "__main__":
        p = Process(target=sensor, args=(1,))
        p.start()
        print("new publisher created!")
      

这是订户脚本:

    import paho.mqtt.client as mqtt
    import paho.mqtt.subscribe as sub
    import json
    import logging
    
    localhost = '172.17.0.2'
    port = 1883
    timeout = 60
    topic = "/mia/sensor" 
        
    
    def on_connect(client, userdata, flags, rc):
        logging.info(f"New connection {client}, {rc}")
        client.subscribe(topic, qos=2)
    
    
    def on_message(client, userdata, msg):
        data = json.loads(msg.payload.decode('utf-8'))
    
        logging.debug(f"new message from {client} - {data}")
        print(data)
    
    
    
    client = mqtt.Client("python", clean_session=False)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect_async(localhost, port, timeout)
    client.loop_forever()

预先感谢

1 个答案:

答案 0 :(得分:1)

您的client_id必须是唯一的。检查一下。