From e7bd821c858cec71cd7af85410ee5592a31d272a Mon Sep 17 00:00:00 2001 From: BiffoBear Date: Tue, 20 Dec 2022 07:22:48 +0300 Subject: [PATCH 1/2] Added retries and a TimeoutError to NTP.get_time. This avoids an infinite loop if the NTP server reply not received. --- adafruit_wiznet5k/adafruit_wiznet5k_ntp.py | 26 +++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py b/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py index 17a9971..74e04ed 100644 --- a/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py +++ b/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py @@ -69,13 +69,19 @@ def get_time(self) -> time.struct_time: :return time.struct_time: The local time. """ self._sock.bind((None, 50001)) - self._sock.sendto(self._pkt_buf_, (self._ntp_server, 123)) - while True: - data = self._sock.recv() - if data: - sec = data[40:44] - int_cal = int.from_bytes(sec, "big") - # UTC offset may be a float as some offsets are half hours so force int. - cal = int(int_cal - 2208988800 + self._utc * 3600) - cal = time.localtime(cal) - return cal + max_retries = 3 + for _ in range(max_retries): + self._sock.sendto(self._pkt_buf_, (self._ntp_server, 123)) + end_time = time.monotonic() + 1 + while time.monotonic() < end_time: + data = self._sock.recv() + if data: + sec = data[40:44] + int_cal = int.from_bytes(sec, "big") + # UTC offset may be a float as some offsets are half hours so force int. + cal = int(int_cal - 2208988800 + self._utc * 3600) + cal = time.localtime(cal) + return cal + raise TimeoutError( + "No reply from NTP server after {} attempts.".format(max_retries) + ) From fdbb6301dad72cdff08ebc7ab89b37425bf34414 Mon Sep 17 00:00:00 2001 From: BiffoBear Date: Tue, 20 Dec 2022 08:16:54 +0300 Subject: [PATCH 2/2] Changed the retries to exponential fallback to give really slow networks a chance. --- adafruit_wiznet5k/adafruit_wiznet5k_ntp.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py b/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py index 74e04ed..a1a98fd 100644 --- a/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py +++ b/adafruit_wiznet5k/adafruit_wiznet5k_ntp.py @@ -69,10 +69,10 @@ def get_time(self) -> time.struct_time: :return time.struct_time: The local time. """ self._sock.bind((None, 50001)) - max_retries = 3 - for _ in range(max_retries): + max_retries = 4 + for retry in range(max_retries): self._sock.sendto(self._pkt_buf_, (self._ntp_server, 123)) - end_time = time.monotonic() + 1 + end_time = time.monotonic() + 0.2 * 2**retry while time.monotonic() < end_time: data = self._sock.recv() if data: