Datum und Zeit von einem NTP-Server abrufen!
von Edi · 12/06/2023
Was ist ein NTP Server?
NTP steht für Network Time Protocol und ist ein Standard-Internetprotokoll zur Zeitsynchronisation zwischen Computersystemen. Das Protokoll ermöglicht die Synchronisierung aller vernetzten Geräte mit der koordinierten Weltzeit (UTC) innerhalb weniger Millisekunden (50 Millisekunden über das öffentliche Internet und unter 5 Millisekunden in einer LAN-Umgebung). Die koordinierte Weltzeit (UTC) ist ein weltweiter Zeitstandard, der eng mit der Greenwich Mean Time (GMT) verbunden ist. Die UTC variiert nicht und ist weltweit gleich, so dass sich Clients unabhängig vom Standort mit Servern synchronisieren können
In Mitteleuropa haben wir Mitteleuropäische Zeit (MEZ) und es ist UTC +1 Stunde. Die Zeitzone oder Sommerzeitumstellung wird vom Client übernommen.
NTP-Server-Architektur
NTP Server Daten abrufen
Die gebräuchlichste Konfiguration für NTP ist der Betrieb im Client-Server-Modus. Ein Client-Gerät wie der ESP8266 verbindet sich mit einem NTP Server über das User Datagram Protocol (UDP) an Port 123, der am besten so nah wie Möglich am Client steht.
Der Client sendet dann ein Anfragepaket an einen NTP-Server. Als Antwort auf diese Anfrage sendet der NTP-Server ein Zeitstempel-Paket. Ein Zeitstempel-Paket kann mehrere Informationen enthalten wie UNIX-Zeitstempel, Genauigkeit und Verzögerung.
Ein Client kann dann die aktuellen Datums- und Zeitwerte auslesen.
Der vom NTP-Server gesendete Zeitstempel entspricht der koordinierten Weltzeit (UTC) mit einer Genauigkeit von wenigen Millisekunden. Der Client kann dann zu dieser empfangenen UTC-Zeit eine beliebige Verschiebung der lokalen Zeitzone oder eine Verschiebung der Sommerzeit hinzufügen.
Host Namen: https://www.ntppool.org/de/
Weltweit – pool.ntp.org
Asien – asia.pool.ntp.org
Europa – europe.pool.ntp.org
Nord Amerika – north-america.pool.ntp.org
Deutschland – de.pool.ntp.org
Schweiz – ch.pool.ntp.org
Österreich – at.pool.ntp.org
POSIX - Zeitzone Einstellung
POSIX (Portable Operating System Interface) ist eine Familie von Standards der auch das Format von der Zeitzonen Einstellung beinhaltet. In diesem String sind alle wichtigen Informationen zur Zeitzone und die Handhabung von der Sommer-Winterzeit Umstellung enthalten.
CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00 – Zeitzone Mitteleuropa
CET: steht für Central European Time – Mitteleuropäische Zeitzone
-1 CEST -2: Im Winter -1 Stunde und im Sommer -2 Stunden zur UTC Zeit
M3.5.0/02:00:00: Im Monat 3, in der Woche 5 am Tag 0 (Sonntag) um 2:00:00 wird die Zeit von der Winterzeit auf die Sommerzeit umgestellt.
M10.5.0/03:00:00: Die Umstellung von der Sommerzeit auf die Winterzeit findet im Oktober in der Woche 5 am Sontag um 3:00:00 Früh statt.
Befehle um die Zeit zu formatieren
Wir haben einige Befehle zur Verfügung, um die Uhrzeit in einer für uns gut lesbaren Form anzuzeigen. Interessanterweise gibt es ein paar Kuriositäten, wie zum Beispiel das Jahr. Um das Jahr richtig anzuzeigen, muss 1900 hinzugefügt werden. Auch der Monat ist etwas gewöhnungsbedürftig, da er bei 0 und nicht bei 1 beginnt. Was allgemein üblich ist, wir aber trotzdem wissen sollten, ist, dass der Wochentag am Sonntag und nicht wie bei uns üblich am Montag beginnt.
Sketch
/*
Project: NTC Zeit Server for ESP32 and ESP8266
Author: Thomas Edlinger for www.edistechlab.com
Date: Created 04.06.2023
Version: V1.0
IDE: Arduino IDE 2.1.0
Required Board (Tools -> Board -> Boards Manager...)
- Board: esp8266 by ESP8266 Community V3.1.2
- Board: esp32 by Espressif Systems V2.0.9
Required libraries (sketch -> include library -> manage libraries)
-
*/
#ifdef ESP8266
#include
#else
#include
#endif
#include
// Wi-Fi Settings
const char *wifi_ssid = "Deine_SSID";
const char *wifi_password = "Dein-WiFi-Passwort";
const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00";
char wochentage[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
String monat[12] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
time_t now;
tm tm;
void setup () {
Serial.begin(115200);
setup_wifi();
configTime(0, 0, NTP_SERVER);
setenv("TZ", TZ_INFO, 1);
}
void loop () {
time(&now); // Liest die aktuelle Zeit
localtime_r(&now, &tm); // Beschreibt tm mit der aktuelle Zeit
Serial.printf("%02d-%02d-%04d \t", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
//Serial.printf("%02d %s %04d \t", tm.tm_mday, monat[tm.tm_mon], tm.tm_year + 1900); // Monat ausgeschrieben
Serial.print(wochentage[tm.tm_wday]);
//Serial.print(tm.tm_wday); // Wochentag als Zahl, 0 = Sonntag
Serial.print("\tder ");
Serial.print(tm.tm_mday);
Serial.print(" " + monat[tm.tm_mon] + " ");
Serial.print(tm.tm_year + 1900);
Serial.printf(" \tUhrzeit: %02d:%02d:%02d \n", tm.tm_hour, tm.tm_min, tm.tm_sec);
delay(1000);
}
void setup_wifi() {
delay(10);
WiFi.begin(wifi_ssid, wifi_password);
int counter = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
if (++counter > 100) ESP.restart();
Serial.print(".");
}
Serial.println("WiFi connected");
}
Material
Letzte Aktualisierung am 12.12.2024 / Affiliate Links / Bilder von der Amazon Product Advertising API