My python script turns on the Raspberry Pi's WiFi and after a short delay tries to connect with Paho MQTT. If the delay isn't long enough, it fails ungracefully.
I'm using paho-mqtt version
EDIT: I've added the line that starts
status_con = which should have been present already. I do indeed instantiate the client first, then use
.connect() immediately afterward. It's the
.connect() that produces the error.
try: mqtt_client = mqtt.Client(client_id="Luke, I am your client", clean_session=True, userdata=None, transport="tcp") status_con = self.mqtt_client.connect(host=self.mqtt_host_url, keepalive=self.mqtt_keepalive, port=self.mqtt_port) # 5 https://stackoverflow.com/a/35581280/3904031 except: # never gets here! print "connect failed, sleeping for 20 seconds: " time.sleep(20) print " now try again: " mqtt_client = mqtt.Client(client_id="Luke, I'm no longer your client", clean_session=True, userdata=None, transport="tcp")
Instead of being caught by the
try: it errors and gives the following messages
File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 768, in connect return self.reconnect() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 895, in reconnect sock = socket.create_connection((self._host, self._port), source_address=(self._bind_address, 0)) File "/usr/lib/python2.7/socket.py", line 553, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM):gaierror: [Errno -5] No address associated with hostname
If I increase the delay, then it always connects.
Right now my solution is to ping a random internet site every few seconds using
socket until it's working, then trying to connect MQTT but I would still like something that doesn't have such catastrophic results.
So what I would like is for a way to catch the problem without Paho crashing, and only then try again in 10 seconds, and again...
Is there a way to have Paho do this for me, or at least to let me handle the exception with