From e0f280e2652c8e026165edfefc7002b6cebb0dd4 Mon Sep 17 00:00:00 2001 From: Russell Dwarshuis Date: Wed, 8 Jan 2025 10:36:18 -0500 Subject: [PATCH] added NTPupdate --- src/NTPupdate.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++ src/NTPupdate.h | 23 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/NTPupdate.cpp create mode 100644 src/NTPupdate.h diff --git a/src/NTPupdate.cpp b/src/NTPupdate.cpp new file mode 100644 index 0000000..fe33504 --- /dev/null +++ b/src/NTPupdate.cpp @@ -0,0 +1,58 @@ +#include "NTPupdate.h" + +// send an NTP request to the time server at the given address +void sendNTPpacket(IPAddress &address) { + byte packetBuffer[NTP_PACKET_SIZE]; + // 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] = 0b11100011; // 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(); +} + +time_t getNtpTime() { + IPAddress ntpServerIP; // NTP server's ip address + byte packetBuffer[NTP_PACKET_SIZE]; + + while (Udp.parsePacket() > 0) ; // discard any previously received packets + WiFi.hostByName(ntpServerName, ntpServerIP); + sendNTPpacket(ntpServerIP); + uint32_t beginWait = millis(); + while (millis() - beginWait < 1500) { + int size = Udp.parsePacket(); + if (size >= NTP_PACKET_SIZE) { + Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer + unsigned long secsSince1900; + // convert four bytes starting at location 40 to a long integer + secsSince1900 = (unsigned long)packetBuffer[40] << 24; + secsSince1900 |= (unsigned long)packetBuffer[41] << 16; + secsSince1900 |= (unsigned long)packetBuffer[42] << 8; + secsSince1900 |= (unsigned long)packetBuffer[43]; + return secsSince1900 - 2208988800UL; + } + } + return 0; // return 0 if unable to get the time +} + +void NTPupdate() { + if (!wifi) { return; } + time_t time = getNtpTime(); + if (time) { + rtc.setTime(time); + } +} + + diff --git a/src/NTPupdate.h b/src/NTPupdate.h new file mode 100644 index 0000000..30ec0a8 --- /dev/null +++ b/src/NTPupdate.h @@ -0,0 +1,23 @@ +#ifndef NTP_H +#define NTP_H + +#include +#include +#include +#include +#include +#include + +static const char ntpServerName[] = "0.pool.ntp.org"; +static const int localPort = 8944; +const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message + +extern ESP32Time rtc; +extern WiFiClient RemoteClient; +extern WiFiUDP Udp; +extern bool wifi; + +void sendNTPpacket(IPAddress &address); +void NTPupdate(); +time_t getNtpTime(); +#endif