2013-01-05 330 views
5

我想弄清楚我需要發送(客戶端)在NTP請求包中從服務器中檢索NTP包。我正在使用Cortex M3上的LWIP,Stellaris LM3S6965NTP請求數據包

據我所知,我將收到一個UDP標頭,然後用不同的時間戳NTP協議刪除延遲。我可能需要製作一個UDP標頭,但我需要添加什麼數據?

Wireshark的圖像: enter image description here

我希望你們能幫助我。

回答

3

客戶端請求數據包與服務器回覆數據包相同 - 只需將第一個字中的MODE位設置爲3(客戶端)即可。

發送整個48字節的數據包到服務器,它會回覆相同的。

最簡單的數據包是0x1B,後面是47個零。 (版本= 3,模式= 3)

+0

正確的答案是,在將這種格式發送到NTP服務器之後,I **收到了一些**回覆(之前引發了「TimeOutException」)。 也許你也可以告訴如何從接收到的數據包中提取**時間?也就是說,從收到的** 48字節**中,如何將**打印時間設置爲「YYYY:MM:DD:HH:MM:SS」(或其他格式)?哪些位對應於什麼? – mercury0114

0

我已編碼一個Arduino這裏使用此代碼連接到NTP服務器,

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

看稱爲getTimeAndDate,和sendNTPpacket的方法。

這是發送的數據包。這是設置一個緩衝區,並顯示二進制(0b)和十六進制(0x)被設置在48個字符的緩衝區中。地址是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(); 

這裏是發生了什麼接收到的數據包,

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); 

時刻設定爲Arduino的時間庫的一部分,所以時代應該是因爲秒數1900年1月1日作爲建議在這裏(搜索時代),

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

,但如果你想有一個C#版本,我發現這個在這裏,在編譯的代碼除外答案和它的作品。這可能對你更有意義,並且顯示1/1/1900時代的使用。

How to Query an NTP Server using C#?

可以很容易看到的相似。