我试图弄清楚我需要在 NTP 请求包中发送(客户端)什么以从服务器检索 NTP 包。我正在使用 Cortex M3 上的 LWIP,Stellaris LM3S6965
我知道我将收到一个 UDP 标头,然后是具有不同时间戳的 NTP 协议以消除延迟。我可能需要制作一个 UDP 标头,但我需要添加什么作为数据?
线鲨图片:
我希望你们能帮助我。
客户端请求数据包与服务器回复数据包相同 - 只需将第一个字中的 MODE 位设置为 3(客户端)即可。
将整个 48 字节的数据包发送到服务器,它会以相同的方式回复。
最简单的数据包是 0x1B 后跟 47 个零。(版本 = 3,模式 = 3)
这是给初学者的:http ://www.eecis.udel.edu/~mills/ntp/html/warp.html
如果您还没有,请检查一下:https ://www.rfc-editor.org/rfc/rfc5905
然后看看这个:http : //wiki.wireshark.org/NTP 并查看他们上传的示例 pcap 文件。
我不确定这是否有帮助,但我希望如此。
我在这里使用此代码编写了一个 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 的使用。
很容易看出相似之处。