Page 1 of 1

"SUB client" of umqtt simple.py crashes on EVERY message sent by another simple.py "PUB client"

Posted: Fri Jul 19, 2019 3:12 pm
by dirkpy
I have 2 ESP8266's on my private mosquitto server, one as a pub and one as a sub, using umqtt (simple.py) using the standard github example code (see hereunder)
Issue:
When the ESP-pub publishes a message, the receiving ESP-sub crashes on EVERY message sent by the ESP-pub - REGARDLESS THE TOPIC - on line 172 of simple.py ( if res == b"": raise OSError(-1) )
Other MQTT clients in the network (mosquitto under ubuntu, Paho on different Pi's, Domoticz mqtt client) show and process the published message by the ESP-pub correctly and, the other way around, the ESP-sub shows the messages from all other mqtt publishers in the network without a problem. So the only problem is ANY message sent from an ESP-pub, received by an ESP-sub, regardless the topic or the message format. Very strange....
I tried zillions of configurations with different formats of the topic, message and versions of micropython. It ALWAYS crashes simple.py on line 172.
The mosquitto log on the server doesn't show anything unusual.
Can somebody reproduce this issue or put me on the right (debug-)track? (I DO miss some logging/debug possibilities in umqtt.....)

Environment (very stable):
Private MQTT server mosquitto under Ubuntu 16.04 (running without a glitch for over a year with several Pi's using Paho as MQTT clients)
MicroPython version esp8266-20190529-v1.11 running on two ESP8266's

example code PUB side:

from umqtt.simple import MQTTClient
def main(server="192.168.xx.xx"):
c = MQTTClient("umqtt_client", server)
c.connect()
c.publish(b"foo_topic", b"hello")
c.disconnect()
if __name__ == "__main__":
main()

example code SUB side:

import time
from umqtt.simple import MQTTClient
# Received messages from subscriptions will be delivered to this callback
def sub_cb(topic, msg):
print((topic, msg))
def main(server="192.168.xx.xx"):
c = MQTTClient("umqtt_client", server)
c.set_callback(sub_cb)
c.connect()
c.subscribe(b"foo_topic")
while True:
if True:
# Blocking wait for message
c.wait_msg()
else:
# Non-blocking wait for message
c.check_msg()
# Then need to sleep to avoid 100% CPU usage (in a real
# app other useful actions would be performed instead)
time.sleep(1)
c.disconnect()

if __name__ == "__main__":
main()

the only modification of simple.py is the line with the login credentials:
def __init__(self, client_id, server, port=1883, user="xxxxx", password="yyyyyyy", keepalive=0, ssl=False, ssl_params={}):

The piece of code in simple.py that generates the OSError:
def wait_msg(self):
res = self.sock.read(1)
self.sock.setblocking(True)
if res is None:
return None
if res == b"": <<<<<<<<<<< line 172
raise OSError(-1)
if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0]
assert sz == 0
return None

Thanks for your help!
Dirkpy

Re: "SUB client" of umqtt simple.py crashes on EVERY message sent by another simple.py "PUB client"

Posted: Fri Jul 19, 2019 5:01 pm
by Frida
You must have different client id on every esp for it to work.

Code: Select all

c = MQTTClient("umqtt_client", server) on your PUB
c = MQTTClient("umqtt_client", server) on your SUB
Chance "umqtt_client" to somewhat different on one of your ESP.

Re: "SUB client" of umqtt simple.py crashes on EVERY message sent by another simple.py "PUB client"

Posted: Sat Jul 20, 2019 5:24 pm
by dirkpy
Thanks very much for your reaction Frida!
I didn't realise that it has to be different client id's. Sounds very logic.
I'll try and let you know.
Dirkpy

Re: "SUB client" of umqtt simple.py crashes on EVERY message sent by another simple.py "PUB client"

Posted: Sun Jul 21, 2019 9:08 pm
by dirkpy
Works and what a simple solution!
Thanks again.
Dickpy