// 2012-05-15 David Goncalves // Simple function to get time from an NTP server // // This code is provided as is for testing purpose. // You can use it for free at your own risks. unsigned long GetTimeFromNTPServer( byte *address, byte timeout ) { static EthernetUDP udp_handler; // Create a 48 byte buffer and clear it as NTP data is 48 bytes long byte PacketBuffer[ 48 ]; memset( PacketBuffer, 0, 48 ); PacketBuffer[0] = 0b11100011; // [11] Leap Indicator // [100] NTP Version 4 // [011] Mode 3 -> NTP Client PacketBuffer[1] = 0; PacketBuffer[2] = 6; PacketBuffer[3] = 0xEC; udp_handler.begin( 9999 ); udp_handler.beginPacket( address, 123 ); udp_handler.write( PacketBuffer, 48 ); udp_handler.endPacket(); unsigned long time_sent = millis(); unsigned long secs = 0; while ( millis() < ( ( timeout * 1000 ) + time_sent ) ) { if ( udp_handler.parsePacket() ) { udp_handler.read( PacketBuffer, 48 ); // We only get the 32 bits containing the seconds ( bytes 40 -> 43 ) as we // do not need microseconds precision. // NTP protocol gives time in seconds since 1900.01.01 so 2208988800s earlier // than unix time which is from 1970.01.01. unsigned long msb = word( PacketBuffer[40], PacketBuffer[41] ); unsigned long lsb = word( PacketBuffer[42], PacketBuffer[43] ); secs = msb << 16 | lsb; secs -= 2208988800UL; break; } delay( 200 ); // wait 200ms before each try } return( secs ); }