adafruit / Adafruit_CircuitPython_MiniMQTT

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

Recurring exception in loop() function #177

Open heximcz opened 9 months ago

heximcz commented 9 months ago

After updating MiniMQTT from version 7.3.2 to 7.4.1, I have a problem with the loop() function, which, upon closer investigation, throws an MMQTTException (this issue occurs every second call). The exact link where the error occurs is here: L1035. For my purposes, I am modified the line to return an error.

raise MMQTTException(f"OSError: error: {error}, errno: {error.errno}.")

Here is a snippet from the testing code:

    try:
        # check if subscribes is enabled
        if mqtt.is_subscriber():
            try: 
                mqtt.mqtt_client.loop()
            except MQTT.MMQTTException as e:
                print('MQTTException ...')
                print(e)
            else:
               print ('Loop OK ...')

        # BME680
        pub_data = dict({})
        pub_data["temperature"], \
            pub_data["humidity"], \
            pub_data["pressure"], \
            pub_data["gas"], \
            pub_data["altitude"], \
            pub_data["dewpoint"] = bme680.get_measurement(dew_point=True)

        # pub values from sensor
        mqtt.pub(pub_data)

        # wait one minute
        time.sleep(60)
    except KeyboardInterrupt as e:
        print("Keyboard exit!")
        import sys
        sys.exit()
    except:
        microcontroller.reset()

Here is the output from Thonny's debugging console:

Attempting to connect to broker.
Connected to MQTT Broker!
Flags: 0
RC: 0
Subscribed to <topic> with QOS level 0

MQTTException ...
OSError: error: -116, errno: -116.
RAW T: 34.2737, CPU T: 31.3517
T: 30.7, RH: 100, hPa: 642, Gas: 430446, Alt: 347, Dew: 30.7
Published to <topic> with PID 1

Loop OK ...
RAW T: 30.9062, CPU T: 31.3517
T: 27.6, RH: 51, hPa: 1018, Gas: 482123, Alt: 218, Dew: 16.6
Published to <topic> with PID 1

MQTTException ...
OSError: error: -116, errno: -116.
RAW T: 29.5876, CPU T: 30.8835
T: 26.4, RH: 55, hPa: 1018, Gas: 449328, Alt: 218, Dew: 16.6
Published to <topic> with PID 1

...

In version 7.3.2, the loop() function worked without any issues. From what I have investigated, it appears that the error is not affected by whether I am using the original CircuitPython 8.0.5 or the latest version 8.2.6.

Links to my complete example code and the MiniMQTT wrapper.

Hardware: Raspberry Pico W

Broker: Mosquitto 2.0.18

Can I modify my code as I'm writing below, but it doesn't seem very elegant to me, especially since it worked in the previous version.

try:
    mqtt.mqtt_client.loop()
except MQTT.MMQTTException as e:
    pass       

Thank you and have a great day!

vladak commented 8 months ago

The negative errno value was reported on https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/issues/101#issuecomment-1281650450 and supposedly fixed in CP 8.0.0 beta specifically for Pico W (https://github.com/adafruit/Adafruit_CircuitPython_MiniMQTT/issues/101#issuecomment-1281728775).

heximcz commented 7 months ago

Hello Vladak, I don't have a problem with CP. A newer version of Adafruit_CircuitPython_MiniMQTT than 7.3.2 does not work for me. Now I try the latest version of CP and Adafruit_CircuitPython_MiniMQTT and the problem is still the same. I had to revert to Adafruit_CircuitPython_MiniMQTT 7.3.2.

schaefer01 commented 7 months ago

in loop() the call to receive generates an exception from if nothing is received but its ok for nothing to be received if nothing was sent.

loop() ->_wait_for_msg() ->_sock_exact_recv(1

I'm going to patch by adding a parameter to _wait_for_msg() to return silently if there's no data received and only set this in the loop call