@@ -115,33 +115,32 @@ def __init__(self, socket, broker, port=None, username=None,
115
115
if port is not None :
116
116
self .port = port
117
117
# session identifiers
118
- self ._user = username
118
+ self .user = username
119
119
# [MQTT-3.1.3.5]
120
- self ._pass = password
121
- if self ._pass is not None and len (password .encode ('utf-8' )) > MQTT_TOPIC_LENGTH_LIMIT :
120
+ self .password = password
121
+ if self .password is not None and len (password .encode ('utf-8' )) > MQTT_TOPIC_LENGTH_LIMIT :
122
122
raise MMQTTException ('Password length is too large.' )
123
123
if client_id is not None :
124
124
# user-defined client_id MAY allow client_id's > 23 bytes or
125
125
# non-alpha-numeric characters
126
- self ._client_id = client_id
126
+ self .client_id = client_id
127
127
else :
128
128
# assign a unique client_id
129
- self ._client_id = 'cpy{0}{1}' .format (microcontroller .cpu .uid [randint (0 , 15 )],
130
- randint (0 , 9 ))
129
+ self .client_id = 'cpy{0}{1}' .format (microcontroller .cpu .uid [randint (0 , 15 )],
130
+ randint (0 , 9 ))
131
131
# generated client_id's enforce spec.'s length rules
132
- if len (self ._client_id ) > 23 or not self ._client_id :
132
+ if len (self .client_id ) > 23 or not self .client_id :
133
133
raise ValueError ('MQTT Client ID must be between 1 and 23 bytes' )
134
- self ._logger = None
134
+ self .keep_alive = keep_alive
135
+ self .user_data = None
136
+ self .logger = None
135
137
if log is True :
136
- self ._logger = logging .getLogger ('log' )
137
- self ._logger .setLevel (logging .INFO )
138
+ self .logger = logging .getLogger ('log' )
139
+ self .logger .setLevel (logging .INFO )
138
140
self ._sock = None
139
141
self ._is_connected = False
140
142
self ._msg_size_lim = MQTT_MSG_SZ_LIM
141
- self .packet_id = 0
142
- self ._keep_alive = keep_alive
143
143
self ._pid = 0
144
- self ._user_data = None
145
144
self ._timestamp = 0
146
145
# List of subscribed topics, used for tracking
147
146
self ._subscribed_topics = []
@@ -177,8 +176,8 @@ def last_will(self, topic=None, message=None, qos=0, retain=False):
177
176
raise MMQTTException ('Last Will should be defined before connect() is called.' )
178
177
if qos < 0 or qos > 2 :
179
178
raise MMQTTException ("Invalid QoS level, must be between 0 and 2." )
180
- if self ._logger is not None :
181
- self ._logger .debug ('Setting last will properties' )
179
+ if self .logger is not None :
180
+ self .logger .debug ('Setting last will properties' )
182
181
self ._lw_qos = qos
183
182
self ._lw_topic = topic
184
183
self ._lw_msg = message
@@ -190,14 +189,14 @@ def connect(self, clean_session=True):
190
189
:param bool clean_session: Establishes a persistent session.
191
190
"""
192
191
self ._set_interface ()
193
- if self ._logger is not None :
194
- self ._logger .debug ('Creating new socket' )
192
+ if self .logger is not None :
193
+ self .logger .debug ('Creating new socket' )
195
194
self ._sock = self ._socket .socket ()
196
195
self ._sock .settimeout (10 )
197
196
if self .port == 8883 :
198
197
try :
199
- if self ._logger is not None :
200
- self ._logger .debug ('Attempting to establish secure MQTT connection...' )
198
+ if self .logger is not None :
199
+ self .logger .debug ('Attempting to establish secure MQTT connection...' )
201
200
self ._sock .connect ((self .broker , self .port ), TLS_MODE )
202
201
except RuntimeError :
203
202
raise MMQTTException ("Invalid broker address defined." )
@@ -207,8 +206,8 @@ def connect(self, clean_session=True):
207
206
else :
208
207
addr = (self .broker , self .port )
209
208
try :
210
- if self ._logger is not None :
211
- self ._logger .debug ('Attempting to establish insecure MQTT connection...' )
209
+ if self .logger is not None :
210
+ self .logger .debug ('Attempting to establish insecure MQTT connection...' )
212
211
#self._sock.connect((self.broker, self.port), TCP_MODE)
213
212
self ._sock .connect (addr , TCP_MODE )
214
213
except RuntimeError as e :
@@ -223,14 +222,14 @@ def connect(self, clean_session=True):
223
222
var_header [6 ] = clean_session << 1
224
223
225
224
# Set up variable header and remaining_length
226
- remaining_length = 12 + len (self ._client_id )
227
- if self ._user is not None :
228
- remaining_length += 2 + len (self ._user ) + 2 + len (self ._pass )
225
+ remaining_length = 12 + len (self .client_id )
226
+ if self .user is not None :
227
+ remaining_length += 2 + len (self .user ) + 2 + len (self .password )
229
228
var_header [6 ] |= 0xC0
230
- if self ._keep_alive :
231
- assert self ._keep_alive < MQTT_TOPIC_LENGTH_LIMIT
232
- var_header [7 ] |= self ._keep_alive >> 8
233
- var_header [8 ] |= self ._keep_alive & 0x00FF
229
+ if self .keep_alive :
230
+ assert self .keep_alive < MQTT_TOPIC_LENGTH_LIMIT
231
+ var_header [7 ] |= self .keep_alive >> 8
232
+ var_header [8 ] |= self .keep_alive & 0x00FF
234
233
if self ._lw_topic :
235
234
remaining_length += 2 + len (self ._lw_topic ) + 2 + len (self ._lw_msg )
236
235
var_header [6 ] |= 0x4 | (self ._lw_qos & 0x1 ) << 3 | (self ._lw_qos & 0x2 ) << 3
@@ -254,25 +253,25 @@ def connect(self, clean_session=True):
254
253
fixed_header .append (remaining_length )
255
254
fixed_header .append (0x00 )
256
255
257
- if self ._logger is not None :
258
- self ._logger .debug ('Sending CONNECT to broker' )
259
- self ._logger .debug ('Fixed Header: {}\n Variable Header: {}' .format (fixed_header ,
260
- var_header ))
256
+ if self .logger is not None :
257
+ self .logger .debug ('Sending CONNECT to broker' )
258
+ self .logger .debug ('Fixed Header: {}\n Variable Header: {}' .format (fixed_header ,
259
+ var_header ))
261
260
self ._sock .write (fixed_header )
262
261
self ._sock .write (var_header )
263
262
# [MQTT-3.1.3-4]
264
- self ._send_str (self ._client_id )
263
+ self ._send_str (self .client_id )
265
264
if self ._lw_topic :
266
265
# [MQTT-3.1.3-11]
267
266
self ._send_str (self ._lw_topic )
268
267
self ._send_str (self ._lw_msg )
269
- if self ._user is None :
270
- self ._user = None
268
+ if self .user is None :
269
+ self .user = None
271
270
else :
272
- self ._send_str (self ._user )
273
- self ._send_str (self ._pass )
274
- if self ._logger is not None :
275
- self ._logger .debug ('Receiving CONNACK packet from broker' )
271
+ self ._send_str (self .user )
272
+ self ._send_str (self .password )
273
+ if self .logger is not None :
274
+ self .logger .debug ('Receiving CONNACK packet from broker' )
276
275
while True :
277
276
op = self ._wait_for_msg ()
278
277
if op == 32 :
@@ -283,34 +282,34 @@ def connect(self, clean_session=True):
283
282
self ._is_connected = True
284
283
result = rc [0 ] & 1
285
284
if self .on_connect is not None :
286
- self .on_connect (self , self ._user_data , result , rc [2 ])
285
+ self .on_connect (self , self .user_data , result , rc [2 ])
287
286
return result
288
287
289
288
def disconnect (self ):
290
289
"""Disconnects the MiniMQTT client from the MQTT broker.
291
290
"""
292
291
self .is_connected ()
293
- if self ._logger is not None :
294
- self ._logger .debug ('Sending DISCONNECT packet to broker' )
292
+ if self .logger is not None :
293
+ self .logger .debug ('Sending DISCONNECT packet to broker' )
295
294
self ._sock .write (MQTT_DISCONNECT )
296
- if self ._logger is not None :
297
- self ._logger .debug ('Closing socket' )
295
+ if self .logger is not None :
296
+ self .logger .debug ('Closing socket' )
298
297
self ._sock .close ()
299
298
self ._is_connected = False
300
299
self ._subscribed_topics = None
301
300
if self .on_disconnect is not None :
302
- self .on_disconnect (self , self ._user_data , 0 )
301
+ self .on_disconnect (self , self .user_data , 0 )
303
302
304
303
def ping (self ):
305
304
"""Pings the MQTT Broker to confirm if the broker is alive or if
306
305
there is an active network connection.
307
306
"""
308
307
self .is_connected ()
309
- if self ._logger is not None :
310
- self ._logger .debug ('Sending PINGREQ' )
308
+ if self .logger is not None :
309
+ self .logger .debug ('Sending PINGREQ' )
311
310
self ._sock .write (MQTT_PINGREQ )
312
- if self ._logger is not None :
313
- self ._logger .debug ('Checking PINGRESP' )
311
+ if self .logger is not None :
312
+ self .logger .debug ('Checking PINGRESP' )
314
313
while True :
315
314
op = self ._wait_for_msg (0.5 )
316
315
if op == 208 :
@@ -373,23 +372,23 @@ def publish(self, topic, msg, retain=False, qos=0):
373
372
sz >>= 7
374
373
i += 1
375
374
pkt [i ] = sz
376
- if self ._logger is not None :
377
- self ._logger .debug ('Sending PUBLISH\n Topic: {0}\n Msg: {1}\
375
+ if self .logger is not None :
376
+ self .logger .debug ('Sending PUBLISH\n Topic: {0}\n Msg: {1}\
378
377
\n QoS: {2}\n Retain? {3}' .format (topic , msg , qos , retain ))
379
378
self ._sock .write (pkt )
380
379
self ._send_str (topic )
381
380
if qos == 0 :
382
381
if self .on_publish is not None :
383
- self .on_publish (self , self ._user_data , topic , self ._pid )
382
+ self .on_publish (self , self .user_data , topic , self ._pid )
384
383
if qos > 0 :
385
384
self ._pid += 1
386
385
pid = self ._pid
387
386
struct .pack_into ("!H" , pkt , 0 , pid )
388
387
self ._sock .write (pkt )
389
388
if self .on_publish is not None :
390
- self .on_publish (self , self ._user_data , topic , pid )
391
- if self ._logger is not None :
392
- self ._logger .debug ('Sending PUBACK' )
389
+ self .on_publish (self , self .user_data , topic , pid )
390
+ if self .logger is not None :
391
+ self .logger .debug ('Sending PUBACK' )
393
392
self ._sock .write (msg )
394
393
if qos == 1 :
395
394
while True :
@@ -401,12 +400,12 @@ def publish(self, topic, msg, retain=False, qos=0):
401
400
rcv_pid = rcv_pid [0 ] << 0x08 | rcv_pid [1 ]
402
401
if pid == rcv_pid :
403
402
if self .on_publish is not None :
404
- self .on_publish (self , self ._user_data , topic , rcv_pid )
403
+ self .on_publish (self , self .user_data , topic , rcv_pid )
405
404
return
406
405
elif qos == 2 :
407
406
assert 0
408
407
if self .on_publish is not None :
409
- self .on_publish (self , self ._user_data , topic , rcv_pid )
408
+ self .on_publish (self , self .user_data , topic , rcv_pid )
410
409
411
410
def subscribe (self , topic , qos = 0 ):
412
411
"""Subscribes to a topic on the MQTT Broker.
@@ -466,9 +465,9 @@ def subscribe(self, topic, qos=0):
466
465
topic_size = len (t ).to_bytes (2 , 'big' )
467
466
qos_byte = q .to_bytes (1 , 'big' )
468
467
packet += topic_size + t + qos_byte
469
- if self ._logger is not None :
468
+ if self .logger is not None :
470
469
for t , q in topics :
471
- self ._logger .debug ('SUBSCRIBING to topic {0} with QoS {1}' .format (t , q ))
470
+ self .logger .debug ('SUBSCRIBING to topic {0} with QoS {1}' .format (t , q ))
472
471
self ._sock .write (packet )
473
472
while True :
474
473
op = self ._wait_for_msg ()
@@ -479,7 +478,7 @@ def subscribe(self, topic, qos=0):
479
478
raise MMQTTException ('SUBACK Failure!' )
480
479
for t , q in topics :
481
480
if self .on_subscribe is not None :
482
- self .on_subscribe (self , self ._user_data , t , q )
481
+ self .on_subscribe (self , self .user_data , t , q )
483
482
self ._subscribed_topics .append (t )
484
483
return
485
484
@@ -521,12 +520,12 @@ def unsubscribe(self, topic):
521
520
for t in topics :
522
521
topic_size = len (t ).to_bytes (2 , 'big' )
523
522
packet += topic_size + t
524
- if self ._logger is not None :
523
+ if self .logger is not None :
525
524
for t in topics :
526
- self ._logger .debug ('UNSUBSCRIBING from topic {0}.' .format (t ))
525
+ self .logger .debug ('UNSUBSCRIBING from topic {0}.' .format (t ))
527
526
self ._sock .write (packet )
528
- if self ._logger is not None :
529
- self ._logger .debug ('Waiting for UNSUBACK...' )
527
+ if self .logger is not None :
528
+ self .logger .debug ('Waiting for UNSUBACK...' )
530
529
while True :
531
530
op = self ._wait_for_msg ()
532
531
if op == 176 :
@@ -536,7 +535,7 @@ def unsubscribe(self, topic):
536
535
assert return_code [1 ] == packet_id_bytes [0 ] and return_code [2 ] == packet_id_bytes [1 ]
537
536
for t in topics :
538
537
if self .on_unsubscribe is not None :
539
- self .on_unsubscribe (self , self ._user_data , t , self ._pid )
538
+ self .on_unsubscribe (self , self .user_data , t , self ._pid )
540
539
self ._subscribed_topics .remove (t )
541
540
return
542
541
@@ -558,12 +557,12 @@ def reconnect_socket(self):
558
557
"""Re-establishes the socket's connection with the MQTT broker.
559
558
"""
560
559
try :
561
- if self ._logger is not None :
562
- self ._logger .debug ("Attempting to reconnect with MQTT Broker..." )
560
+ if self .logger is not None :
561
+ self .logger .debug ("Attempting to reconnect with MQTT Broker..." )
563
562
self .reconnect ()
564
563
except RuntimeError as err :
565
- if self ._logger is not None :
566
- self ._logger .debug ('Failed to reconnect with MQTT Broker, retrying...' , err )
564
+ if self .logger is not None :
565
+ self .logger .debug ('Failed to reconnect with MQTT Broker, retrying...' , err )
567
566
time .sleep (1 )
568
567
self .reconnect_socket ()
569
568
@@ -572,12 +571,12 @@ def reconnect_wifi(self):
572
571
"""
573
572
while not self .is_wifi_connected :
574
573
try :
575
- if self ._logger is not None :
576
- self ._logger .debug ('Connecting to WiFi AP...' )
574
+ if self .logger is not None :
575
+ self .logger .debug ('Connecting to WiFi AP...' )
577
576
self ._wifi .connect ()
578
577
except (RuntimeError , ValueError ):
579
- if self ._logger is not None :
580
- self ._logger .debug ('Failed to reset WiFi module, retrying...' )
578
+ if self .logger is not None :
579
+ self .logger .debug ('Failed to reset WiFi module, retrying...' )
581
580
time .sleep (1 )
582
581
# we just reconnected, is the socket still connected?
583
582
if not self .is_sock_connected :
@@ -587,14 +586,14 @@ def reconnect(self, resub_topics=True):
587
586
"""Attempts to reconnect to the MQTT broker.
588
587
:param bool resub_topics: Resubscribe to previously subscribed topics.
589
588
"""
590
- if self ._logger is not None :
591
- self ._logger .debug ('Attempting to reconnect with MQTT broker' )
589
+ if self .logger is not None :
590
+ self .logger .debug ('Attempting to reconnect with MQTT broker' )
592
591
self .connect ()
593
- if self ._logger is not None :
594
- self ._logger .debug ('Reconnected with broker' )
592
+ if self .logger is not None :
593
+ self .logger .debug ('Reconnected with broker' )
595
594
if resub_topics :
596
- if self ._logger is not None :
597
- self ._logger .debug ('Attempting to resubscribe to previously subscribed topics.' )
595
+ if self .logger is not None :
596
+ self .logger .debug ('Attempting to resubscribe to previously subscribed topics.' )
598
597
while self ._subscribed_topics :
599
598
feed = self ._subscribed_topics .pop ()
600
599
self .subscribe (feed )
@@ -628,10 +627,10 @@ def loop(self):
628
627
if self ._timestamp == 0 :
629
628
self ._timestamp = time .monotonic ()
630
629
current_time = time .monotonic ()
631
- if current_time - self ._timestamp >= self ._keep_alive :
630
+ if current_time - self ._timestamp >= self .keep_alive :
632
631
# Handle KeepAlive by expecting a PINGREQ/PINGRESP from the server
633
- if self ._logger is not None :
634
- self ._logger .debug ('KeepAlive period elapsed - requesting a PINGRESP from the server...' )
632
+ if self .logger is not None :
633
+ self .logger .debug ('KeepAlive period elapsed - requesting a PINGRESP from the server...' )
635
634
self .ping ()
636
635
self ._timestamp = 0
637
636
self ._sock .settimeout (0.1 )
@@ -753,22 +752,22 @@ def attach_logger(self, logger_name='log'):
753
752
"""Initializes and attaches a logger to the MQTTClient.
754
753
:param str logger_name: Name of the logger instance
755
754
"""
756
- self ._logger = logging .getLogger (logger_name )
757
- self ._logger .setLevel (logging .INFO )
755
+ self .logger = logging .getLogger (logger_name )
756
+ self .logger .setLevel (logging .INFO )
758
757
759
758
def set_logger_level (self , log_level ):
760
759
"""Sets the level of the logger, if defined during init.
761
760
:param string log_level: Level of logging to output to the REPL.
762
761
"""
763
- if self ._logger is None :
762
+ if self .logger is None :
764
763
raise MMQTTException ('No logger attached - did you create it during initialization?' )
765
764
if log_level == 'DEBUG' :
766
- self ._logger .setLevel (logging .DEBUG )
765
+ self .logger .setLevel (logging .DEBUG )
767
766
elif log_level == 'INFO' :
768
- self ._logger .setLevel (logging .INFO )
767
+ self .logger .setLevel (logging .INFO )
769
768
elif log_level == 'WARNING' :
770
- self ._logger .setLevel (logging .WARNING )
769
+ self .logger .setLevel (logging .WARNING )
771
770
elif log_level == 'ERROR' :
772
- self ._logger .setLevel (logging .CRITICIAL )
771
+ self .logger .setLevel (logging .CRITICIAL )
773
772
else :
774
773
raise MMQTTException ('Incorrect logging level provided!' )
0 commit comments