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:
- Per FTP mit dem Router verbinden
- Dummy-Datei anlegen oder überschreiben (z. B. time.txt)
- FTP-Listing (LIST oder MLSD) abfragen
- Zeitstempel der Datei parsen
- 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
- FTP-Verbindung aufbauen
- Anmelden (Benutzer/Passwort oder anonym)
- Arbeitsverzeichnis wählen (falls nötig)
- Dummy-Datei schreiben (STOR time.txt)
- Listing abrufen (MLSD oder LIST time.txt)
- Zeitstempel parsen und in lokale Zeitstruktur umrechnen
- Interne Uhr setzen (z. B. setTime() / eigene RTC-Logik)
- 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:
- RTC (falls vorhanden)
- Internet-NTP
- Lokaler NTP-Server
- FTP-Timestamp vom Router
- 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.
