AceTimeClock  1.3.0
Clock classes for Arduino that can synchronize from an NTP server or an RTC chip
NtpClock.h
1 /*
2  * MIT License
3  * Copyright (c) 2018 Brian T. Park
4  */
5 
6 #ifndef ACE_TIME_NTP_CLOCK_H
7 #define ACE_TIME_NTP_CLOCK_H
8 
9 #if defined(ESP8266) || defined(ESP32) || defined(EPOXY_CORE_ESP8266)
10 
11 #include <stdint.h>
12 #if defined(ESP8266) || defined(EPOXY_CORE_ESP8266)
13  #include <ESP8266WiFi.h>
14 #else
15  #include <WiFi.h>
16 #endif
17 #include <WiFiUdp.h>
18 #include "Clock.h"
19 
20 #ifndef ACE_TIME_NTP_CLOCK_DEBUG
21 #define ACE_TIME_NTP_CLOCK_DEBUG 0
22 #endif
23 
24 namespace ace_time {
25 namespace clock {
26 
68 class NtpClock: public Clock {
69  public:
71  static const char kNtpServerName[];
72 
74  static const uint16_t kLocalPort = 2390;
75 
77  static const uint16_t kRequestTimeoutMillis = 1000;
78 
80  static const uint16_t kRequestTimeout = kRequestTimeoutMillis;
81 
83  static const uint16_t kConnectTimeoutMillis = 10000;
84 
91  explicit NtpClock(
92  const char* server = kNtpServerName,
93  uint16_t localPort = kLocalPort,
94  uint16_t requestTimeout = kRequestTimeoutMillis):
95  mServer(server),
96  mLocalPort(localPort),
97  mRequestTimeout(requestTimeout) {}
98 
109  void setup(
110  const char* ssid = nullptr,
111  const char* password = nullptr,
112  uint16_t connectTimeoutMillis = kConnectTimeoutMillis);
113 
115  const char* getServer() const { return mServer; }
116 
118  bool isSetup() const { return mIsSetUp; }
119 
120  acetime_t getNow() const override;
121 
122  void sendRequest() const override;
123 
124  bool isResponseReady() const override;
125 
126  acetime_t readResponse() const override;
127 
143  static acetime_t convertNtpSecondsToAceTimeSeconds(uint32_t ntpSeconds);
144 
145  private:
147  static const uint8_t kNtpPacketSize = 48;
148 
153  static const int32_t kDaysToInternalEpochFromNtpEpoch = 36524;
154 
156  void sendNtpPacket(const IPAddress& address) const;
157 
158  private:
159  const char* const mServer;
160  uint16_t const mLocalPort;
161  uint16_t const mRequestTimeout;
162 
163  mutable WiFiUDP mUdp;
164  // buffer to hold incoming & outgoing packets
165  mutable uint8_t mPacketBuffer[kNtpPacketSize];
166  bool mIsSetUp = false;
167 };
168 
169 }
170 }
171 
172 #endif
173 
174 #endif
Abstract base class for objects that provide and store time.
Definition: Clock.h:19
A Clock that retrieves the time from an NTP server.
Definition: NtpClock.h:68
const char * getServer() const
Return the name of the NTP server.
Definition: NtpClock.h:115
static acetime_t convertNtpSecondsToAceTimeSeconds(uint32_t ntpSeconds)
Convert an NTP seconds to AceTime seconds relative to the current AceTime epoch defined by Epoch::cur...
Definition: NtpClock.cpp:172
acetime_t readResponse() const override
Returns number of seconds since AceTime epoch (2000-01-01).
Definition: NtpClock.cpp:123
void setup(const char *ssid=nullptr, const char *password=nullptr, uint16_t connectTimeoutMillis=kConnectTimeoutMillis)
Set up the WiFi connection using the given ssid and password, and prepare the UDP connection.
Definition: NtpClock.cpp:21
static const uint16_t kLocalPort
Default port used for UDP packets.
Definition: NtpClock.h:74
static const char kNtpServerName[]
Default NTP Server.
Definition: NtpClock.h:71
static const uint16_t kConnectTimeoutMillis
Number of millis to wait during connect before timing out.
Definition: NtpClock.h:83
static const uint16_t kRequestTimeoutMillis
Request time out milliseconds.
Definition: NtpClock.h:77
NtpClock(const char *server=kNtpServerName, uint16_t localPort=kLocalPort, uint16_t requestTimeout=kRequestTimeoutMillis)
Constructor.
Definition: NtpClock.h:91
bool isResponseReady() const override
Return true if a response is ready.
Definition: NtpClock.cpp:100
bool isSetup() const
Return true if setup() suceeded.
Definition: NtpClock.h:118
acetime_t getNow() const override
Return the number of seconds since the AceTime epoch (2000-01-01T00:00:00Z).
Definition: NtpClock.cpp:58
void sendRequest() const override
Send a time request asynchronously.
Definition: NtpClock.cpp:72
static const uint16_t kRequestTimeout
Deprecated.
Definition: NtpClock.h:80