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-01sunt 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.hosteste numele serverului care urmează să fie interogat. Suprascrie-l (ntptime.host = "time.google.com") înainte de a apelasettime()pentru a indica un alt server.ntptime.timeouteste 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ă returnezeTrue.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ăOSErrordacă 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 intervalulntptime.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.