Пишем программный код для синхронизации времени через интернет на языке программирования microPython используя микроконтроллер ESP8266.

В данном уроке мы с Вами подключимся к серверу времени, считаем с него время и выведем на экран.

Подключаться мы будем к серверу http://worldtimeapi.org/api/timezone/Asia/Taipei который выдает данные о времени в виде массива.

Для получения данных с данного ресурса мы воспользуемся командой

urequests.get(url);

которая GET запрос, то есть считывает данные с указанного ресурса.

Если .status_code вернул значение 200. — это значит, что запрос был выполнен успешно, а сервер ответил, отобразив запрашиваемую информацию.

Ответ который мы получаем является   JSON контентом, это значит, что тип полученного значения из .json(), является словарем. По этому доступ к его содержимому можно получить по ключу, что мы и сделаем:

JSON response:
{«abbreviation»:»CST»,»client_ip»:»185.159.163.13″,»datetime»:»2021-12-24T15:26:04.572610+08:00″,»day_of_week»:5,»day_of_year»:358,»dst»:false,»dst_from»:nullz
«dst_offset»:0,»dst_until»:null,»raw_offset»:28800,»timezone»:»Asia/Taipei»,»unixtime»:1640330764,
«utc_datetime»:»2021-12-24T07:26:04.572610+00:00″,»utc_offset»:»+08:00″,»week_number»:51}

Теперь нам надо обратиться к нужному элементу массива, что забрать значения нашего времени:

datetime_str = str(parsed["datetime"])

Теперь в переменной datetime_str у нас хранятся наши данные в виде массива:

”datetime”:”2021-12-24T15:26:04.572610+08:00″

Зная расположения нужных данных в массиве, мы можем забирать и обрабатывать их:

year = int(datetime_str[0:4])

Далее мы с Вами запишем данные в RTC — часы:

RTC.datetime([datetimetuple])

где, datetimetuple это 8 элементный кортеж:

(year, month, day, weekday, hours, minutes, seconds, subseconds)

Дальше мы с Вами форматируем наши данные и выводим на экран.

import network, urequests, utime, machine
from machine import RTC

ssid = "lyusi28" # wifi router name
pw = "11223344" # wifi router password
url = "http://worldtimeapi.org/api/timezone/Asia/Taipei"
web_query_delay = 60000 # interval time of web JSON query

# internal real time clock
rtc = RTC()

# wifi connection
wifi = network.WLAN(network.STA_IF) # station mode
wifi.active(True)
wifi.connect(ssid, pw)

# wait for connection
while not wifi.isconnected():
utime.sleep(0.5)

# wifi connected
print("IP:", wifi.ifconfig()[0], "\n")

# set timer
update_time = utime.ticks_ms() - web_query_delay

# main loop
while True:
# if lose wifi connection, reboot ESP8266
if not wifi.isconnected():
machine.reset()

# query and get web JSON every web_query_delay ms
if utime.ticks_ms() - update_time >= web_query_delay:

# HTTP GET data
response = urequests.get(url)

if response.status_code == 200: # query success

print("JSON response:\n", response.text)

# parse JSON
parsed = response.json()
datetime_str = str(parsed["datetime"])
year = int(datetime_str[0:4])
month = int(datetime_str[5:7])
day = int(datetime_str[8:10])
hour = int(datetime_str[11:13])
minute = int(datetime_str[14:16])
second = int(datetime_str[17:19])
subsecond = int(round(int(datetime_str[20:26]) / 10000))

# update internal RTC
rtc.datetime((year, month, day, 0, hour, minute, second, subsecond))
update_time = utime.ticks_ms()
print("RTC updated\n")

else: # query failed, retry retry_delay ms later
update_time = utime.ticks_ms() - web_query_delay

# generate formated date/time strings from internal RTC
date_str = "Date: {1:02d}/{2:02d}/{0:4d}".format(*rtc.datetime())
time_str = "Time: {4:02d}:{5:02d}:{6:02d}".format(*rtc.datetime())

print(date_str)
print(time_str)

utime.sleep(1)

Рассмотрим вкратце  несколько методов которые предоставляет метод response:

  • response.text() – читает ответ и возвращает как обычный текст,
  • response.json() – декодирует ответ в формате JSON,
  • response.formData() – возвращает ответ как объект FormData,
  • response.blob() – возвращает объект как Blob (бинарные данные с типом),
  • response.arrayBuffer() – возвращает ответ как ArrayBuffer (низкоуровневое представление бинарных данных).

Важно помнить: Если мы уже получили ответ с response.text(), тогда response.json() не сработает, так как данные уже были обработаны.