diff --git a/umqtt.simple/umqtt/simple.py b/umqtt.simple/umqtt/simple.py index 8216fa5e1..1e3537750 100644 --- a/umqtt.simple/umqtt/simple.py +++ b/umqtt.simple/umqtt/simple.py @@ -1,6 +1,7 @@ import usocket as socket import ustruct as struct from ubinascii import hexlify +import uselect class MQTTException(Exception): pass @@ -26,6 +27,7 @@ def __init__(self, client_id, server, port=0, user=None, password=None, keepaliv self.lw_msg = None self.lw_qos = 0 self.lw_retain = False + self.poller = uselect.poll() def _send_str(self, s): self.sock.write(struct.pack("!H", len(s))) @@ -52,7 +54,7 @@ def set_last_will(self, topic, msg, retain=False, qos=0): self.lw_qos = qos self.lw_retain = retain - def connect(self, clean_session=True): + def connect(self, clean_session=True, timeout=None): self.sock = socket.socket() addr = socket.getaddrinfo(self.server, self.port)[0][-1] self.sock.connect(addr) @@ -83,6 +85,11 @@ def connect(self, clean_session=True): i += 1 premsg[i] = sz + if timeout: # Checking output availability + self.poller.register(self.sock, uselect.POLLOUT) + if not poller.poll(timeout): + raise OSError("Connection request timed out") + self.sock.write(premsg, i + 2) self.sock.write(msg) #print(hex(len(msg)), hexlify(msg, ":")) @@ -93,6 +100,12 @@ def connect(self, clean_session=True): if self.user is not None: self._send_str(self.user) self._send_str(self.pswd) + + if timeout: # Checking input availability + self.poller.modify(self.sock, uselect.POLLIN) + if not poller.poll(timeout): + raise OSError("Connection response timed out") + resp = self.sock.read(4) assert resp[0] == 0x20 and resp[1] == 0x02 if resp[3] != 0:
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: