9.16. L’heure et le NTP¶
Une caméra qui vient d’être mise sous tension n’a aucune idée de l’heure qu’il est. L’horloge embarquée démarre à un instant arbitraire (1970-01-01 sur la plupart des cartes) et avance à partir de là jusqu’à ce que quelque chose lui dise le contraire. Le NTP – le Network Time Protocol – est le moyen par lequel la caméra demande au réseau l’heure réelle et règle sa propre horloge à partir de la réponse.
9.16.1. Pourquoi la caméra a besoin de connaître l’heure¶
Pour beaucoup de scripts, l’horloge de la caméra n’a pas d’importance – une boucle de capture de trames se moque du jour qu’il est. Pour quelques cas courants, elle compte énormément :
Horodatages dans les journaux ou les données téléversées. Des entrées qui affichent toutes
1970-01-01sont difficiles à interpréter après coup.Tâches planifiées. « Exécuter à 03h00 » nécessite que la caméra sache ce qu’est 03h00.
9.16.2. Ce que fait le NTP¶
Le NTP est un petit service public : un réseau de serveurs qui répondent à la question « quelle heure est-il ? » via un unique échange UDP. La caméra envoie une courte requête à un serveur NTP connu ; le serveur répond avec un horodatage précis (exact à quelques millisecondes près pour n’importe quel serveur public courant) ; la caméra s’en sert pour régler sa propre horloge. Le serveur que la caméra utilise par défaut est pool.ntp.org, un pool à répartition de charge mondiale conçu exactement pour ce genre de client.
9.16.3. L’API Python : ntptime¶
MicroPython encapsule le protocole en un seul appel. Le schéma habituel consiste à établir d’abord le lien, puis à demander l’heure au 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())
Une fois que ntptime.settime() retourne, l’horloge temps réel embarquée et time.localtime() reflètent l’heure UTC actuelle. Deux paramètres permettent d’ajuster les valeurs par défaut :
ntptime.hostest le nom du serveur à interroger. Remplacez-le (ntptime.host = "time.google.com") avant d’appelersettime()pour pointer vers un serveur différent.ntptime.timeoutest le nombre de secondes à attendre une réponse avant d’abandonner ; la valeur par défaut est courte.
9.16.4. Quand l’appeler¶
Une fois le lien réseau établi. Le NTP s’appuie sur UDP, qui s’appuie sur une configuration IP établie. Attendez d’abord que
isconnected()retourneTrue.Périodiquement sur les caméras à fonctionnement prolongé. L’horloge embarquée dérive au fil des heures et des jours. Un
settime()quotidien ou hebdomadaire la maintient à l’heure.
9.16.5. Fuseaux horaires¶
Le NTP retourne l’heure UTC. MicroPython n’embarque pas de base de données de fuseaux horaires ; la conversion de l’UTC vers l’heure locale est donc à la charge du script. Un décalage fixe correspondant au fuseau du déploiement est l’approche habituelle
import time
offset = -5 * 3600 # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)
L’heure d’été, les secondes intercalaires et les changements historiques de fuseau ne sont pas gérés par cette approche. Pour la plupart des déploiements de caméras, un décalage fixe suffit ; si un script a réellement besoin de l’heure civile avec l’heure d’été, effectuez la conversion côté serveur.
9.16.6. Ce qui peut mal tourner¶
Pas encore de réseau.
ntptime.settime()lève uneOSErrorsi elle ne parvient pas à joindre le serveur. Soit le lien n’est pas établi, soit la résolution du nom a échoué, soit le serveur est injoignable, soit aucune réponse n’est arrivée dans le délai dentptime.timeout. Réessayez une fois le lien stable.Portails captifs. Un réseau Wi-Fi qui intercepte le DNS peut répondre au nom du serveur NTP avec l’IP du portail lui-même, et les requêtes NTP envoyées à cette adresse renvoient n’importe quoi. La caméra croira que le réseau est établi, mais le réglage de l’heure échouera ou sera complètement faux. Passez sur un réseau propre ou codez en dur une IP.
Saturer les pools publics. Les pools NTP publics limitent le débit des clients abusifs. Une fois par heure est largement suffisant ; une fois par minute fera bannir la caméra.
Pour la référence complète de ntptime, voir ntptime — client NTP simple.