2013-01-05 4 views
5

서버에서 NTP 패키지를 검색하기 위해 NTP 요청 패키지에서 보내야 할 것이 무엇인지 알아 내려고합니다. 나는 Cortex M3의 LWIP와 함께 일하고있다. Stellaris LM3S6965NTP 요청 패킷

UDP 헤더와 NTP 프로토콜을 서로 다른 타임 스탬프와 함께 수신하면 대기 시간이 제거된다는 것을 알고있다. UDP 헤더를 만들 필요가 있지만 데이터로 추가해야하는 것은 무엇입니까?

와이어 샤크 이미지 : enter image description here

나는 너희들이 나를 도울 수 있기를 바랍니다.

답변

1

이 우선입니다 : 경우에 http://www.eecis.udel.edu/~mills/ntp/html/warp.html

확인이를 당신이 아직 있습니다 http://tools.ietf.org/html/rfc5905

그리고 이것 좀 봐 : http://wiki.wireshark.org/NTP를하고 업로드 한 샘플 PCAP 파일을 확인하십시오.

이 도움이 될지 잘 모르겠습니다.

+1

예 이미 해당 링크를 확인했습니다. 하지만 보낸 파일이 아닌 ntp에서만받은 파일을 볼 수 있습니다. – Sharpless512

3

클라이언트 요청 패킷은 서버 응답 패킷과 동일합니다. 첫 번째 단어의 MODE 비트를 3 (클라이언트)으로 설정하면됩니다.

전체 48 바이트 패킷을 서버에 보내면 동일한 응답을 보입니다.

가장 간단한 패킷은 0x1B 다음에 47 제로가됩니다. 내가 여기에이 코드를 사용하여 NTP 서버에 연결하는 아두 이노를 코딩 한

+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 문자 버퍼에 설정되었음을 보여줍니다. 주소는

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는 아두 이노 시간 라이브러리의 일부입니다,

여기
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(); 

는 수신 된 패킷에 발생하는 것입니다, NTP는 시간 서버, 그래서 시대는 초 이후이어야한다 경우에 당신은 C# 버전을 원하는

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

그러나 1 월 1 일 (시대 검색) 여기 제안 1900, 나는 코드에서 컴파일, 여기 발견 예외적 인 대답과 그것이 작동합니다. 이것은 아마도 당신에게 더 이해 될 것이며, 1900 년 1 월 1 일의 시대의 사용을 보여줄 것입니다.

How to Query an NTP Server using C#?

쉽게 유사성을 볼 수 있습니다.