64
64
_default_sock = None # pylint: disable=invalid-name
65
65
_fake_context = None # pylint: disable=invalid-name
66
66
67
- # Override default len() method
68
- len_overrided = len
69
- def len (object ):
70
- if isinstance (object , str ):
71
- return len_overrided (object .encode ('utf-8' ))
72
- else :
73
- return len_overrided (object )
74
67
75
68
class MMQTTException (Exception ):
76
69
"""MiniMQTT Exception class."""
@@ -188,7 +181,7 @@ def __init__(
188
181
randint (0 , int (time .monotonic () * 100 ) % 1000 ), randint (0 , 99 )
189
182
)
190
183
# generated client_id's enforce spec.'s length rules
191
- if len (self .client_id ) > 23 or not self .client_id :
184
+ if len (self .client_id . encode ( "utf-8" ) ) > 23 or not self .client_id :
192
185
raise ValueError ("MQTT Client ID must be between 1 and 23 bytes" )
193
186
194
187
# LWT
@@ -457,16 +450,16 @@ def connect(self, clean_session=True, host=None, port=None, keep_alive=None):
457
450
var_header [6 ] = clean_session << 1
458
451
459
452
# Set up variable header and remaining_length
460
- remaining_length = 12 + len (self .client_id )
453
+ remaining_length = 12 + len (self .client_id . encode ( "utf-8" ) )
461
454
if self ._username :
462
- remaining_length += 2 + len (self ._username ) + 2 + len (self ._password )
455
+ remaining_length += 2 + len (self ._username . encode ( "utf-8" )) + 2 + len (self ._password . encode ( "utf-8" ) )
463
456
var_header [6 ] |= 0xC0
464
457
if self .keep_alive :
465
458
assert self .keep_alive < MQTT_TOPIC_LENGTH_LIMIT
466
459
var_header [7 ] |= self .keep_alive >> 8
467
460
var_header [8 ] |= self .keep_alive & 0x00FF
468
461
if self ._lw_topic :
469
- remaining_length += 2 + len (self ._lw_topic ) + 2 + len (self ._lw_msg )
462
+ remaining_length += 2 + len (self ._lw_topic . encode ( "utf-8" )) + 2 + len (self ._lw_msg . encode ( "utf-8" ) )
470
463
var_header [6 ] |= 0x4 | (self ._lw_qos & 0x1 ) << 3 | (self ._lw_qos & 0x2 ) << 3
471
464
var_header [6 ] |= self ._lw_retain << 5
472
465
@@ -583,7 +576,7 @@ def publish(self, topic, msg, retain=False, qos=0):
583
576
pass
584
577
else :
585
578
raise MMQTTException ("Invalid message data type." )
586
- if len (msg ) > MQTT_MSG_MAX_SZ :
579
+ if len (msg . encode ( "utf-8" ) ) > MQTT_MSG_MAX_SZ :
587
580
raise MMQTTException ("Message size larger than %d bytes." % MQTT_MSG_MAX_SZ )
588
581
assert (
589
582
0 <= qos <= 1
@@ -593,10 +586,10 @@ def publish(self, topic, msg, retain=False, qos=0):
593
586
pub_hdr_fixed = bytearray ([0x30 | retain | qos << 1 ])
594
587
595
588
# variable header = 2-byte Topic length (big endian)
596
- pub_hdr_var = bytearray (struct .pack (">H" , len (topic )))
589
+ pub_hdr_var = bytearray (struct .pack (">H" , len (topic . encode ( "utf-8" ) )))
597
590
pub_hdr_var .extend (topic .encode ("utf-8" )) # Topic name
598
591
599
- remaining_length = 2 + len (msg ) + len (topic )
592
+ remaining_length = 2 + len (msg . encode ( "utf-8" )) + len (topic . encode ( "utf-8" ) )
600
593
if qos > 0 :
601
594
# packet identifier where QoS level is 1 or 2. [3.3.2.2]
602
595
remaining_length += 2
@@ -675,15 +668,15 @@ def subscribe(self, topic, qos=0):
675
668
topics .append ((t , q ))
676
669
# Assemble packet
677
670
packet_length = 2 + (2 * len (topics )) + (1 * len (topics ))
678
- packet_length += sum (len (topic ) for topic , qos in topics )
671
+ packet_length += sum (len (topic . encode ( "utf-8" ) ) for topic , qos in topics )
679
672
packet_length_byte = packet_length .to_bytes (1 , "big" )
680
673
self ._pid = self ._pid + 1 if self ._pid < 0xFFFF else 1
681
674
packet_id_bytes = self ._pid .to_bytes (2 , "big" )
682
675
# Packet with variable and fixed headers
683
676
packet = MQTT_SUB + packet_length_byte + packet_id_bytes
684
677
# attaching topic and QOS level to the packet
685
678
for t , q in topics :
686
- topic_size = len (t ).to_bytes (2 , "big" )
679
+ topic_size = len (t . encode ( "utf-8" ) ).to_bytes (2 , "big" )
687
680
qos_byte = q .to_bytes (1 , "big" )
688
681
packet += topic_size + t .encode () + qos_byte
689
682
if self .logger :
@@ -724,13 +717,13 @@ def unsubscribe(self, topic):
724
717
)
725
718
# Assemble packet
726
719
packet_length = 2 + (2 * len (topics ))
727
- packet_length += sum (len (topic ) for topic in topics )
720
+ packet_length += sum (len (topic . encode ( "utf-8" ) ) for topic in topics )
728
721
packet_length_byte = packet_length .to_bytes (1 , "big" )
729
722
self ._pid = self ._pid + 1 if self ._pid < 0xFFFF else 1
730
723
packet_id_bytes = self ._pid .to_bytes (2 , "big" )
731
724
packet = MQTT_UNSUB + packet_length_byte + packet_id_bytes
732
725
for t in topics :
733
- topic_size = len (t ).to_bytes (2 , "big" )
726
+ topic_size = len (t . encode ( "utf-8" ) ).to_bytes (2 , "big" )
734
727
packet += topic_size + t .encode ()
735
728
if self .logger :
736
729
for t in topics :
@@ -921,7 +914,7 @@ def _send_str(self, string):
921
914
:param str string: String to write to the socket.
922
915
923
916
"""
924
- self ._sock .send (struct .pack ("!H" , len (string )))
917
+ self ._sock .send (struct .pack ("!H" , len (string . encode ( "utf-8" ) )))
925
918
if isinstance (string , str ):
926
919
self ._sock .send (str .encode (string , "utf-8" ))
927
920
else :
0 commit comments