832a47dd70
Added sanity checking of received timestamp before using it. Added millis() rollover protection in getEpochTime(). Added new function, setEpochTime(), to set NTPClient's internal currentEpoch from hardware RTC time. Changed the default updateInterval to 1 hour. Added 'Advanced_with_RTC' example to demonstrate new capabilities and accuracy.
123 lines
3.4 KiB
C++
Executable File
123 lines
3.4 KiB
C++
Executable File
#pragma once
|
|
|
|
#include "Arduino.h"
|
|
|
|
#include <Udp.h>
|
|
|
|
#define SEVENZYYEARS 2208988800UL
|
|
#define NTP_PACKET_SIZE 48
|
|
#define NTP_DEFAULT_LOCAL_PORT 1337
|
|
|
|
class NTPClient {
|
|
private:
|
|
UDP* _udp;
|
|
bool _udpSetup = false;
|
|
|
|
const char* _poolServerName = "pool.ntp.org"; // Default time server
|
|
IPAddress _poolServerIP;
|
|
unsigned int _port = NTP_DEFAULT_LOCAL_PORT;
|
|
long _timeOffset = 0;
|
|
|
|
unsigned long _updateInterval = 3600000; // In ms
|
|
|
|
unsigned long _currentEpoc = 0; // In s
|
|
unsigned long _lastUpdate = 0; // In ms
|
|
|
|
byte _packetBuffer[NTP_PACKET_SIZE];
|
|
|
|
void sendNTPPacket();
|
|
|
|
public:
|
|
NTPClient(UDP& udp);
|
|
NTPClient(UDP& udp, long timeOffset);
|
|
NTPClient(UDP& udp, const char* poolServerName);
|
|
NTPClient(UDP& udp, const char* poolServerName, long timeOffset);
|
|
NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
|
|
NTPClient(UDP& udp, IPAddress poolServerIP);
|
|
NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset);
|
|
NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset, unsigned long updateInterval);
|
|
|
|
/**
|
|
* Set time server name
|
|
*
|
|
* @param poolServerName
|
|
*/
|
|
void setPoolServerName(const char* poolServerName);
|
|
|
|
/**
|
|
* Set random local port
|
|
*/
|
|
void setRandomPort(unsigned int minValue = 49152, unsigned int maxValue = 65535);
|
|
|
|
/**
|
|
* Starts the underlying UDP client with the default local port
|
|
*/
|
|
void begin();
|
|
|
|
/**
|
|
* Starts the underlying UDP client with the specified local port
|
|
*/
|
|
void begin(unsigned int port);
|
|
|
|
/**
|
|
* This should be called in the main loop of your application. By default an update from the NTP Server is only
|
|
* made every 60 seconds. This can be configured in the NTPClient constructor.
|
|
*
|
|
* @return true on success, false on failure
|
|
*/
|
|
bool update();
|
|
|
|
/**
|
|
* This will force the update from the NTP Server.
|
|
*
|
|
* @return true on success, false on failure
|
|
*/
|
|
bool forceUpdate();
|
|
|
|
/**
|
|
* This allows to check if the NTPClient successfully received a NTP packet and set the time.
|
|
*
|
|
* @return true if time has been set, else false
|
|
*/
|
|
bool isTimeSet() const;
|
|
|
|
int getDay() const;
|
|
int getHours() const;
|
|
int getMinutes() const;
|
|
int getSeconds() const;
|
|
|
|
/**
|
|
* Changes the time offset. Useful for changing timezones dynamically
|
|
*/
|
|
void setTimeOffset(int timeOffset);
|
|
|
|
/**
|
|
* Set the update interval to another frequency. E.g. useful when the
|
|
* timeOffset should not be set in the constructor
|
|
*/
|
|
void setUpdateInterval(unsigned long updateInterval);
|
|
|
|
/**
|
|
* @return time formatted like `hh:mm:ss`
|
|
*/
|
|
String getFormattedTime() const;
|
|
|
|
/**
|
|
* @return time in seconds since Jan. 1, 1970
|
|
*/
|
|
unsigned long getEpochTime() const;
|
|
|
|
/**
|
|
* Set internal _currentEpoch from the localTime. Useful when a hardware
|
|
* RTC is used to set the initial unix time of NTPClient.
|
|
* @param localTime, current local time in seconds since Jan. 1, 1970
|
|
* @return unix epoch in seconds (GMT) since Jan. 1, 1970
|
|
*/
|
|
unsigned long setEpochTime(unsigned long localTime);
|
|
|
|
/**
|
|
* Stops the underlying UDP client
|
|
*/
|
|
void end();
|
|
};
|