Skip to content

Commit 1e166ee

Browse files
committed
Reduce reassignments
1 parent 16496fa commit 1e166ee

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

umqtt.simple/umqtt/simple.py

+33-22
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ def __init__(self, client_id, server, port=0, user=None, password=None, keepaliv
1313
port = 8883 if ssl else 1883
1414
self.client_id = client_id
1515
self.sock = None
16-
self.addr = socket.getaddrinfo(server, port)[0][-1]
16+
self.server = server
17+
self.port = port
1718
self.ssl = ssl
1819
self.ssl_params = ssl_params
1920
self.pid = 0
@@ -53,35 +54,45 @@ def set_last_will(self, topic, msg, retain=False, qos=0):
5354

5455
def connect(self, clean_session=True):
5556
self.sock = socket.socket()
57+
self.addr = socket.getaddrinfo(self.server, self.port)[0][-1]
5658
self.sock.connect(self.addr)
5759
if self.ssl:
5860
import ussl
5961
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
60-
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
61-
msg[1] = 10 + 2 + len(self.client_id)
62-
msg[9] = clean_session << 1
62+
sz = 10 + 2 + len(self.client_id)
6363
if self.user is not None:
64-
msg[1] += 2 + len(self.user) + 2 + len(self.pswd)
65-
msg[9] |= 0xC0
64+
sz += 2 + len(self.user) + 2 + len(self.pswd)
65+
if self.lw_topic:
66+
sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
67+
68+
if sz < 128:
69+
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
70+
elif sz < 16384:
71+
msg = bytearray(b"\x10\0\0\0\x04MQTT\x04\x02\0\0")
72+
elif sz < 2097152:
73+
msg = bytearray(b"\x10\0\0\0\0\x04MQTT\x04\x02\0\0")
74+
else:
75+
msg = bytearray(b"\x10\0\0\0\0\0\x04MQTT\x04\x02\0\0")
76+
77+
indexOfSize = 0
78+
while (sz > 0):
79+
enc_byte = sz % 128
80+
sz = int(sz / 128)
81+
if (sz > 0):
82+
enc_byte |= 128
83+
indexOfSize += 1
84+
msg[indexOfSize] = enc_byte
85+
86+
msg[8 + indexOfSize] = clean_session << 1
87+
if self.user is not None:
88+
msg[8 + indexOfSize] |= 0xC0
6689
if self.keepalive:
6790
assert self.keepalive < 65536
68-
msg[10] |= self.keepalive >> 8
69-
msg[11] |= self.keepalive & 0x00FF
91+
msg[9 + indexOfSize] |= self.keepalive >> 8
92+
msg[10 + indexOfSize] |= self.keepalive & 0x00FF
7093
if self.lw_topic:
71-
msg[1] += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
72-
msg[9] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
73-
msg[9] |= self.lw_retain << 5
74-
# fix "remaining length field" for message size over 128
75-
rem_len = msg[1]
76-
enc_bytearray = bytearray()
77-
while (rem_len > 0):
78-
enc_byte = rem_len % 128
79-
rem_len = int(rem_len / 128)
80-
if (rem_len > 0):
81-
enc_byte |= 128
82-
enc_bytearray.append(enc_byte)
83-
msg[1:2] = enc_bytearray
84-
94+
msg[8 + indexOfSize] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
95+
msg[8 + indexOfSize] |= self.lw_retain << 5
8596
self.sock.write(msg)
8697
#print(hex(len(msg)), hexlify(msg, ":"))
8798
self._send_str(self.client_id)

0 commit comments

Comments
 (0)