NTP Antwort identifizieren

Ich werte in meinem Sketck alle möglichen UDP Telegramme aus. Sind klar definiert, mit Anfang- und Endekennzeichen. Funktioniert perfekt.

Nun habe ich eine NTP Abfrage eingebaut, einzeln läuft die Auswerteroutine, gibt die korrekte Uhrzeit aus. Nun möchte ich aber die NTP Antwort klar als solche Erkennen können. Auf was kann ich da zuverlässig prüfen?
Hab auch das mit “Authenticator (optional): Für Keywörter etc.” in der Definition gesehen. Kann man da was mitschicken, was zurückgeschickt wird? Oder steht da wenigstens zuverlässig 0 drin?

Hallo,
Ich weiss jetzt nicht ob’s nur mir so geht, aber ich hab Deine Frage nicht verstanden .
Du schickst ein Datenpaket als Anfrage an und bekommst es zurück mit den aktuellen Daten .
Was willst da da jetzt wissen ?

Heinz

Ich bekomme 48 Byte zurück. Aber auf dem Port kommen viele UDP Telegramme rein. Die haben alle irgendeine Id oder sonstwas zum zuordnen. Wie kann ich sicher sein, dass die 48 Byte die Antwort vom NTP Server ist, damit ich in die korrekte Parserroutine springen kann?

Antwort z.B. ist so, in hex, die ersten beiden Zeilen ist die Position im Array:

                                    1                             2                             3                             4                             5
Pos:  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9  0
hex: 24  2  6 EB  0  0  3 95  0  0  7 77 86 22  3 13 E1  2 74 C6 88 D1 48 8B  0  0  0  0  0  0  0  0 E1  2 78 D6 27  F A0 82 E1  2 78 D6 27 11 5E E7

Du kannst Dir doch die IP des aktuellen Absenders ausgeben lassen und weißt, wohin Du die Anfrage geschickt hast.

Gruß Tommy

ich benutze den 3.pool.ntp.org, und es kommen über Udp.remoteIP() aber leider etliche verschiedene IPs zurück.

Hallo,

hier ein Link zu UDP

UDP

die Zuordnung der Daten wird über die Port-Nr festgelegt. Sollte doch eigendlich reichen.

Anfrage über localPort -> an NTP Server ziel port 123
Antwort vom Server -> zuück an local Port

Auschnitt aus dem Sketch

// -------------- Datum Zeit von Timeserver holen-------------
time_t get_time() {
  Serial.println(F("UDP starten"));
  udp.begin(localPort);  // z.B 2390

  // Paketdaten zur NTP Anfrage
  memset(paket, 0, 48);
  paket[0] = 0b11100011;
  paket[1] = 0;
  paket[2] = 6;
  paket[3] = 0xEC;
  paket[12] = 49;
  paket[13] = 0x4E;
  paket[14] = 49;
  paket[15] = 52;

  udp.beginPacket(FritzboxIP, 123);
  udp.write(paket, NTP_PACKET_SIZE);
  udp.endPacket();
  delay(1000);
  int cb = udp.parsePacket();
  if (!cb) {
    Serial.println("kein NTP Paket");
  }
  else {

    udp.read(paket, NTP_PACKET_SIZE);
    Serial.println("Zeit synchron");
  }
  udp.stop();// local Port wieder freigeben

Heinz

Danke Heinz, aber dass kenne ich schon alles. Auf dem local port (bei mir 4000) kommen alle möglichen "Datentelegramme" per Udp rein. Und je nach dem Inhalt (id nummer, etc.), geht es eben in den entsprechenden Verarbeitungsprozess.
Nur an was erkenne ich EINDEUTIG, dass das betreffende "Datentelegramm", das mir der NTP Server schickt, eben das NTP Telegramm ist und ich es in die zugehörige NTP Routine schicken kann?

Momentan arbeite ich mit einen Workaround, der mir nicht wirklich gefällt. Aber dann lasse ich es einfach so.

Kannst du der NTP-Anfrage nicht einen eigenen Port zuweisen und diesen dann abfragen? Also wenn die Antwort über diesen Port reinkommt, ist es deine Antwort und du kannst das Paket dann ggf. weiter prüfen.

Das hatte ich getestet, einfach 2 Udp Verbindungen mit verschiedenen Ports. Erschien mir auch logisch und richtig. Leider ist dabei die Antwort des Udp Servers nicht auf Udp2 reingekommen, sondern im Nirwana geblieben. Hab dann da nicht gross weiter gesucht. Mache es jetzt so, dass ich einfach in einer Timeoutschleife 2 Sekunden warte und die Antwort in der Schleife abfange. Da die Antwort normalerweise sehr schnell da ist, blockiert nichts. Und wenn, dann eben max. 2 Sekunden. Die NTP Abfrage mache ich ja nur alle paar Stunden.

Portweiterleitung auch an den ESP eingerichtet? Falls es überhaupt möglich ist, bin damit noch nicht in der Materie.

Erstens ist kein ESP, sondern Mega2560, bzw. Uno zum testen.
Zweitens, für was eine Portweiterleitung? Ich schick doch eine Anfrage raus, da lässt der Router den Port für die Remote-IP schön offen.

ElEspanol:
Erstens ist kein ESP, sondern Mega2560, bzw. Uno zum testen.

Erstens hast du vom verwendeten µC kein Wort verloren, daher meine Vermutung.

Zweitens, für was eine Portweiterleitung? Ich schick doch eine Anfrage raus, da lässt der Router den Port für die Remote-IP schön offen.

Zweitens bin ich, wie gesagt noch nicht in der Materie, daher war das nur ein Schuss ins Blaue :wink: