我正在尝试弄清楚我需要在NTP请求包中发送(客户端)以从服务器检索NTP包。我正在使用Cortex M3上的LWIP,Stellaris LM3S6965
据我所知,我将接收UDP头,然后使用不同时间戳的NTP协议来消除延迟。我可能需要制作UDP标头,但我需要添加什么作为数据?
wireshark图片:
我希望你们能帮助我。
答案 0 :(得分:3)
客户端请求数据包与服务器应答数据包相同 - 只需将第一个字中的MODE位设置为3(客户端)即可。
将整个48字节的数据包发送到服务器,它将以相同的方式回复。
最简单的数据包是0x1B,后跟47个零。 (版本= 3,模式= 3)
答案 1 :(得分:2)
这适用于初学者:http://www.eecis.udel.edu/~mills/ntp/html/warp.html
如果你还没有,请检查一下:http://tools.ietf.org/html/rfc5905
然后查看:http://wiki.wireshark.org/NTP并查看他们上传的示例pcap文件。
我不确定这是否有帮助,但我希望如此。
答案 2 :(得分: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时间库的一部分,所以epoch应该是自1900年1月1日以来的秒数,如此处所示(搜索纪元),
https://en.wikipedia.org/wiki/Network_Time_Protocol
但是如果你想要一个C#版本,我在这里找到了这个,在例外答案下编译代码并且它有效。这可能对你更有意义,并且确实显示了1/1/1900年纪的使用。
How to Query an NTP Server using C#?
可以很容易地看到相似性。