Datum und Zeit von einem NTP-Server abrufen!

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

Der NTP-Server basiert auf einer hierarchischen Struktur, die aus vier Ebenen besteht, wobei jede Ebene als “Stratum” (Schicht) bezeichnet wird. Die erste Ebene (Schicht 0) enthält hochpräzise Atom-/Funkuhren, die die genaue Zeit angeben. Die zweite Schicht (Schicht 1) ist direkt mit der ersten Schicht verbunden und enthält daher die genaueste verfügbare Zeit, die wir von der ersten Schicht erhalten. Die zweite und dritte Schicht ist mit der jeweils darüber liegenden Schicht verbunden und synchronisiert sich.

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 <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.h>

// 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

Zum Video

★☆★ Wenn ihr den Kanal unterstützen wollt über ★☆★

oder über

Twint Spenden Code

Letzte Aktualisierung am 12.12.2024 / Affiliate Links / Bilder von der Amazon Product Advertising API