7

我试图弄清楚我需要在 NTP 请求包中发送(客户端)什么以从服务器检索 NTP 包。我正在使用 Cortex M3 上的 LWIP,Stellaris LM3S6965

我知道我将收到一个 UDP 标头,然后是具有不同时间戳的 NTP 协议以消除延迟。我可能需要制作一个 UDP 标头,但我需要添加什么作为数据?

线鲨图片: 在此处输入图像描述

我希望你们能帮助我。

4

3 回答 3

5

客户端请求数据包与服务器回复数据包相同 - 只需将第一个字中的 MODE 位设置为 3(客户端)即可。

将整个 48 字节的数据包发送到服务器,它会以相同的方式回复。

最简单的数据包是 0x1B 后跟 47 个零。(版本 = 3,模式 = 3)

于 2014-05-22T23:20:44.810 回答
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

我在这里使用此代码编写了一个 Arduino 以连接到 NTP 服务器,

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

查看名为 getTimeAndDate 和 sendNTPpacket 的方法。

那就是发送的数据包。这是设置缓冲区并显示在 48 个字符的缓冲区中设置了二进制 (0b) 和十六进制 (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# 版本,我在这里找到了这个,在例外答案下编译了代码并且它可以工作。这可能对您更有意义,并且确实显示了 epoch 1/1/1900 的使用。

如何使用 C# 查询 NTP 服务器?

很容易看出相似之处。

于 2016-06-14T01:46:01.183 回答