2013-01-05 31 views
5

Tôi đang cố gắng tìm ra những gì tôi cần gửi (máy khách) trong gói yêu cầu NTP để truy xuất gói NTP từ máy chủ. Tôi đang làm việc với LWIP trên Cortex M3, Stellaris LM3S6965Gói yêu cầu NTP

Tôi hiểu rằng tôi sẽ nhận được một tiêu đề UDP và sau đó là giao thức NTP với các dấu thời gian khác nhau xóa độ trễ. Tôi có thể cần phải tạo một tiêu đề UDP nhưng tôi cần phải thêm dữ liệu gì?

Wireshark ảnh: enter image description here

Tôi hy vọng bạn guys có thể giúp tôi.

Trả lời

1

này là dành cho người mới bắt đầu: http://www.eecis.udel.edu/~mills/ntp/html/warp.html

Kiểm tra này ra trong trường hợp bạn chưa: http://tools.ietf.org/html/rfc5905

Sau đó, xem xét điều này: http://wiki.wireshark.org/NTP và kiểm tra các tập tin pcap mẫu mà họ đã tải lên.

Tôi không chắc liệu điều này có hữu ích hay không, nhưng tôi hy vọng như vậy.

+1

Vâng Đã kiểm tra các liên kết đó. Nhưng tôi chỉ có thể nhìn thấy các tập tin nhận được từ ntp không phải là các tập tin được gửi. – Sharpless512

3

Gói yêu cầu của khách hàng giống với gói trả lời của máy chủ - chỉ cần đặt bit MODE trong từ đầu tiên thành 3 (Khách hàng) để chắc chắn.

Gửi toàn bộ gói 48 byte đến máy chủ, nó sẽ trả lời giống nhau.

Gói đơn giản nhất sẽ là 0x1B, tiếp theo là 47 số 0. (Phiên bản = 3, mode = 3)

+0

Câu trả lời đúng, sau khi gửi định dạng như vậy đến máy chủ NTP, tôi ** nhận được một số trả lời ** (trước đây là "TimeOutException" đã được ném). Có lẽ bạn cũng có thể biết cách ** trích xuất ** thời gian từ gói đã nhận? Tức là, từ ** 48 byte ** nhận được, cách ** in ** thời gian là "YYYY: MM: DD: HH: MM: SS" (hoặc dưới dạng một số định dạng khác)? Những bit nào tương ứng với cái gì? – mercury0114

0

Tôi đã mã hóa một Arduino để kết nối với một máy chủ NTP sử dụng mã này đây,

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

Nhìn vào phương pháp gọi là getTimeAndDate, và sendNTPpacket.

Đó là gói được gửi. Đây là thiết lập một bộ đệm và hiển thị nhị phân (0b) và hex (0x) được thiết lập trong bộ đệm 48 ký tự. Địa chỉ là máy chủ thời gian 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(); 

Đây là những gì xảy ra đối với các gói tin nhận được,

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 là một phần của thư viện thời gian Arduino, vì vậy thời đại nên là số giây kể từ ngày 01 tháng 1 năm 1900 như đề xuất ở đây (tìm kiếm cho kỷ nguyên),

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

Nhưng trong trường hợp bạn muốn có một phiên bản C#, tôi thấy điều này ở đây, biên soạn mã dưới câu trả lời ngoại trừ và nó hoạt động. Điều này có thể sẽ có ý nghĩa hơn với bạn, và cho thấy việc sử dụng kỷ nguyên 1/1/1900.

How to Query an NTP Server using C#?

Có thể dễ dàng thấy sự giống nhau.

Các vấn đề liên quan