2013-01-05 11 views
5

私は、サーバからNTPパッケージを取得するために、NTPリクエストパッケージ内で(クライアント)を送信する必要があるかどうかを調べようとしています。私はCortex M3のLWIP、Stellaris、LM3S6965と協力しています。NTPリクエストパケット

私はUDPヘッダーを受け取った後、タイムスタンプの異なるNTPプロトコルを受信して​​レイテンシを削除することを理解します。 UDPヘッダーを作成する必要がありますが、データとして追加する必要はありますか?

のwiresharkの画像: enter image description here

私はあなたたちが私を助けることができると思います。

答えて

1

これは初心者のためのものです:http://tools.ietf.org/html/rfc5905

次にこれを見て:http://wiki.wireshark.org/NTP、彼らがアップロードしたサンプルのpcapファイルをチェックアウトし、このうち、あなたがまだ持っていない場合はhttp://www.eecis.udel.edu/~mills/ntp/html/warp.html

チェック。

これが役に立ったかどうかわかりませんが、私はそう望みます。

+1

ええすでにこれらのリンクが確認されています。しかし、私は送信されたファイルではなく、ntpから受け取ったファイルのみを見ることができます。 – Sharpless512

3

クライアントリクエストパケットは、サーバ応答パケットと同じです。最初のワードのMODEビットを3(クライアント)に設定するだけです。

48バイトのパケット全体をサーバーに送信すると、同じ応答が返されます。

最も単純なパケットは0x1Bで、その後に47個のゼロが続きます。私はここにこのコードを使用してNTPサーバーに接続するのArduinoをコード化している

+0

正解は、このような形式をNTPサーバーに送信した後、私は**応答を受け取りました(以前は "TimeOutException"がスローされました)。 おそらく、受信したパケットから**時間を抽出する方法を知ることもできますか?つまり、受け取った** 48バイト**から、**印刷する時間を "YYYY:MM:DD:HH:MM:SS"(または他の形式)とする方法は?どのビットが何に対応していますか? – mercury0114

0

(バージョン= 3、モード= 3)、getTimeAndDate、およびsendNTPpacketと呼ばれる方法で

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

ルック。

これは送信されるパケットです。これは、バッファを設定しており、バイナリ(0b)と16進数(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); 

のsetTimeはarduinoの時間ライブラリの一部であるので、エポックは、からの秒数でなければなりませんここで提案として1900年1月1日(エポックを検索)、

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

しかし、場合にあなたがC#バージョンが欲しい、私は下のコードをコンパイルし、ここでこれを見つけました例外的な答えとそれは動作します。これはおそらくあなたにとってより意味をなさないでしょうし、1900年1月1日の時代の使用を示しています。

How to Query an NTP Server using C#?

簡単に類似性を見ることができます。

関連する問題