Search code examples
mqttmosquittopaho

MQTT Broker does not deliver the messages sent by publisher, on time


I wrote this MQTT publisher code:

import paho.mqtt.client as mqtt
import time

HOST = "localhost"
PORT = 1883
KEEP_ALIVE_INT = 100
TOPIC = "noti"

def sendMsg():
    MSG = ["1111",  "2222", "3333", "4444", "5555"]
    i = 0

    try:
        while i<5:
            client.publish(TOPIC, MSG[i], qos=0)
            i+=1
            time.sleep(1)
    except Exception as e:
        print("Caught Exception: " + e)

def onConnect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected successfully")
        sendMsg()
    else:
        print("Connection failed, result code: " + str(rc))

def onPublish(client, userdata, mid):
    print ("Message is published")

client = mqtt.Client("pub")

client.on_connect = onConnect
client.on_publish = onPublish

client.connect(HOST, PORT, KEEP_ALIVE_INT)

client.loop_forever()

And, the following is the MQTT subscriber code:

import paho.mqtt.client as mqtt
import time

HOST = "localhost"
PORT = 1883
KEEP_ALIVE_INT = 100
TOPIC = "noti"

def onConnect(client, userdata, flags, rc):
    if rc == 0:
        print("=> Connected successfully")
        client.subscribe(TOPIC, 0)
    else:
        print("=> Connection failed, result code: " + str(rc))


def onSubscribe(mosq, obj, mid, granted_qos):
    print ("=> Subscribed to topic: " + TOPIC)
    print ("Granted QOS: "+str(granted_qos))


def onMessage(client, userdata, msg):
    print("=> Received message: " + msg.topic +" - " + msg.payload.decode("utf-8"))


client = mqtt.Client("sub")

client.on_message = onMessage
client.on_connect = onConnect
client.on_subscribe = onSubscribe

client.connect(HOST, PORT, KEEP_ALIVE_INT )

client.loop_forever()

I am using Mosquitto broker in my PC.

The publish is done in every 1 second, but I can see the print "Message is published" 5 times after all 5 messages are published. Also, the subscriber receives the messages together after 5 seconds, not in every 1 second.

Please help me understand the mistake, suggest modification.


Solution

  • This is because all callbacks and message handling happen on the client network loop thread and you are blocking that thread by not returning from the on_connect() callback.

    So the calls to client.publish() are queued up until the on_connect() callback returns.

    You need to find a way to trigger the sendMsg() function not on the client loop. (Probably on a separate thread)