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-01 sont 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.host est le nom du serveur à interroger. Remplacez-le (ntptime.host = "time.google.com") avant d’appeler settime() pour pointer vers un serveur différent.

  • ntptime.timeout est 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() retourne True.

  • 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 une OSError si 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 de ntptime.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.