← index #296Issue #90
Related · high · value 0.787
QUERY · ISSUE

If any possible to make umqtt to support Qos 2?

openby Jim43opened 2018-07-30updated 2024-08-25

Look through the Doc and code, i found Qos=2 messages are not supported in umqtt module.It's good to keep the code size small,but this function will make this module more larger ? i am curious

5 comments
ebeem · 2018-08-28

I am interested to know too
qos 2 is needed sometimes

SpotlightKid · 2018-08-31

Yes, implementing support for QOS 2 will increase the code size of the umqtt.simple module. Currently the publish method only handles QOS 0 and 1 and the logic for receiving PUBLISH packet from the server in the wait_msg method also only handles QOS 0 and 1.

For QOS 1 the method has to listen for a PUBACK packet from the server after it sends a PUBLISH packet.

For QOS 2 the client, after sending the PUBLISH packet, has to listen for a PUBREC packet from the server, then send a PUBREL packet and then listen for a PUBCOMP packet.

The simplistic way to implement this would be to handle all this in a synchronous, blocking fashion, i.e. for publishing client -> server, in the method publish replace the assert in line 142 with somethings like this (pseudo code):

while  True:
    opcode = wait_msg()
    if opcode == PUBREC:
        paket = read_packet()
        if paket.paket_id == packet__id:
            break
send_pubrel()
while  True:
    opcode = wait_msg()
    if opcode == PUBCOMP:
        paket = read_packet()
        if paket.paket_id == packet__id:
            break

And for receiving QOS 2 from server -> client, do something like this in the wait_msg method at line 197:

send_pubrec()
while  True:
    opcode = wait_msg()
    if opcode == PUBREL:
        paket = read_packet()
        if paket.paket_id == packet__id:
            send_pubcomp()
            break

The problem with this is:

  • If the server doesn't send the PUBREC or PUBCOMP resp. the PUBREL package, the client will block forever (same it does currently with QOS 1, if no PUBACK is received)-.
  • If the server sends any other packets with QOS 1 or 2 in between, which the spec allows, the client will get confused and probably end up in a dead lock.

The only way I see around these problems is handling reception of all packet types in wait_msg and passing them to different callback methods. But that would a) make a record of sent and received packet ids necessary (which increases memory requirements) and b) go against the stated goal of the module to avoid "callback hell".

ebeem · 2018-09-02

@SpotlightKid Thank you so much!!
this was so helpful indeed, my gratitude.

Jim43 · 2018-09-03

@SpotlightKid Thank You ! that's pretty awesome

jonnor · 2024-08-25

Is this still relevant? Are there other MQTT implementations that people know of that support QoS 2 ?

CANDIDATE · ISSUE

umqtt.simple: query regarding qos == 1

closedby peterhinchopened 2016-08-08updated 2016-08-09

(no description)

2 comments
pfalcon · 2016-08-08

I'm not sure why you closed this ticket and especially deleted all content.

Retry happens at the top level, so entire publish sequence will be repeated (which may be an issue for QoS2, but it's cunningly not supported). The only issue then is that PUBLISH will be retried with new packet ID, unlike standard says. That can be fixed, but would require few lines => more memory pressure. So, unless given non-speculative evidence that this is a real problem for esp8266 software which affects many people, I'd consider this "known issue".

peterhinch · 2016-08-09

Retry happens at the top level

I eventually figured this out and concluded it was a non-issue; there seems to be no way to delete an issue raised in error. Thanks for the response.

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied