9.16. Vrijeme i NTP¶
Svježe uključena kamera ne zna koje je vrijeme. Ugrađeni sat počinje u nekom proizvoljnom trenutku (1970-01-01 na većini ploča) i broji prema naprijed odatle dok mu nešto ne kaže drugačije. NTP – Network Time Protocol – način je na koji kamera od mreže traži stvarno vrijeme i prema dobivenom odgovoru postavlja vlastiti sat.
9.16.1. Zašto kamera treba znati vrijeme¶
Za mnoge skripte sat kamere nije važan – petlju za snimanje sličica ne zanima koji je dan. Za nekoliko uobičajenih stvari to je vrlo važno:
Vremenske oznake u zapisnicima ili prenesenim podacima. Unose koji svi navode
1970-01-01teško je naknadno razumjeti.Zakazani zadaci. „Pokreni u 03:00” zahtijeva da kamera zna što je 03:00.
9.16.2. Što NTP radi¶
NTP je mala javna usluga: mreža poslužitelja koji odgovaraju na pitanje „koliko je sati?” jednom UDP razmjenom. Kamera šalje kratak zahtjev poznatom NTP poslužitelju; poslužitelj odgovara preciznom vremenskom oznakom (točnom do nekoliko milisekundi za bilo koji uobičajeni javni poslužitelj); kamera to koristi za postavljanje vlastitog sata. Zadani poslužitelj koji kamera koristi je pool.ntp.org, globalno uravnotežen skup poslužitelja osmišljen upravo za ovu vrstu klijenta.
9.16.3. Python API: ntptime¶
MicroPython omata protokol u jedan poziv. Uobičajeni obrazac je da se najprije podigne veza, a zatim od NTP-a zatraži vrijeme:
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())
Nakon što ntptime.settime() vrati rezultat, ugrađeni sat stvarnog vremena i time.localtime() odražavaju trenutno UTC vrijeme. Dva parametra prilagođavaju zadane postavke:
ntptime.hostje naziv poslužitelja koji se ispituje. Promijenite ga (ntptime.host = "time.google.com") prije pozivasettime()kako biste usmjerili na drugi poslužitelj.ntptime.timeoutje broj sekundi koliko se čeka na odgovor prije odustajanja; zadana vrijednost je kratka.
9.16.4. Kada ga pozvati¶
Nakon što je mrežna veza uspostavljena. NTP se oslanja na UDP, koji se oslanja na uspostavljenu IP konfiguraciju. Najprije pričekajte da
isconnected()vratiTrue.Povremeno na kamerama koje dugo rade. Ugrađeni sat odstupa tijekom sati i dana. Dnevni ili tjedni
settime()održava ga točnim.
9.16.5. Vremenske zone¶
NTP vraća UTC. MicroPython ne dolazi s bazom vremenskih zona, pa je pretvorba UTC-a u lokalno vrijeme posao skripte. Fiksni pomak za zonu primjene uobičajeni je pristup:
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
Ljetno računanje vremena, prijestupne sekunde i povijesne promjene zona ovim se pristupom ne obrađuju. Za većinu primjena kamera fiksni pomak je dovoljan; ako skripta zaista treba građansko vrijeme s ljetnim računanjem vremena, obavite pretvorbu na strani poslužitelja.
9.16.6. Što može poći po zlu¶
Mreže još nema.
ntptime.settime()izazivaOSErrorako ne može doprijeti do poslužitelja. Ili veza nije podignuta, traženje naziva nije uspjelo, poslužitelj je nedostupan ili nije stigao nikakav odgovor unutarntptime.timeout. Pokušajte ponovno kada veza bude stabilna.Captive portali. Wi-Fi mreža koja presreće DNS može na naziv NTP poslužitelja odgovoriti vlastitom IP adresom portala, a NTP zahtjevi prema njoj vraćaju besmislice. Kamera će misliti da je mreža podignuta, ali postavljanje vremena neće uspjeti ili će biti potpuno pogrešno. Prijeđite na čistu mrežu ili upišite IP adresu fiksno.
Preopterećivanje javnih skupova. Javni NTP skupovi ograničavaju brzinu zlonamjernim klijentima. Jednom na sat je sasvim dovoljno; jednom u minuti dovest će do zabrane kamere.
Za potpunu referencu modula ntptime, pogledajte ntptime — jednostavni NTP klijent.