Skip to content

Commit bc99b3e

Browse files
author
brentru
committed
incorporate new relength encoding scheme
1 parent 2fedb12 commit bc99b3e

File tree

1 file changed

+70
-18
lines changed

1 file changed

+70
-18
lines changed

adafruit_minimqtt.py

Lines changed: 70 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -238,31 +238,83 @@ def connect(self, clean_session=True):
238238
self._sock.connect(addr, TCP_MODE)
239239
except RuntimeError as e:
240240
raise MMQTTException("Invalid broker address defined.", e)
241-
premsg = MQTT_CON
242-
msg = MQTT_CON_HEADER
243-
msg[6] = clean_session << 1
244-
sz = 12 + len(self._client_id)
241+
242+
# Google core IOT Premsg
243+
#fixed_header = bytearray(b"\x10\x00\x00\x00")
244+
# Adafruit IO
245+
#fixed_header = bytearray(b'\x10\x00\x00')
246+
247+
# Fixed Header
248+
fixed_header = bytearray()
249+
fixed_header.append(0x10)
250+
251+
# Variable Header
252+
var_header = MQTT_CON_HEADER
253+
var_header[6] = clean_session << 1
254+
255+
256+
# 12 + (protocol information, we're not supporting MQTTv311..)
257+
remaining_length = 12 + len(self._client_id)
245258
if self._user is not None:
246-
sz += 2 + len(self._user) + 2 + len(self._pass)
247-
msg[6] |= 0xC0
259+
remaining_length += 2 + len(self._user) + 2 + len(self._pass)
260+
var_header[6] |= 0xC0
248261
if self._keep_alive:
249262
assert self._keep_alive < MQTT_TOPIC_LENGTH_LIMIT
250-
msg[7] |= self._keep_alive >> 8
251-
msg[8] |= self._keep_alive & 0x00FF
263+
var_header[7] |= self._keep_alive >> 8
264+
var_header[8] |= self._keep_alive & 0x00FF
252265
if self._lw_topic:
253-
sz += 2 + len(self._lw_topic) + 2 + len(self._lw_msg)
254-
msg[6] |= 0x4 | (self._lw_qos & 0x1) << 3 | (self._lw_qos & 0x2) << 3
255-
msg[6] |= self._lw_retain << 5
266+
remaining_length += 2 + len(self._lw_topic) + 2 + len(self._lw_msg)
267+
var_header[6] |= 0x4 | (self._lw_qos & 0x1) << 3 | (self._lw_qos & 0x2) << 3
268+
var_header[6] |= self._lw_retain << 5
269+
270+
# Remaining length
256271
i = 1
257-
while sz > 0x7f:
258-
premsg[i] = (sz & 0x7f) | 0x80
259-
sz >>= 7
272+
if remaining_length > 0x7f:
273+
# Calculate Remaining Length [2.2.3]
274+
remaining_bytes = bytearray()
275+
while remaining_length > 0:
276+
encoded_byte = remaining_length % 0x80
277+
remaining_length = remaining_length // 0x80
278+
# if there is more data to encode, set the top bit of the byte
279+
if remaining_length > 0:
280+
encoded_byte |= 0x80
281+
print('enc byte: ', encoded_byte)
282+
remaining_bytes.append(encoded_byte)
283+
fixed_header.append(encoded_byte)
284+
print('_prl: packet', fixed_header)
285+
print('prl, rel.length: ', remaining_length)
286+
print('prl, byte: ', encoded_byte)
287+
i+=1
288+
#fixed_header[i] = 0x00
289+
fixed_header.append(0x00)
290+
291+
"""
292+
# Old, non-working MMQT/UMQTT IMPL
293+
i = 1
294+
while remaining_length > 0x7f:
295+
fixed_header[i] = (remaining_length & 0x7f) | 0x80
296+
remaining_length >>= 7
260297
i += 1
261-
premsg[i] = sz
298+
fixed_header[i] = remaining_length
299+
print("i: ", i)
300+
print(fixed_header)
301+
print(remaining_length)
302+
"""
303+
304+
262305
if self._logger is not None:
263306
self._logger.debug('Sending CONNECT packet to broker')
264-
self._sock.write(premsg)
265-
self._sock.write(msg)
307+
print("---fixed_header----")
308+
print("rel len: ", remaining_length)
309+
print(fixed_header)
310+
self._sock.write(fixed_header)
311+
#print("remaining len: ", fixed_header[i])
312+
print("---var_header----")
313+
print(var_header)
314+
self._sock.write(var_header)
315+
print("Keepalive Bytes:")
316+
print(hex(var_header[7]))
317+
print(hex(var_header[8]))
266318
# [MQTT-3.1.3-4]
267319
self._send_str(self._client_id)
268320
if self._lw_topic:
@@ -703,4 +755,4 @@ def set_logger_level(self, log_level):
703755
elif log_level == 'ERROR':
704756
self._logger.setLevel(logging.CRITICIAL)
705757
else:
706-
raise MMQTTException('Incorrect logging level provided!')
758+
raise MMQTTException('Incorrect logging level provided!')

0 commit comments

Comments
 (0)