Hur man använder NTP med Aduino Leonardo

Placerad på

Hur fungerar NTP?

NTP använder UDP/IP-paket för dataöverföring på grund av snabba anslutningsinställningar och svarstider. Det officiella portnumret för NTP (som ntpd och ntpdate lyssnar och pratar med) är 123. Tidsenheten är i sekunder, och epoken är 1 januari 1900.

NTP-tidsstämpeln är ett 64-bitars binärt värde, byggt av ett osignerat 32-bitars sekundersvärde och en 32-bitars del. I denna notation skulle värdet 3.5 representeras av 64-bitarssträngen:

0000|0000|0000|0000|0000|0000|0000|0011 . 1000|0000|0000|0000|0000|0000|0000|0000

Om du tar alla bitarna som ett 64-bitars heltal utan tecken, lagrar det i en flyttalsvariabel med minst 64 bitar av mantissan (vanligtvis dubbelt) och gör en flyttalsdelning med 2^32, får du rätt svar. På en standard Arduino har vi tyvärr inte 64-bitars dubblar, men de flesta RTC har bara information på andra nivån, så du behöver inte hämta den andra halvan (eller första byten möjligen) Endast de första fyra byten av ett utgående NTP-paket behöver vara inställda på vad vi vill uppnå

lämpligtvis kan resten vara vad som helst.

Rubrikfälten för NTP-meddelandet är som följer:

  • LI Leap Indicator (2 bitar)
    • Detta fält indikerar om den sista minuten av den aktuella dagen ska ha en skottsekund. Fältvärdena följer:
      • 0: Ingen skottsekundsjustering
      • 1: Dagens sista minut har 61 sekunder
      • 2: Dagens sista minut har 59 sekunder
      • 3: Klockan är osynkroniserad
  • VN NTP-versionsnummer (3 bitar) (nuvarande version är 4).
  • Läge NTP-paketläge (3 bitar)
    • Värdena i fältet Läge följer:
      • 0: Reserverad
      • 1: Symmetrisk aktiv
      • 2: Symmetrisk passiv
      • 3: Kund
      • 4: Server
      • 5: Sändning
      • 6: NTP-kontrollmeddelande
      • 7: Reserverad för privat bruk
  • Stratumnivå för tidskällan (8 bitar)
    • Värdena i fältet Stratum följer:
      • 0: Ospecificerat eller ogiltigt
      • 1: Primär server
      • 2–15: Sekundär server
      • 16: Osynkroniserad
      • 17–255: Reserverad
  • Omröstning Omröstningsintervall (8-bitars heltal med tecken)
    • Log2-värdet för det maximala intervallet mellan på varandra följande NTP-meddelanden, i sekunder.
  • Precision Clock precision (8-bitars signerat heltal)
    • Systemklockans precision, i log2 sekunder.
  • NTP första fyra byte 0xEC0600E3

Detta är NTP-begärans huvud men vi behöver bara de första 32 bitarna. Vi definierar NTP PACKET SIZE detta är 48 byte eftersom NTP-tidsstämpeln finns i meddelandets första 48 byte efter en lyckad fråga, vi kommer att få ett 48-byte svar från NTP-servern.

För att förstå strukturen för en NTP-fråga och svar, se http://www.cisco.com/c/en/us/about/press/internet-protocol-journal/back-issues/table-contents-58/154-ntp.html

Så om vi vill läsa "Sändningstidsstämpeln" måste vi läsa heltalsdelen som är byte 40,41,42,43 om vi vill runda av till närmaste sekund om vi vill ha en viss noggrannhet då är bråkdelen byte 44, 45,46,47 om det är större än 500ms kommer byte 44 att vara > 128 och genom att endast kontrollera byte 44 i svaret kan vi runda av till nästa sekund; 90 % av NTP-servrarna har nätverksfördröjningar under 100 ms

Vi kan också ta hänsyn till en antagen genomsnittlig nätverksfördröjning på 50ms, och alltså istället för att jämföra med 128 kan du jämföra med (0,5s - 0,05s) * 256 = 115;

Nuvarande sida 3. Hur fungerar NTP? 1. Introduktion 2. Schemat 3. Hur fungerar NTP? 4. DS3231 modul 5. LCD-skärmen 6. ESP8266 7. Fullständigt program Postat av

Kommentarer

Webwinkelkeur Kiyoh Trustpilot Opencircuit