9.16. Timpul și NTP#

O cameră tocmai alimentată nu are nicio idee cât e ceasul. Ceasul de pe placă pornește dintr-un moment arbitrar (1970-01-01 pe majoritatea plăcilor) și numără înainte de acolo până când ceva îi spune altfel. NTP – Network Time Protocol – este modul prin care camera cere rețelei ora reală și își setează propriul ceas pe baza răspunsului.

9.16.1. De ce trebuie camera să știe ora#

Pentru multe scripturi ceasul camerei nu contează – o buclă de captură de cadre nu se sinchisește ce zi este. Pentru câteva lucruri obișnuite însă contează enorm:

  • Marcaje temporale în jurnale sau date încărcate. Intrările care spun toate 1970-01-01 sunt greu de interpretat ulterior.

  • Sarcini programate. „Rulează la 03:00” impune camerei să știe ce înseamnă 03:00.

9.16.2. Ce face NTP#

NTP este un mic serviciu public: o rețea de servere care răspund la întrebarea „cât este ceasul?” printr-un singur schimb UDP. Camera trimite o cerere scurtă către un server NTP cunoscut; serverul răspunde cu un marcaj temporal precis (corect până la câteva milisecunde pentru orice server public obișnuit); camera folosește acest răspuns pentru a-și seta propriul ceas. Serverul implicit folosit de cameră este pool.ntp.org, un pool echilibrat global ca încărcare, conceput exact pentru acest tip de client.

9.16.3. API-ul Python: ntptime#

MicroPython încapsulează protocolul într-un singur apel. Tiparul obișnuit este să ridici mai întâi legătura, apoi să ceri ora de la 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())

După ce ntptime.settime() returnează, ceasul de timp real de pe placă și time.localtime() reflectă ora UTC curentă. Două reglaje ajustează valorile implicite:

  • ntptime.host este numele serverului care urmează să fie interogat. Suprascrie-l (ntptime.host = "time.google.com") înainte de a apela settime() pentru a indica un alt server.

  • ntptime.timeout este numărul de secunde de așteptare a unui răspuns înainte de a renunța; valoarea implicită este scurtă.

9.16.4. Când să-l apelezi#

  • După ce legătura de rețea este activă. NTP rulează peste UDP, care rulează peste o configurație IP stabilită. Așteaptă mai întâi ca isconnected() să returneze True.

  • Periodic, pe camere care rulează timp îndelungat. Ceasul de pe placă derivă în decurs de ore și zile. Un apel zilnic sau săptămânal la settime() îl menține corect.

9.16.5. Fusele orare#

NTP returnează UTC. MicroPython nu include o bază de date a fuselor orare, așa că transformarea UTC în ora locală este sarcina scriptului. Un decalaj fix pentru fusul instalației este abordarea uzuală:

import time

offset = -5 * 3600                  # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)

Ora de vară, secundele bisecte și schimbările istorice ale fuselor nu sunt tratate de această abordare. Pentru majoritatea instalațiilor de cameră un decalaj fix este suficient; dacă un script chiar are nevoie de ora civilă cu oră de vară, fă conversia pe partea de server.

9.16.6. Ce poate merge prost#

  • Încă nu există rețea. ntptime.settime() ridică OSError dacă nu poate ajunge la server. Fie legătura nu este activă, fie căutarea numelui a eșuat, fie serverul este inaccesibil, fie niciun răspuns nu a sosit în intervalul ntptime.timeout. Reîncearcă odată ce legătura este stabilă.

  • Portaluri captive. O rețea Wi-Fi care interceptează DNS poate răspunde la numele serverului NTP cu IP-ul propriu al portalului, iar cererile NTP către acela returnează aiureli. Camera va crede că rețeaua este activă, dar setarea orei va eșua sau va fi complet greșită. Mută-te într-o rețea curată sau codifică fix un IP.

  • Solicitarea excesivă a pool-urilor publice. Pool-urile NTP publice limitează rata clienților abuzivi. O dată pe oră este mai mult decât suficient; o dată pe minut va duce la blocarea camerei.

Pentru referința completă ntptime, vezi ntptime — client NTP simplu.