Network Time Example

The following example shows how you can design a Simple Network Time Protocol (SNTP) client. The example is ideal for devices that do not include a hardware clock.

#include <ClientConnection.h>

BaTime
getTime(void)
{
   //See http://tf.nist.gov/tf-cgi/servers.cgi
   static const char* ntps[] = {
      "time.nist.gov",
      "time-A.timefreq.bldrdoc.gov",
      // If DNS is not configured in TCP/IP stack
      "216.171.120.36", // Random IP in pool: time.nist.gov
      "132.163.4.101"  // Random IP in pool: time-A.timefreq.bldrdoc.gov
   };
   int i;
   for(i = 0 ; i < (int)(sizeof(ntps)/sizeof(ntps[0])) ; i++)
   {
      char *ptr;
      int len, totLen = 0;
      BaTime tmpTime;
      int retVal=-1;
      ClientConnection con;
      ClientConnection_constructor(&con,0,0,0);
      if(ClientConnection_open(&con,ntps[i],37,FALSE,0,FALSE) >= 0)
      {
         ptr = (char*)&tmpTime;
         while(totLen < 4)
         {
            len = ClientConnection_blockRead(&con,&ptr[totLen], 4 - totLen);
            if(len <= 0)
               break;
            totLen += len;
         }
         ClientConnection_closeCon(&con);
         if(totLen == 4)
         {
            BaTime t = baNtohl(tmpTime);
            return t - 2208988800U; /* Convert from 1900 to 1970 format */
         }
      }
   }
   return 0;
}


void printTime(void)
{
   struct BaTm tm;
   BaTime t = getTime();
   baTime2tm(&tm,t);
   printf("%d-%d-%d %d:%d:%d\n",
          tm.tm_year,tm.tm_mon,tm.tm_mday,
          tm.tm_hour,tm.tm_min,tm.tm_sec);
}