Lightweight WIZnet W5500 NTPClient library. Includes DST and set RTC options.

Dependents:   W5500-SNTPClient-example

Committer:
star297
Date:
Thu May 02 21:08:19 2019 +0000
Revision:
2:7e5afd34bc43
Parent:
0:f8cb34a007a4
Edit example code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 0:f8cb34a007a4 1 #include "SNTPClient.h"
star297 0:f8cb34a007a4 2 #include "UDPSocket.h"
star297 0:f8cb34a007a4 3
star297 0:f8cb34a007a4 4 #define MAX_TRY_WRITE 10
star297 0:f8cb34a007a4 5 #define MAX_TRY_READ 10
star297 0:f8cb34a007a4 6
star297 0:f8cb34a007a4 7 SNTPClient::SNTPClient() : socket()
star297 0:f8cb34a007a4 8 {
star297 0:f8cb34a007a4 9
star297 0:f8cb34a007a4 10 }
star297 0:f8cb34a007a4 11
star297 0:f8cb34a007a4 12 uint32_t SNTPClient::getNTP(char * NTPpool,uint32_t tzoffset, bool dst, uint32_t setRTC)
star297 0:f8cb34a007a4 13 {
star297 0:f8cb34a007a4 14 uint32_t NTP_PACKET_SIZE = 48;
star297 0:f8cb34a007a4 15 char packetBuffer[NTP_PACKET_SIZE];
star297 0:f8cb34a007a4 16 uint32_t NTP_OFFSET = 2208988800; // UTC time
star297 0:f8cb34a007a4 17 memset(packetBuffer, 0x00, NTP_PACKET_SIZE);
star297 0:f8cb34a007a4 18 // Initialize values needed to form NTP request
star297 0:f8cb34a007a4 19 packetBuffer[0] = 0b11100011; // LI, Version, Mode
star297 0:f8cb34a007a4 20 packetBuffer[1] = 0; // Stratum, or type of clock
star297 0:f8cb34a007a4 21 packetBuffer[2] = 6; // Polling Interval
star297 0:f8cb34a007a4 22 packetBuffer[3] = 0xEC; // Peer Clock Precision
star297 0:f8cb34a007a4 23 // [4]-[11]: 8 bytes of zero for Root Delay & Root Dispersion
star297 0:f8cb34a007a4 24 packetBuffer[12] = 49;
star297 0:f8cb34a007a4 25 packetBuffer[13] = 0x4E;
star297 0:f8cb34a007a4 26 packetBuffer[14] = 49;
star297 0:f8cb34a007a4 27 packetBuffer[15] = 52;
star297 0:f8cb34a007a4 28 uint32_t recv_size = 0;
star297 0:f8cb34a007a4 29 uint32_t tries1 = MAX_TRY_WRITE;
star297 0:f8cb34a007a4 30 while ((recv_size != NTP_PACKET_SIZE) && (tries1 > 0)){
star297 0:f8cb34a007a4 31 tries1--;
star297 0:f8cb34a007a4 32 socket.set_blocking(false, 3000); // allow 500mS seconds to connect to remote server
star297 0:f8cb34a007a4 33 socket.init();
star297 0:f8cb34a007a4 34 socket.bind(0);
star297 0:f8cb34a007a4 35 if(sntp_server.set_address(NTPpool, 123) < 0)
star297 0:f8cb34a007a4 36 return false;
star297 0:f8cb34a007a4 37 socket.set_blocking(false, 200); // check for response 200mS intervals
star297 0:f8cb34a007a4 38 socket.sendTo(sntp_server, packetBuffer, NTP_PACKET_SIZE);
star297 0:f8cb34a007a4 39 uint32_t tries2 = MAX_TRY_READ;
star297 0:f8cb34a007a4 40 while ((recv_size != NTP_PACKET_SIZE) && (tries2 > 0)){
star297 0:f8cb34a007a4 41 tries2--;
star297 0:f8cb34a007a4 42 wait_ms(20);
star297 0:f8cb34a007a4 43 recv_size = socket.receiveFrom(sntp_server, packetBuffer, NTP_PACKET_SIZE);
star297 0:f8cb34a007a4 44 }
star297 0:f8cb34a007a4 45 socket.close();
star297 0:f8cb34a007a4 46 }
star297 0:f8cb34a007a4 47 if(recv_size==48){
star297 0:f8cb34a007a4 48 uint32_t secsSince1970=((packetBuffer[40]<<24)|(packetBuffer[41]<<16)|(packetBuffer[42]<<8)|packetBuffer[43])-NTP_OFFSET;
star297 0:f8cb34a007a4 49 uint32_t CETtime=(secsSince1970+(tzoffset*3600));
star297 0:f8cb34a007a4 50 // check for DST time change, only valid for europe!!!
star297 0:f8cb34a007a4 51 // see http://www.instructables.com/id/The-Arduino-and-Daylight-Saving-Time-Europe/
star297 0:f8cb34a007a4 52 uint32_t DST=0;
star297 0:f8cb34a007a4 53 if(dst){
star297 0:f8cb34a007a4 54 uint32_t dow,hour,day,month;
star297 0:f8cb34a007a4 55 char buffer[10];
star297 0:f8cb34a007a4 56 strftime(buffer, 2,"%H", localtime(&CETtime));
star297 0:f8cb34a007a4 57 hour = atoi(buffer);
star297 0:f8cb34a007a4 58 strftime(buffer, 2,"%w", localtime(&CETtime));
star297 0:f8cb34a007a4 59 dow = atoi(buffer);
star297 0:f8cb34a007a4 60 strftime(buffer, 2,"%e", localtime(&CETtime));
star297 0:f8cb34a007a4 61 day = atoi(buffer);
star297 0:f8cb34a007a4 62 strftime(buffer, 2,"%m", localtime(&CETtime));
star297 0:f8cb34a007a4 63 month = atoi(buffer);
star297 0:f8cb34a007a4 64 uint32_t previousSunday = day - dow;
star297 0:f8cb34a007a4 65 if (month > 2 && month < 9){DST=3600;}
star297 0:f8cb34a007a4 66 if (month == 2 && previousSunday >= 25 && hour >= 2){DST=3600;} // DST starts 2nd Sunday of March; 2am
star297 0:f8cb34a007a4 67 if (month == 9 && previousSunday < 25 && hour >= 2){DST=0;} // DST ends 1st Sunday of November; 2am
star297 0:f8cb34a007a4 68 }
star297 0:f8cb34a007a4 69 if (setRTC){set_time(CETtime+DST+1);} // todo: add timer code to addjust fractional second to offset MCU processing delay
star297 0:f8cb34a007a4 70 return (CETtime+DST);
star297 0:f8cb34a007a4 71 }
star297 0:f8cb34a007a4 72 else{return 0;}
star297 0:f8cb34a007a4 73 }