adafruit / Adafruit_CircuitPython_MiniMQTT

MQTT Client Library for CircuitPython
Other
73 stars 50 forks source link

Sometimes receiving single zero byte #128

Open dhalbert opened 1 year ago

dhalbert commented 1 year ago

Why does #127 fix #126? As mentioned by @brentru in https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/pull/127#issuecomment-1317271214 and following

@jinglemansweep Hi - thanks for fixing this issue. @dhalbert - I do not think this is a network or a MQTT spec issue, b"\x00 is rx'd after the call to res = self._sock_exact_recv(1).

Considering some in #126 are having issues with non-native wifi, it's possible (don't know, guessing right now) that the issue is within this library's local implementation of _sock_exact_recv() vs the native impl. of _sock_exact_recv() (cc @calcut ☝️ )

        # CPython socket module contains a timeout attribute
        if hasattr(self._socket_pool, "timeout"):
            try:
                res = self._sock_exact_recv(1)
            except self._socket_pool.timeout:
                return None
        else:  # socketpool, esp32spi
            try:
                res = self._sock_exact_recv(1)

For now, though, I think this is an OK temporary change and will cause clients to poll faster until we resolve why the socket is rcv'ing a bytearray on some clients.

flavio-fernandes commented 1 year ago

hi @dhalbert . Thank you for opening this issue! A change in behavior I observe with recent MiniMQTT is that the client.loop() : https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/blob/b707805400fca9b2d49373c72bbf510edda6c209/adafruit_minimqtt/adafruit_minimqtt.py#L837 is now blocking until "something happened". In the past, calling it would return right away if there was no work for it to do. In my experiments, my work around is to provide a small timeout parameter like this:

https://github.com/flavio-fernandes/pyportal_station/blob/53e54c29becb89dc946eede747f6a32022e7ec4a/code.py#L470-L471

What do you think? In my humble opinion, timeout=0 should remain the non-blocking API it used to be, so other things could also happen in the main loop of the circuit python application.

brentru commented 1 year ago

What do you think? In my humble opinion, timeout=0 should remain the non-blocking API it used to be, so other things could also happen in the main loop of the circuit python application.

I think so too, this is proposed within https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/issues/142