@@ -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