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-01 teš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.host je naziv poslužitelja koji se ispituje. Promijenite ga (ntptime.host = "time.google.com") prije poziva settime() kako biste usmjerili na drugi poslužitelj.

  • ntptime.timeout je 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() vrati True.

  • 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() izaziva OSError ako 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 unutar ntptime.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.