9.16. Ora e NTP¶
Una camera appena accesa non ha idea di che ora sia. L’orologio integrato parte da un momento arbitrario (1970-01-01 sulla maggior parte delle schede) e da lì conta in avanti finché qualcosa non gli dice diversamente. NTP – il Network Time Protocol – è il modo in cui la cam chiede alla rete l’ora reale dell’orologio da parete e imposta il proprio orologio in base alla risposta.
9.16.1. Perché la cam ha bisogno di conoscere l’ora¶
Per molti script l’orologio della cam non ha importanza – un ciclo di acquisizione di frame non si cura di che giorno sia. Per alcune cose comuni, invece, conta molto:
Timestamp nei log o nei dati caricati. Le voci che riportano tutte
1970-01-01sono difficili da interpretare a posteriori.Attività pianificate. «Esegui alle 03:00» richiede che la camera sappia cosa sono le 03:00.
9.16.2. Cosa fa NTP¶
NTP è un piccolo servizio pubblico: una rete di server che rispondono alla domanda «che ora è?» tramite un singolo scambio UDP. La camera invia una breve richiesta a un server NTP noto; il server risponde con un timestamp preciso (accurato a pochi millisecondi per qualsiasi server pubblico comune); la camera lo usa per impostare il proprio orologio. Il server predefinito usato dalla cam è pool.ntp.org, un pool globalmente bilanciato sul carico, progettato esattamente per questo tipo di client.
9.16.3. L’API Python: ntptime¶
MicroPython incapsula il protocollo in una singola chiamata. Lo schema più comune è attivare prima il collegamento, poi chiedere l’ora a 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())
Dopo che ntptime.settime() ritorna, l’orologio in tempo reale integrato e time.localtime() riflettono l’ora UTC corrente. Due parametri regolano i valori predefiniti:
ntptime.hostè il nome del server da interrogare. Sovrascrivilo (ntptime.host = "time.google.com") prima di chiamaresettime()per puntare a un server diverso.ntptime.timeoutè il numero di secondi da attendere per una risposta prima di rinunciare; il valore predefinito è breve.
9.16.4. Quando chiamarlo¶
Dopo che il collegamento di rete è attivo. NTP viaggia su UDP, che viaggia su una configurazione IP stabilita. Attendi prima che
isconnected()restituiscaTrue.Periodicamente sulle cam in funzione a lungo. L’orologio integrato deriva nell’arco di ore e giorni. Una chiamata giornaliera o settimanale a
settime()lo mantiene corretto.
9.16.5. Fusi orari¶
NTP restituisce l’ora UTC. MicroPython non include un database dei fusi orari, quindi convertire UTC in ora locale è compito dello script. L’approccio abituale è applicare un offset fisso per il fuso del luogo di installazione:
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
L’ora legale, i secondi intercalari e le variazioni storiche dei fusi non sono gestiti da questo approccio. Per la maggior parte delle installazioni di camere un offset fisso è sufficiente; se uno script ha davvero bisogno dell’ora civile con l’ora legale, esegui la conversione lato server.
9.16.6. Cosa può andare storto¶
Rete non ancora disponibile.
ntptime.settime()sollevaOSErrorse non riesce a raggiungere il server. Può darsi che il collegamento non sia attivo, che la risoluzione del nome sia fallita, che il server sia irraggiungibile o che nessuna risposta sia arrivata entrontptime.timeout. Riprova una volta che il collegamento è stabile.Captive portal. Una rete Wi-Fi che intercetta il DNS può rispondere al nome del server NTP con l’IP del portale stesso, e le richieste NTP a quell’indirizzo restituiscono dati senza senso. La cam penserà che la rete sia attiva, ma l’impostazione dell’ora fallirà o sarà del tutto errata. Passa a una rete pulita oppure imposta un IP fisso.
Sovraccaricare i pool pubblici. I pool NTP pubblici limitano la frequenza dei client abusivi. Una volta all’ora è più che sufficiente; una volta al minuto farà bandire la cam.
Per il riferimento completo di ntptime, vedi ntptime — semplice client NTP.