<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> Arduino >> 瀏覽文章

        網絡通信:從NTP服務器獲取網絡時間

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年05月15日   【字體:
           今天帶來的是一個UDP網絡通信的擴展應用:通過向NTP服務器發起一個請求,從服務器獲得當前準確的網絡時間,然后通過串口打印出來。這個應用不是我的原創,實際上僅僅是從Arduino示范程序中拷貝過來,對于這些代碼,我幾乎沒有做什么調整,甚至連程序的注釋都保留了原貌。通過這個程序,可以看出Rainbow的UDP網絡通信API完全和Arduino保持兼容。Arduino原創地址:http://arduino.cc/en/Tutorial/UdpNtpClient
         
            下圖是程序運行后,通過串口調試工具看到的效果:
         
               在軟件包的“Projects\UDP-NtpClient”文件夾包含了本文的完整工程,可以直接編譯、燒寫和調試。程序代碼如下,程序邏輯比較簡單,請自行分析:
        #include "WProgram.h"
        #include "Ethernet.h"
        #include "EthernetUDP.h"
         
        byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
        unsigned int localPort = 8888;      // local port to listen for UDP packets
         
        IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov NTP server
        // IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov NTP server
        // IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov NTP server
         
        const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message
         
        byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets 
         
        // A UDP instance to let us send and receive packets over UDP
        EthernetUDP Udp;
         
        // send an NTP request to the time server at the given address 
        void sendNTPpacket(IPAddress& address)
        {
          // set all bytes in the buffer to 0
          memset(packetBuffer, 0, NTP_PACKET_SIZE); 
          // Initialize values needed to form NTP request
          // (see URL above for details on the packets)
          packetBuffer[0] = 0xe3;  // LI, Version, Mode
          packetBuffer[1] = 0;     // Stratum, or type of clock
          packetBuffer[2] = 6;     // Polling Interval
          packetBuffer[3] = 0xEC;  // Peer Clock Precision
          // 8 bytes of zero for Root Delay & Root Dispersion
          packetBuffer[12]  = 49; 
          packetBuffer[13]  = 0x4E;
          packetBuffer[14]  = 49;
          packetBuffer[15]  = 52;
         
          // all NTP fields have been given values, now
          // you can send a packet requesting a timestamp:   
          Udp.beginPacket(address, 123); //NTP requests are to port 123
          Udp.write(packetBuffer,NTP_PACKET_SIZE);
          Udp.endPacket(); 
        }
         
        void setup() 
        {
          // Open serial communications and wait for port to open:
          Serial.begin(9600);
          while (!Serial) 
          {
            ; // wait for serial port to connect. Needed for Leonardo only
          }
         
          // start Ethernet and UDP
          if (Ethernet.begin(mac) == 0) 
          {
            Serial.println("Failed to configure Ethernet using DHCP");
            // no point in carrying on, so do nothing forevermore:
            for(;;)
              ;
          }
          Udp.begin(localPort);
        }
         
        void loop()
        {
          sendNTPpacket(timeServer); // send an NTP packet to a time server
         
          // wait to see if a reply is available
          delay(1000);  
          if ( Udp.parsePacket() ) 
          {  
            // We've received a packet, read the data from it
            Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
         
            //the timestamp starts at byte 40 of the received packet and is four bytes,
            // or two words, long. First, esxtract the two words:
         
            unsigned long highWord = (packetBuffer[40] << 8) | packetBuffer[41];
            unsigned long lowWord = (packetBuffer[42] << 8) | packetBuffer[43];  
            // combine the four bytes (two words) into a long integer
            // this is NTP time (seconds since Jan 1 1900):
            unsigned long secsSince1900 = highWord << 16 | lowWord;  
            Serial.print("Seconds since Jan 1 1900 = " );
            Serial.println(secsSince1900);               
         
            // now convert NTP time into everyday time:
            Serial.print("Unix time = ");
            // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
            const unsigned long seventyYears = 2208988800UL;     
            // subtract seventy years:
            unsigned long epoch = secsSince1900 - seventyYears;  
            // print Unix time:
            Serial.println(epoch);                               
         
            // print the hour, minute and second:
            Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
            Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
            Serial.print(':');  
            if ( ((epoch % 3600) / 60) < 10 ) 
            {
              // In the first 10 minutes of each hour, we'll want a leading '0'
              Serial.print('0');
            }
         
            Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
            Serial.print(':'); 
            if ( (epoch % 60) < 10 ) 
           {
              // In the first 10 seconds of each minute, we'll want a leading '0'
              Serial.print('0');
            }
            Serial.println(epoch `); // print the second
          }
         
          // wait ten seconds before asking for the time again
          delay(10000); 
        }
         
        int main()
        {
          //初始化Rainbow
          boardInit();
         
          setup();
          while(1) loop();
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮