9.16. Tijd en NTP¶
Een net ingeschakelde camera heeft geen idee hoe laat het is. De interne klok begint op een willekeurig moment (1970-01-01 op de meeste boards) en telt van daaruit verder totdat iets hem anders vertelt. NTP – het Network Time Protocol – is de manier waarop de cam het netwerk om de werkelijke kloktijd vraagt en zijn eigen klok op basis van het antwoord instelt.
9.16.1. Waarom de cam de tijd moet weten¶
Voor veel scripts maakt de klok van de cam niet uit – een frame-opnamelus geeft niets om welke dag het is. Voor een paar veelvoorkomende zaken maakt het juist veel uit:
Tijdstempels in logs of geüploade data. Vermeldingen die allemaal
1970-01-01aangeven, zijn achteraf moeilijk te begrijpen.Geplande taken. “Voer uit om 03:00” vereist dat de camera weet wat 03:00 is.
9.16.2. Wat NTP doet¶
NTP is een kleine openbare dienst: een netwerk van servers die via één enkele UDP-uitwisseling de vraag “hoe laat is het?” beantwoorden. De camera stuurt een korte aanvraag naar een bekende NTP-server; de server antwoordt met een nauwkeurig tijdstempel (nauwkeurig tot enkele milliseconden voor elke gangbare openbare server); de camera gebruikt dat om zijn eigen klok in te stellen. De standaardserver die de cam gebruikt is pool.ntp.org, een wereldwijd load-balanced pool die precies voor dit soort clients is ontworpen.
9.16.3. De Python-API: ntptime¶
MicroPython verpakt het protocol in één enkele aanroep. Het gebruikelijke patroon is om eerst de verbinding op te zetten en daarna NTP om de tijd te vragen:
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())
Nadat ntptime.settime() is teruggekeerd, geven de interne realtimeklok en time.localtime() de huidige UTC-tijd weer. Twee knoppen passen de standaardinstellingen aan:
ntptime.hostis de naam van de te bevragen server. Overschrijf hem (ntptime.host = "time.google.com") vóór het aanroepen vansettime()om naar een andere server te verwijzen.ntptime.timeoutis het aantal seconden dat op een antwoord wordt gewacht voordat het wordt opgegeven; de standaardwaarde is kort.
9.16.4. Wanneer je het aanroept¶
Nadat de netwerkverbinding actief is. NTP draait op UDP, dat op zijn beurt op een opgezette IP-configuratie draait. Wacht eerst tot
isconnected()Trueteruggeeft.Periodiek op langdurig draaiende cams. De interne klok loopt over uren en dagen weg. Een dagelijkse of wekelijkse
settime()houdt hem op tijd.
9.16.5. Tijdzones¶
NTP geeft UTC terug. MicroPython wordt niet geleverd met een tijdzonedatabase, dus het omzetten van UTC naar lokale tijd is de taak van het script. Een vaste verschuiving voor de zone van de implementatie is de gebruikelijke aanpak:
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
Zomertijd, schrikkelseconden en historische zonewijzigingen worden door deze aanpak niet afgehandeld. Voor de meeste camera-implementaties is een vaste verschuiving voldoende; als een script werkelijk burgerlijke tijd met zomertijd nodig heeft, voer de conversie dan aan de serverkant uit.
9.16.6. Wat er mis kan gaan¶
Nog geen netwerk.
ntptime.settime()werptOSErrorop als de server niet kan worden bereikt. Of de verbinding is niet actief, de naamopzoeking is mislukt, de server is onbereikbaar, of er kwam geen antwoord binnenntptime.timeout. Probeer het opnieuw zodra de verbinding stabiel is.Captive portals. Een wifinetwerk dat DNS onderschept, kan de naam van de NTP-server beantwoorden met het eigen IP-adres van het portal, en NTP-aanvragen daarheen leveren onzin op. De cam denkt dan dat het netwerk actief is, maar het instellen van de tijd mislukt of is volkomen verkeerd. Ga naar een schoon netwerk of codeer een IP-adres hard.
Openbare pools overbelasten. Openbare NTP-pools beperken de snelheid van misbruikende clients. Eenmaal per uur is ruim voldoende; eenmaal per minuut zorgt ervoor dat de cam wordt geblokkeerd.
Voor de volledige ntptime-referentie, zie ntptime — eenvoudige NTP-client.