fbe9417b90
The ntptime module was previously only included in the ESP8266 port. This commit factors that module out into the extmod directory, makes it support different epochs, and includes it in the rp2 port.
49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
import utime
|
|
|
|
try:
|
|
import usocket as socket
|
|
except:
|
|
import socket
|
|
try:
|
|
import ustruct as struct
|
|
except:
|
|
import struct
|
|
|
|
# The NTP host can be configured at runtime by doing: ntptime.host = 'myhost.org'
|
|
host = "pool.ntp.org"
|
|
|
|
|
|
def time():
|
|
NTP_QUERY = bytearray(48)
|
|
NTP_QUERY[0] = 0x1B
|
|
addr = socket.getaddrinfo(host, 123)[0][-1]
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
try:
|
|
s.settimeout(1)
|
|
res = s.sendto(NTP_QUERY, addr)
|
|
msg = s.recv(48)
|
|
finally:
|
|
s.close()
|
|
val = struct.unpack("!I", msg[40:44])[0]
|
|
|
|
EPOCH_YEAR = utime.gmtime(0)[0]
|
|
if EPOCH_YEAR == 2000:
|
|
# (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60
|
|
NTP_DELTA = 3155673600
|
|
elif EPOCH_YEAR == 1970:
|
|
# (date(1970, 1, 1) - date(1900, 1, 1)).days * 24*60*60
|
|
NTP_DELTA = 2208988800
|
|
else:
|
|
raise Exception("Unsupported epoch: {}".format(EPOCH_YEAR))
|
|
|
|
return val - NTP_DELTA
|
|
|
|
|
|
# There's currently no timezone support in MicroPython, and the RTC is set in UTC time.
|
|
def settime():
|
|
t = time()
|
|
import machine
|
|
|
|
tm = utime.gmtime(t)
|
|
machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0))
|