HomeBlogMagic

Embedded Systemzeit ermitteln über FTP

In vielen Embedded-Szenarien (z. B. ESP32/ESP8266) steht keine zuverlässige Zeitquelle zur Verfügung:

  • kein dauerhaftes Internet → kein NTP
  • kein lokaler NTP-Server
  • ggf. kein RTC-Chip (oder nur optional)

Trotzdem möchte man Logs sinnvoll mit Datum und Uhrzeit versehen – etwa für:

  • Solar- und Energiemessungen
  • Temperatur-/Feuchtigkeits-Logging
  • Tank-/Füllstandmessungen
  • Allgemeine Statuswerte

Dafür reicht oft eine ungefähre, aber konsistente Zeit aus.
Eine interessante „Backup“-Methode ist: Zeit über FTP-Dateistempel vom Router holen.


Idee: Routerzeit über FTP-Datei auslesen

Viele Router (z. B. TP-Link) bieten einen FTP-Server zum Zugriff auf einen internen Speicher oder USB-Stick.
Wenn man dort eine Datei erzeugt oder überschreibt, erhält diese Datei einen Zeitstempel, der von der Systemzeit des Routers gesetzt wird.

Vorgehen:

  1. Per FTP mit dem Router verbinden
  2. Dummy-Datei anlegen oder überschreiben (z. B. time.txt)
  3. FTP-Listing (LIST oder MLSD) abfragen
  4. Zeitstempel der Datei parsen
  5. Interne Uhr (Software-RTC) damit setzen

Diese Zeit muss nicht superpräzise sein – sie reicht für Logs völlig aus.


Voraussetzungen

  • Router mit aktiviertem FTP-Server im LAN
  • Der Router hat eine halbwegs korrekte Systemzeit
    • manuell im Webinterface gestellt oder
    • einmalig per Internet-NTP synchronisiert
  • Client (z. B. ESP) kann:
    • TCP/FTP sprechen
    • einfache Strings parsen

Protokollverhalten von FTP

Bei einem Verzeichnislisting (LIST oder MLSD) liefert der FTP-Server u. a.:

  • Dateiname
  • Dateigröße
  • Änderungszeit (Modification Time)

Beispiel LIST (klassischer UNIX-Style)

-rw-r--r-- 1 admin admin 12 Jan 31 16:42 time.txt

Beispiel MLSD (maschinenfreundlich)

modify=20250201164200;size=12;type=file; time.txt

Die Angabe modify=YYYYMMDDhhmmss ist direkt nutzbar.


Typischer Ablauf im Gerät

  1. FTP-Verbindung aufbauen
  2. Anmelden (Benutzer/Passwort oder anonym)
  3. Arbeitsverzeichnis wählen (falls nötig)
  4. Dummy-Datei schreiben (STOR time.txt)
  5. Listing abrufen (MLSD oder LIST time.txt)
  6. Zeitstempel parsen und in lokale Zeitstruktur umrechnen
  7. Interne Uhr setzen (z. B. setTime() / eigene RTC-Logik)
  8. FTP-Verbindung schließen

Pseudocode (generisch, an ESP/Arduino angelehnt)

Verbindungsparameter

FTP_HOST   = "192.168.0.1"
FTP_PORT   = 21
FTP_USER   = "user"
FTP_PASS   = "pass"
TIME_FILE  = "time.txt"

Dummy-Datei schreiben

client = ftp_connect(FTP_HOST, FTP_PORT)
ftp_send("USER " + FTP_USER)
ftp_send("PASS " + FTP_PASS)

data_socket = ftp_open_pasv(client)
ftp_send("STOR " + TIME_FILE)

data_socket.write("dummy")
data_socket.close()

ftp_read_response(client)

MLSD abrufen

data_socket = ftp_open_pasv(client)
ftp_send("MLSD")

listing = data_socket.read_all()
data_socket.close()
ftp_read_response(client)

Timestamp parsen

ts = extract("modify=YYYYMMDDhhmmss", listing)

year  = int(ts[0:4])
month = int(ts[4:6])
day   = int(ts[6:8])
hour  = int(ts[8:10])
min   = int(ts[10:12])
sec   = int(ts[12:14])

set_local_time(year, month, day, hour, min, sec)

Einbettung in eine Zeit-Kaskade

Die FTP-Methode eignet sich hervorragend als letzte Backup-Stufe:

  1. RTC (falls vorhanden)
  2. Internet-NTP
  3. Lokaler NTP-Server
  4. FTP-Timestamp vom Router
  5. Notfall: gespeicherte letzte Zeit + Uptime

Damit erhält man selbst in isolierten Netzen eine brauchbare Zeitbasis.


Einschränkungen

  • Routerzeit kann nach Stromausfall verloren gehen
  • Format des FTP-Listings ist nicht immer identisch
  • Präzision hängt direkt von der Router-Einstellung ab

Für einfache Logging-Anwendungen ist die Methode aber mehr als ausreichend.


Permalink: https://adirmeier.de/Blog/ID_496
Tags: Blog, embedded, esp32, Esp8266von am 2025-12-04