7

サーバーから NTP パッケージを取得するために、NTP 要求パッケージで何を送信する必要があるか (クライアント) を把握しようとしています。Cortex M3、Stellaris LM3S6965 で LWIP を使用しています。

UDP ヘッダーを受信し、次にさまざまなタイムスタンプを持つ NTP プロトコルを受信して​​、レイテンシーを削除することを理解しています。UDP ヘッダーを作成する必要があると思われますが、データとして何を追加する必要がありますか?

Wireshark イメージ: ここに画像の説明を入力

皆さんが私を助けてくれることを願っています。

4

3 に答える 3

2

これは初心者向けです: http://www.eecis.udel.edu/~mills/ntp/html/warp.html

まだチェックしていない場合は、こちらをチェックしてください: https://www.rfc-editor.org/rfc/rfc5905

次に、http : //wiki.wireshark.org/NTP を見て、彼らがアップロードしたサンプルの pcap ファイルを確認してください。

これが役に立ったかどうかはわかりませんが、そう願っています。

于 2013-01-05T11:47:42.713 に答える
0

ここで、このコードを使用して NTP サーバーに接続するように Arduino をコーディングしました。

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

getTimeAndDate と呼ばれるメソッドと sendNTPpacket を見てください。

それが送信されるパケットです。これはバッファを設定しており、48 文字のバッファに設定されている 2 進数 (0b) と 16 進数 (0x) を示しています。アドレスは 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#バージョンが必要な場合は、ここで見つけ、例外の回答の下でコードをコンパイルすると機能します。これはおそらくあなたにとってより意味のあるものであり、エポック 1/1/1900 の使用を示しています。

C# を使用して NTP サーバーにクエリを実行する方法は?

類似性を簡単に確認できます。

于 2016-06-14T01:46:01.183 に答える