Come utilizzare NTP con Aduino Leonardo
Posto suCome funziona l'NTP?
NTP utilizza i pacchetti UDP/IP per il trasferimento dei dati a causa della rapida configurazione della connessione e dei tempi di risposta. Il numero di porta ufficiale per l'NTP (con cui ntpd e ntpdate ascoltano e parlano) è 123. L'unità di tempo è in secondi e l'epoca è 1 gennaio 1900.
Il timestamp NTP è un valore binario a 64 bit, costruito da un valore di secondi senza segno a 32 bit e una parte frazionaria a 32 bit. In questa notazione il valore 3.5 sarebbe rappresentato dalla stringa a 64 bit:
0000|0000|0000|0000|0000|0000|0000|0011 . 1000|0000|0000|0000|0000|0000|0000|0000
Se prendi tutti i bit come un numero intero senza segno a 64 bit, lo memorizzi in una variabile a virgola mobile con almeno 64 bit di mantissa (di solito doppia) e fai una divisione a virgola mobile per 2 ^ 32, otterrai il risposta esatta. Su un Arduino standard, sfortunatamente, non abbiamo 64 bit doppi ma la maggior parte degli RTC ha solo informazioni di secondo livello, quindi non è necessario ottenere la seconda metà (o il primo byte possibilmente) Solo i primi quattro byte di un pacchetto NTP in uscita devono essere impostato per ciò che vogliamo ottenere
opportunamente, il resto può essere qualsiasi cosa.
I campi di intestazione del messaggio NTP sono i seguenti:
- Indicatore di salto LI (2 bit)
- Questo campo indica se all'ultimo minuto del giorno corrente deve essere applicato un secondo intercalare. Seguono i valori del campo:
- 0: nessuna regolazione del secondo intercalare
- 1: l'ultimo minuto della giornata ha 61 secondi
- 2: L'ultimo minuto della giornata ha 59 secondi
- 3: L'orologio non è sincronizzato
- Questo campo indica se all'ultimo minuto del giorno corrente deve essere applicato un secondo intercalare. Seguono i valori del campo:
- VN Numero versione NTP (3 bit) (la versione corrente è 4).
- Modalità Modalità pacchetto NTP (3 bit)
- Seguono i valori del campo Mode:
- 0: riservato
- 1: Simmetrico attivo
- 2: passivo simmetrico
- 3: Cliente
- 4: servitore
- 5: Trasmissione
- 6: messaggio di controllo NTP
- 7: Riservato per uso privato
- Seguono i valori del campo Mode:
- Livello di strato della sorgente temporale (8 bit)
- Seguono i valori del campo Stratum:
- 0: non specificato o non valido
- 1: server primario
- 2–15: server secondario
- 16: non sincronizzato
- 17–255: riservato
- Seguono i valori del campo Stratum:
- Poll Intervallo di polling (intero con segno a 8 bit)
- Il valore log2 dell'intervallo massimo tra messaggi NTP successivi, in secondi.
- Precisione Precisione dell'orologio (intero con segno a 8 bit)
- La precisione dell'orologio di sistema, in log2 secondi.
- NTP primi quattro byte 0xEC0600E3
Questa è l'intestazione della richiesta NTP ma abbiamo bisogno solo dei primi 32 bit. Definiamo la DIMENSIONE DEL PACCHETTO NTP che è 48 byte perché il timestamp NTP è nei primi 48 byte del messaggio dopo una query riuscita, otterremo una risposta di 48 byte dal server NTP.
Per comprendere la struttura di una query e risposta NTP vedere http://www.cisco.com/c/en/us/about/press/internet-protocol-journal/back-issues/table-contents-58/154-ntp.html
Quindi, se vogliamo leggere il "Transmit Timestamp", allora dobbiamo leggere la parte intera che è il byte 40,41,42,43 se vogliamo arrotondare al secondo più vicino se vogliamo una certa precisione allora la parte frazionaria è il byte 44, 45,46,47 se è maggiore di 500ms il byte 44 sarà > 128 e quindi controllando solo il byte 44 della risposta, possiamo arrotondare al secondo successivo; Il 90% dei server NTP presenta ritardi di rete inferiori a 100 ms
Possiamo anche tenere conto di un ritardo di rete medio presunto di 50 ms, e quindi invece di confrontare con 128 puoi confrontare con (0,5 s - 0,05 s) * 256 = 115;