Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MQTT: How to know which msg a puback is for?

Tags:

mqtt

I am trying to set up a MQTT server which will persist the messages sent by clients into a local DB. Each message has a "successfully received" flag that I want to flip when receiving clients return a puback for each message (QOS = 1) received.

The question is:

When I publish a message, the server receives the puback back from the receiving client correctly. However, the messageId is not the same as the one from publishing client's packet. I know this is intended. But then I will not be able to find the right message in DB to flip the flag. What if client A sends 2 messages with QOS = 1 to client B back to back? How does the server distinguish between the 2 pubacks coming back?

Maybe MQTT client is doing something magical to map the messageIds that I am missing?

I am using mqttjs and paho mqttv3 btw.

like image 676
asonofdevily Avatar asked Jan 15 '23 16:01

asonofdevily


1 Answers

MQTT PUBLISH messages with QoS 1 or 2 require a message id as part of the packet. The message id is used to identify which message a PUBACK (or PUBREC/PUBREL/PUBCOMP for QoS 2) is referring to. This is an important feature because you may have multiple messages "in flight" at once.

An important point that you may be missing is that clients are completely separate from one another. This means that message ids are unique to a client (and direction of message flow, broker to client or client to broker). The broker generates message ids for messages originating from the broker and the client generates message ids for messages originating from the client; the message ids are independent for each direction so that there is no need for the broker and the client to keep track of what the other is doing.

If you want to keep track of which incoming messages have been sent to all subscribing clients, you will need to keep track of what outgoing messages relate to the incoming message and only trigger your DB once all of the PUBACKs have been received for those outgoing messages. That will tell you which messages have successfully been sent to all clients that were subscribed at the time of the message being received.

If you just want a log of all messages that have been sent to the broker and can assume that the sending works ok, then life is a lot easier. Simply create a client on the broker host that listens to the "#" topic, or whatever you are interested in, then use the client on_message() callback (or however your library manages it) to process the message and store it in the DB.

like image 173
ralight Avatar answered Jan 27 '23 21:01

ralight