2013-01-05 23 views
5

Sto cercando di capire cosa devo inviare (client) nel pacchetto di richiesta NTP per recuperare un pacchetto NTP dal server. Sto lavorando con LWIP su Cortex M3, Stellaris LM3S6965NTP Request Packet

Capisco che riceverò un'intestazione UDP e quindi il protocollo NTP con i diversi timestamp rimuoverà la latenza. Probabilmente ho bisogno di creare un'intestazione UDP ma cosa devo aggiungere come dati?

immagine Wireshark: enter image description here

spero che voi mi può aiutare.

risposta

3

Il pacchetto di richiesta del client è lo stesso del pacchetto di risposta del server - è sufficiente impostare i bit MODE nella prima parola su 3 (Client) per essere sicuri.

Invia l'intero pacchetto da 48 byte al server, risponderà con lo stesso.

Il pacchetto più semplice sarebbe 0x1B seguito da 47 zeri. (Version = 3, mode = 3)

+0

Risposta corretta, dopo aver inviato tale formato al server NTP, I ** ha ricevuto qualche risposta ** (in precedenza veniva lanciata "TimeOutException"). Forse potresti anche dire come ** estrarre ** il tempo dal pacchetto ricevuto? Cioè, dai ** 48 byte ** ricevuti, come ** stampare ** come "YYYY: MM: DD: HH: MM: SS" (o come qualche altro formato)? Quali bit corrispondono a cosa? – mercury0114

0

ho codificato un Arduino di connettersi a un server NTP utilizzando questo codice qui,

http://www.instructables.com/id/Arduino-Internet-Time-Client/step2/Code/

sguardo al metodo chiamato getTimeAndDate e sendNTPpacket.

Questo è il pacchetto che viene inviato. Questo è l'impostazione di un buffer e mostra binario (0b) e hex (0x) impostato nel buffer di 48 caratteri. L'indirizzo è il server NTP,

memset(packetBuffer, 0, NTP_PACKET_SIZE); 
packetBuffer[0] = 0b11100011; 
packetBuffer[1] = 0; 
packetBuffer[2] = 6; 
packetBuffer[3] = 0xEC; 
packetBuffer[12] = 49; 
packetBuffer[13] = 0x4E; 
packetBuffer[14] = 49; 
packetBuffer[15] = 52;     
Udp.beginPacket(address, 123); 
Udp.write(packetBuffer,NTP_PACKET_SIZE); 
Udp.endPacket(); 

Ecco cosa succede al pacchetto ricevuto,

Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer 
unsigned long highWord, lowWord, epoch; 
highWord = word(packetBuffer[40], packetBuffer[41]); 
lowWord = word(packetBuffer[42], packetBuffer[43]); 
epoch = highWord << 16 | lowWord; 
epoch = epoch - 2208988800 + timeZoneOffset; 
flag=1; 
setTime(epoch); 

setTime è parte della libreria tempo arduino, quindi l'epoca dovrebbe essere il numero di secondi dal 1 gennaio 1900 come suggerito qui (cercare epoca),

https://en.wikipedia.org/wiki/Network_Time_Protocol

Ma nel caso in cui si desidera una versione C#, ho trovato questo qui, compilato il codice sotto la risposta esclusa e funziona. Questo probabilmente avrà più senso per te, e mostra l'uso dell'epoca 1/1/1900.

How to Query an NTP Server using C#?

possono facilmente vedere la somiglianza.