9.16. Tid och NTP¶
En nyss påslagen kamera har ingen aning om vad klockan är. Den inbyggda klockan startar vid någon godtycklig tidpunkt (1970-01-01 på de flesta kort) och räknar framåt därifrån tills något säger annat. NTP – Network Time Protocol – är hur kameran ber nätverket om den verkliga väggklockstiden och ställer in sin egen klocka utifrån svaret.
9.16.1. Varför kameran behöver veta vad klockan är¶
För många skript spelar kamerans klocka ingen roll – en slinga som fångar bildrutor bryr sig inte om vilken dag det är. För några vanliga saker spelar det stor roll:
Tidsstämplar i loggar eller uppladdade data. Poster som alla säger
1970-01-01är svåra att begripa sig på i efterhand.Schemalagda uppgifter. ”Kör kl. 03:00” kräver att kameran vet vad 03:00 är.
9.16.2. Vad NTP gör¶
NTP är en liten offentlig tjänst: ett nätverk av servrar som svarar på ”vad är klockan?” via ett enda UDP-utbyte. Kameran skickar en kort förfrågan till en känd NTP-server; servern svarar med en exakt tidsstämpel (noggrann till några millisekunder för vilken vanlig offentlig server som helst); kameran använder den för att ställa in sin egen klocka. Standardservern som kameran använder är pool.ntp.org, en globalt lastbalanserad pool utformad för just den här typen av klient.
9.16.3. Python-API:et: ntptime¶
MicroPython kapslar in protokollet i ett enda anrop. Det vanliga mönstret är att först få upp förbindelsen och sedan be NTP om tiden:
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())
Efter att ntptime.settime() returnerar speglar den inbyggda realtidsklockan och time.localtime() den aktuella UTC-tiden. Två rattar justerar standardvärdena:
ntptime.hostär namnet på servern att fråga. Skriv över det (ntptime.host = "time.google.com") innan du anroparsettime()för att peka på en annan server.ntptime.timeoutär antalet sekunder att vänta på ett svar innan man ger upp; standardvärdet är kort.
9.16.4. När man ska anropa det¶
Efter att nätverksförbindelsen är uppe. NTP åker på UDP, som åker på en upprättad IP-konfiguration. Vänta tills
isconnected()returnerarTrueförst.Periodiskt på kameror som körs länge. Den inbyggda klockan driver iväg över timmar och dagar. En daglig eller veckovis
settime()håller den ärlig.
9.16.5. Tidszoner¶
NTP returnerar UTC. MicroPython levereras inte med någon tidszonsdatabas, så att konvertera UTC till lokal tid är skriptets uppgift. En fast förskjutning för driftsättningens zon är det vanliga tillvägagångssättet:
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
Sommartid, skottsekunder och historiska zonändringar hanteras inte av detta tillvägagångssätt. För de flesta kameradriftsättningar räcker en fast förskjutning; om ett skript verkligen behöver civil tid med sommartid, gör konverteringen på serversidan.
9.16.6. Vad som kan gå fel¶
Inget nätverk ännu.
ntptime.settime()utlöserOSErrorom den inte kan nå servern. Antingen är förbindelsen inte uppe, namnuppslagningen misslyckades, servern är onåbar eller så kom inget svar inomntptime.timeout. Försök igen när förbindelsen är stabil.Captive portals. Ett Wi-Fi-nätverk som fångar upp DNS kan svara på NTP-serverns namn med portalens egen IP, och NTP-förfrågningar dit ger nonsens tillbaka. Kameran kommer att tro att nätverket är uppe, men tidsinställningen misslyckas eller blir vilt felaktig. Byt till ett rent nätverk eller hårdkoda en IP.
Hamra på offentliga pooler. Offentliga NTP-pooler hastighetsbegränsar missbrukande klienter. En gång i timmen är gott och väl; en gång i minuten kommer att få kameran bannlyst.
För den fullständiga ntptime-referensen, se ntptime — enkel NTP-klient.