@@ -238,31 +238,83 @@ def connect(self, clean_session=True):
238
238
self ._sock .connect (addr , TCP_MODE )
239
239
except RuntimeError as e :
240
240
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 )
245
258
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
248
261
if self ._keep_alive :
249
262
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
252
265
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
256
271
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
260
297
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
+
262
305
if self ._logger is not None :
263
306
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 ]))
266
318
# [MQTT-3.1.3-4]
267
319
self ._send_str (self ._client_id )
268
320
if self ._lw_topic :
@@ -703,4 +755,4 @@ def set_logger_level(self, log_level):
703
755
elif log_level == 'ERROR' :
704
756
self ._logger .setLevel (logging .CRITICIAL )
705
757
else :
706
- raise MMQTTException ('Incorrect logging level provided!' )
758
+ raise MMQTTException ('Incorrect logging level provided!' )
0 commit comments