@@ -13,7 +13,8 @@ def __init__(self, client_id, server, port=0, user=None, password=None, keepaliv
13
13
port = 8883 if ssl else 1883
14
14
self .client_id = client_id
15
15
self .sock = None
16
- self .addr = socket .getaddrinfo (server , port )[0 ][- 1 ]
16
+ self .server = server
17
+ self .port = port
17
18
self .ssl = ssl
18
19
self .ssl_params = ssl_params
19
20
self .pid = 0
@@ -53,35 +54,45 @@ def set_last_will(self, topic, msg, retain=False, qos=0):
53
54
54
55
def connect (self , clean_session = True ):
55
56
self .sock = socket .socket ()
57
+ self .addr = socket .getaddrinfo (self .server , self .port )[0 ][- 1 ]
56
58
self .sock .connect (self .addr )
57
59
if self .ssl :
58
60
import ussl
59
61
self .sock = ussl .wrap_socket (self .sock , ** self .ssl_params )
60
- msg = bytearray (b"\x10 \0 \0 \x04 MQTT\x04 \x02 \0 \0 " )
61
- msg [1 ] = 10 + 2 + len (self .client_id )
62
- msg [9 ] = clean_session << 1
62
+ sz = 10 + 2 + len (self .client_id )
63
63
if self .user is not None :
64
- msg [1 ] += 2 + len (self .user ) + 2 + len (self .pswd )
65
- msg [9 ] |= 0xC0
64
+ sz += 2 + len (self .user ) + 2 + len (self .pswd )
65
+ if self .lw_topic :
66
+ sz += 2 + len (self .lw_topic ) + 2 + len (self .lw_msg )
67
+
68
+ if sz < 128 :
69
+ msg = bytearray (b"\x10 \0 \0 \x04 MQTT\x04 \x02 \0 \0 " )
70
+ elif sz < 16384 :
71
+ msg = bytearray (b"\x10 \0 \0 \0 \x04 MQTT\x04 \x02 \0 \0 " )
72
+ elif sz < 2097152 :
73
+ msg = bytearray (b"\x10 \0 \0 \0 \0 \x04 MQTT\x04 \x02 \0 \0 " )
74
+ else :
75
+ msg = bytearray (b"\x10 \0 \0 \0 \0 \0 \x04 MQTT\x04 \x02 \0 \0 " )
76
+
77
+ indexOfSize = 0
78
+ while (sz > 0 ):
79
+ enc_byte = sz % 128
80
+ sz = int (sz / 128 )
81
+ if (sz > 0 ):
82
+ enc_byte |= 128
83
+ indexOfSize += 1
84
+ msg [indexOfSize ] = enc_byte
85
+
86
+ msg [8 + indexOfSize ] = clean_session << 1
87
+ if self .user is not None :
88
+ msg [8 + indexOfSize ] |= 0xC0
66
89
if self .keepalive :
67
90
assert self .keepalive < 65536
68
- msg [10 ] |= self .keepalive >> 8
69
- msg [11 ] |= self .keepalive & 0x00FF
91
+ msg [9 + indexOfSize ] |= self .keepalive >> 8
92
+ msg [10 + indexOfSize ] |= self .keepalive & 0x00FF
70
93
if self .lw_topic :
71
- msg [1 ] += 2 + len (self .lw_topic ) + 2 + len (self .lw_msg )
72
- msg [9 ] |= 0x4 | (self .lw_qos & 0x1 ) << 3 | (self .lw_qos & 0x2 ) << 3
73
- msg [9 ] |= self .lw_retain << 5
74
- # fix "remaining length field" for message size over 128
75
- rem_len = msg [1 ]
76
- enc_bytearray = bytearray ()
77
- while (rem_len > 0 ):
78
- enc_byte = rem_len % 128
79
- rem_len = int (rem_len / 128 )
80
- if (rem_len > 0 ):
81
- enc_byte |= 128
82
- enc_bytearray .append (enc_byte )
83
- msg [1 :2 ] = enc_bytearray
84
-
94
+ msg [8 + indexOfSize ] |= 0x4 | (self .lw_qos & 0x1 ) << 3 | (self .lw_qos & 0x2 ) << 3
95
+ msg [8 + indexOfSize ] |= self .lw_retain << 5
85
96
self .sock .write (msg )
86
97
#print(hex(len(msg)), hexlify(msg, ":"))
87
98
self ._send_str (self .client_id )
0 commit comments