@@ -160,14 +160,32 @@ def __init__(self, serial_port: str, network: str, apn: str, baud_rate: int):
160
160
"""
161
161
self ._network = network
162
162
self ._apn = apn
163
- self ._serial_at = serial .Serial (serial_port , baud_rate )
163
+ self ._serial_at = serial .Serial (serial_port , baud_rate , )
164
164
self ._serial_at .flush ()
165
165
self ._sched = Schedular ("LTE Connection Schedular" )
166
166
self ._sched .add_timer (0.001 , 0.0 , self ._run_processing )
167
167
self ._sched .add_timer (1.0 , 0.25 , self ._run_one_second_module_tasks )
168
168
self ._sched .add_timer (1.0 , 0.5 , self ._run_one_second_mqtt_tasks )
169
169
self ._sched .add_timer (1.0 , 0.75 , self ._run_one_second_gnss_tasks )
170
170
171
+ def write_serial_buffer (self , data : bytes , chunk_size = 64 ):
172
+ """
173
+ Writes data to a serial port while preventing buffer overrun.
174
+
175
+ Args:
176
+ - data: Data to be written to the serial port.
177
+ - chunk_size: Maximum chunk size to write at a time.
178
+ """
179
+ total_bytes_written = 0
180
+ while total_bytes_written < len (data ):
181
+ chunk = data [total_bytes_written : total_bytes_written + chunk_size ]
182
+ bytes_written = self ._serial_at .write (chunk )
183
+ if bytes_written is not None :
184
+ total_bytes_written += bytes_written
185
+ # Optional: Add a delay if needed between chunks
186
+ time .sleep (0.1 )
187
+ return total_bytes_written
188
+
171
189
def close (self ):
172
190
"""Close"""
173
191
self ._sched .stop ()
@@ -267,7 +285,8 @@ def _protected_at_cmd(self, cmd: str, on_ok_callback: Callable[[], None], on_ent
267
285
self ._run_at_callbacks = True
268
286
269
287
command = f"AT+{ cmd } \r \n "
270
- self ._serial_at .write (command .encode ())
288
+ self .write_serial_buffer (command .encode ())
289
+ # self._serial_at.write(command.encode())
271
290
272
291
return True
273
292
else :
@@ -600,7 +619,8 @@ def _set_unsolicited_network_reg_messages(self):
600
619
def _set_carrier (self ):
601
620
if self ._network :
602
621
carrier_str = f'AT+COPS=4,2,"{ self ._network } "' # 1 = manual (4 = manual/auto), 2 = short format. For One NZ SIM cards not roaming in NZ, Could take up to 60s
603
- self ._serial_at .write (carrier_str .encode ()) # ??? Maybe should be protected
622
+ self .write_serial_buffer (carrier_str .encode ())
623
+ # self._serial_at.write(carrier_str.encode()) # ??? Maybe should be protected
604
624
605
625
def _start_pdp_context (self ):
606
626
context_str = f'CGDCONT=1,"IP","{ self ._apn } "'
@@ -647,14 +667,16 @@ def _mqtt_request_will_toic(self):
647
667
self ._mqtt_connect ()
648
668
649
669
def _mqtt_enter_will_toic (self ):
650
- self ._serial_at .write ((self ._will_topic ).encode ())
670
+ self .write_serial_buffer (self ._will_topic .encode ())
671
+ # self._serial_at.write(self._will_topic.encode())
651
672
652
673
def _mqtt_request_will_message (self ):
653
674
temp_str = f'CMQTTWILLMSG=0,{ str (len (self ._will_message ))} ,2'
654
675
self ._protected_at_cmd (temp_str , self ._req_mqtt_connect , self ._mqtt_enter_will_message ) # clientIndex = 0, qos = 2
655
676
656
677
def _mqtt_enter_will_message (self ):
657
- self ._serial_at .write (self ._will_message .encode ())
678
+ self .write_serial_buffer (self ._will_topic .encode ())
679
+ # self._serial_at.write(self._will_message.encode())
658
680
659
681
def _req_mqtt_connect (self ):
660
682
self ._mqtt_state = MqttState .MQTT_REQ_CONNECT
@@ -672,7 +694,8 @@ def _mqtt_req_subscribe(self):
672
694
673
695
def _mqtt_enter_sub_topic (self ):
674
696
logger .debug ("Sub Topic: %s" , self ._sub_topic )
675
- self ._serial_at .write (self ._sub_topic .encode ())
697
+ self .write_serial_buffer (self ._sub_topic .encode ())
698
+ # self._serial_at.write(self._sub_topic.encode())
676
699
677
700
# ----- MQTT Publish ------
678
701
def _mqtt_request_publish (self , topic : str , message : str ):
@@ -685,14 +708,16 @@ def _mqtt_request_publish(self, topic: str, message: str):
685
708
686
709
def _mqtt_enter_pub_topic (self ):
687
710
logger .debug ("Pub Topic: %s" , self ._pub_topic )
688
- self ._serial_at .write (self ._pub_topic .encode ())
711
+ self .write_serial_buffer (self ._pub_topic .encode ())
712
+ # self._serial_at.write(self._pub_topic.encode())
689
713
690
714
def _mqtt_request_payload (self ):
691
715
self ._protected_at_cmd (f"CMQTTPAYLOAD=0,{ str (len (self ._tx_message ))} " , self ._mqtt_publish , self ._mqtt_enter_message ) # clientIndex = 0
692
716
693
717
def _mqtt_enter_message (self ):
694
718
logger .debug ("Publish Message: %s\n %s" , self ._pub_topic , self ._tx_message )
695
- self ._serial_at .write (self ._tx_message .encode ())
719
+ self .write_serial_buffer (self ._tx_message .encode ())
720
+ # self._serial_at.write(self._tx_message.encode())
696
721
697
722
def _mqtt_publish (self ):
698
723
if self ._protected_at_cmd ("CMQTTPUB=0,2,60" , self ._print_ok , None ): # clientIndex = 0
0 commit comments