2013-01-05 13 views
5

Sunucudan bir NTP paketi almak için NTP istek paketinde ne istemem gerektiğini (istemci) bulmaya çalışıyorum. Cortex M3, Stellaris LM3S6965NTP İstek Paketi

üzerinde LWIP ile çalışıyorum Bir UDP üstbilgisini ve daha sonra farklı zaman damgaları ile NTP protokolünü alacağımı anlıyorum. Bir UDP üstbilgisi yapma ihtiyacım var ama veri olarak ne eklemek gerekiyor?

Wireshark resim: enter image description here

Sizlerin bana yardımcı olabilir umuyoruz.

cevap

1

Bu başlayanlar içindir: durumunda http://www.eecis.udel.edu/~mills/ntp/html/warp.html

Kontrol şuna Henüz yapmadıysanız: http://tools.ietf.org/html/rfc5905

Ardından şuna bakın: http://wiki.wireshark.org/NTP ve yüklediğiniz örnek pcap dosyaları göz atın.

Bu yardımcı olup olmadığından emin değilim, ama umarım öyle olur.

+1

Evet Zaten bu bağlantıları kontrol ettim. Ancak sadece gönderilen dosyaları ntp'den gönderilen dosyaları göremiyorum. – Sharpless512

3

İstemci isteği paketi, sunucu yanıt paketi ile aynıdır; emin olmak için ilk sözcükteki MODE bitlerini 3 (İstemci) olarak ayarlayın.

Tüm 48 bayt paketini sunucuya gönderir, aynı yanıt verir.

En basit paket 0x1B ve ardından 47 sıfır olur. Burada bu kodu kullanarak bir NTP sunucusuna bağlanmak için bir Arduino kodlu var

+0

Doğru yanıt, bu tür bir formatı NTP sunucusuna gönderdikten sonra, I ** bir miktar ** cevap aldı (daha önce "TimeOutException" atıldı). Belki de alınan paketin ** zamanını * nasıl çıkaracağını da söyleyebilirsiniz? Yani, alınan ** 48 bytes **, ** nasıl ** süreyi yazdırmak için "YYYY: MM: DD: HH: MM: SS" (veya başka bir format olarak)? Hangi bitler neye karşılık geliyor? – mercury0114

0

(Sürüm = 3, mod = 3), getTimeAndDate ve sendNTPpacket denilen yöntemle de

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

bak.

Bu, gönderilen pakettir. Bu bir arabellek oluşturuyor ve 48 karakter arabelleğinde ikili (0b) ve hex (0x) ayarlandığını gösteriyor. Adres

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 zaman kütüphanenin bir parçası,

İşte
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(); 

alınan pakette ne olduğudur, NTP zaman sunucusu, bu nedenle dönem saniye sayısı beri olmalıdır durumda bir C# sürümünü istiyorum

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

Ama 1 Ocak, (dönemin aramak) burada önerildiği gibi 1900 çok kodun altında derlenmiş, burada buldum istisnai bir cevap ve işe yarıyor. Bu muhtemelen size daha anlamlı gelecektir ve epoch 1/1/1900 kullanımını göstermektedir.

How to Query an NTP Server using C#?

kolayca benzerliği görebiliyor.