9.16. Час та NTP¶
Щойно увімкнена камера не знає, котра година. Вбудований годинник запускається з довільного моменту (1970-01-01 на більшості плат) і рахує час вперед звідти, доки щось не скаже йому інакше. NTP – мережевий протокол часу – це спосіб, за допомогою якого камера запитує мережу про реальний час і встановлює власний годинник на основі відповіді.
9.16.1. Навіщо камері знати час¶
Для більшості скриптів годинник камери не має значення – цикл захоплення кадрів не перймається, який зараз день. Але для деяких поширених задач це дуже важливо:
Мітки часу в журналах або завантажених даних. Записи, де всюди написано
1970-01-01, важко осмислити після їх накопичення.Заплановані задачі. «Запустити о 03:00» вимагає, щоб камера знала, що таке 03:00.
9.16.2. Що робить NTP¶
NTP – це невелика публічна служба: мережа серверів, що відповідають на запит «котра година?» через одиночний обмін UDP. Камера надсилає короткий запит на відомий NTP-сервер; сервер відповідає точною міткою часу (точність кількох мілісекунд для будь-якого публічного сервера); камера використовує її для встановлення власного годинника. Сервер за замовчуванням, який використовує камера, – pool.ntp.org, глобально балансований пул, розроблений саме для таких клієнтів.
9.16.3. Python API: ntptime¶
MicroPython обертає протокол в один виклик. Типова схема – спочатку підняти з’єднання, а потім запитати NTP про час:
import network
import ntptime
import time
wlan = network.WLAN(network.WLAN.IF_STA)
wlan.active(True)
wlan.connect("my-network", "my-password")
while not wlan.isconnected():
time.sleep_ms(100)
ntptime.settime() # cam's clock is now UTC
print(time.localtime())
Після повернення ntptime.settime() вбудований годинник реального часу та time.localtime() відображають поточний час UTC. Два параметри дозволяють змінити значення за замовчуванням:
ntptime.host– ім’я сервера для запиту. Перевизначте його (ntptime.host = "time.google.com") перед викликомsettime(), щоб вказати інший сервер.ntptime.timeout– кількість секунд очікування відповіді перед скасуванням; значення за замовчуванням невелике.
9.16.4. Коли викликати¶
Після встановлення мережевого з’єднання. NTP працює поверх UDP, який працює поверх налаштованого IP. Спочатку дочекайтесь, поки
isconnected()повернеTrue.Periodично на камерах з тривалою роботою. Вбудований годинник відстає протягом годин і днів. Щоденний або щотижневий виклик
settime()утримує його точним.
9.16.5. Часові пояси¶
NTP повертає UTC. MicroPython не постачається з базою даних часових поясів, тому перетворення UTC на місцевий час є завданням скрипта. Зазвичай використовується фіксоване зміщення для часового поясу розгортання:
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
Цей підхід не обробляє літній час, високосні секунди та históричні зміни поясів. Для більшості розгортань камери фіксованого зміщення достатньо; якщо скрипту справді потрібен цивільний час з літнім часом, виконуйте перетворення на стороні сервера.
9.16.6. Що може піти не так¶
Мережа ще не готова.
ntptime.settime()викидаєOSError, якщо не може досягти сервера. Або з’єднання ще не встановлено, або пошук імені не вдався, або сервер недоступний, або відповідь не надійшла в межахntptime.timeout. Повторіть спробу після стабілізації з’єднання.Captive-портали. Wi-Fi мережа, що перехоплює DNS, може відповідати на ім’я NTP-сервера IP-адресою порталу, і NTP-запити до нього повертатимуть нісенітницю. Камера вважатиме, що мережа доступна, але встановлення часу зазнає невдачі або буде грубо помилковим. Перейдіть на чисту мережу або вкажіть IP-адресу вручну.
Перевантаження публічних пулів. Публічні NTP-пули обмежують надмірних клієнтів. Раз на годину – цілком достатньо; раз на хвилину – і камеру заблокують.
Повний довідник ntptime дивіться в ntptime — простий NTP-клієнт.