@@ -181,7 +181,7 @@ def __init__(
181
181
randint (0 , int (time .monotonic () * 100 ) % 1000 ), randint (0 , 99 )
182
182
)
183
183
# generated client_id's enforce spec.'s length rules
184
- 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 :
185
185
raise ValueError ("MQTT Client ID must be between 1 and 23 bytes" )
186
186
187
187
# LWT
@@ -448,16 +448,16 @@ def connect(self, clean_session=True, host=None, port=None, keep_alive=None):
448
448
var_header [6 ] = clean_session << 1
449
449
450
450
# Set up variable header and remaining_length
451
- remaining_length = 12 + len (self .client_id )
451
+ remaining_length = 12 + len (self .client_id . encode ( "utf-8" ) )
452
452
if self ._username :
453
- remaining_length += 2 + len (self ._username ) + 2 + len (self ._password )
453
+ remaining_length += 2 + len (self ._username . encode ( "utf-8" )) + 2 + len (self ._password . encode ( "utf-8" ) )
454
454
var_header [6 ] |= 0xC0
455
455
if self .keep_alive :
456
456
assert self .keep_alive < MQTT_TOPIC_LENGTH_LIMIT
457
457
var_header [7 ] |= self .keep_alive >> 8
458
458
var_header [8 ] |= self .keep_alive & 0x00FF
459
459
if self ._lw_topic :
460
- remaining_length += 2 + len (self ._lw_topic ) + 2 + len (self ._lw_msg )
460
+ remaining_length += 2 + len (self ._lw_topic . encode ( "utf-8" ) ) + 2 + len (self ._lw_msg )
461
461
var_header [6 ] |= 0x4 | (self ._lw_qos & 0x1 ) << 3 | (self ._lw_qos & 0x2 ) << 3
462
462
var_header [6 ] |= self ._lw_retain << 5
463
463
@@ -584,10 +584,10 @@ def publish(self, topic, msg, retain=False, qos=0):
584
584
pub_hdr_fixed = bytearray ([0x30 | retain | qos << 1 ])
585
585
586
586
# variable header = 2-byte Topic length (big endian)
587
- pub_hdr_var = bytearray (struct .pack (">H" , len (topic )))
587
+ pub_hdr_var = bytearray (struct .pack (">H" , len (topic . encode ( "utf-8" ) )))
588
588
pub_hdr_var .extend (topic .encode ("utf-8" )) # Topic name
589
589
590
- remaining_length = 2 + len (msg ) + len (topic )
590
+ remaining_length = 2 + len (msg ) + len (topic . encode ( "utf-8" ) )
591
591
if qos > 0 :
592
592
# packet identifier where QoS level is 1 or 2. [3.3.2.2]
593
593
remaining_length += 2
@@ -666,15 +666,15 @@ def subscribe(self, topic, qos=0):
666
666
topics .append ((t , q ))
667
667
# Assemble packet
668
668
packet_length = 2 + (2 * len (topics )) + (1 * len (topics ))
669
- packet_length += sum (len (topic ) for topic , qos in topics )
669
+ packet_length += sum (len (topic . encode ( "utf-8" ) ) for topic , qos in topics )
670
670
packet_length_byte = packet_length .to_bytes (1 , "big" )
671
671
self ._pid = self ._pid + 1 if self ._pid < 0xFFFF else 1
672
672
packet_id_bytes = self ._pid .to_bytes (2 , "big" )
673
673
# Packet with variable and fixed headers
674
674
packet = MQTT_SUB + packet_length_byte + packet_id_bytes
675
675
# attaching topic and QOS level to the packet
676
676
for t , q in topics :
677
- topic_size = len (t ).to_bytes (2 , "big" )
677
+ topic_size = len (t . encode ( "utf-8" ) ).to_bytes (2 , "big" )
678
678
qos_byte = q .to_bytes (1 , "big" )
679
679
packet += topic_size + t .encode () + qos_byte
680
680
if self .logger :
@@ -715,13 +715,13 @@ def unsubscribe(self, topic):
715
715
)
716
716
# Assemble packet
717
717
packet_length = 2 + (2 * len (topics ))
718
- packet_length += sum (len (topic ) for topic in topics )
718
+ packet_length += sum (len (topic . encode ( "utf-8" ) ) for topic in topics )
719
719
packet_length_byte = packet_length .to_bytes (1 , "big" )
720
720
self ._pid = self ._pid + 1 if self ._pid < 0xFFFF else 1
721
721
packet_id_bytes = self ._pid .to_bytes (2 , "big" )
722
722
packet = MQTT_UNSUB + packet_length_byte + packet_id_bytes
723
723
for t in topics :
724
- topic_size = len (t ).to_bytes (2 , "big" )
724
+ topic_size = len (t . encode ( "utf-8" ) ).to_bytes (2 , "big" )
725
725
packet += topic_size + t .encode ()
726
726
if self .logger :
727
727
for t in topics :
@@ -912,10 +912,11 @@ def _send_str(self, string):
912
912
:param str string: String to write to the socket.
913
913
914
914
"""
915
- self ._sock .send (struct .pack ("!H" , len (string )))
916
915
if isinstance (string , str ):
916
+ self ._sock .send (struct .pack ("!H" , len (string .encode ("utf-8" ))))
917
917
self ._sock .send (str .encode (string , "utf-8" ))
918
918
else :
919
+ self ._sock .send (struct .pack ("!H" , len (string )))
919
920
self ._sock .send (string )
920
921
921
922
@staticmethod
0 commit comments