AceTimeClock  1.2.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)
10 
11 #include <stdint.h>
12 #if defined(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 
48 class NtpClock: public Clock {
49  public:
51  static const char kNtpServerName[];
52 
54  static const uint16_t kLocalPort = 2390;
55 
57  static const uint16_t kRequestTimeoutMillis = 1000;
58 
60  static const uint16_t kRequestTimeout = kRequestTimeoutMillis;
61 
63  static const uint16_t kConnectTimeoutMillis = 10000;
64 
71  explicit NtpClock(
72  const char* server = kNtpServerName,
73  uint16_t localPort = kLocalPort,
74  uint16_t requestTimeout = kRequestTimeoutMillis):
75  mServer(server),
76  mLocalPort(localPort),
77  mRequestTimeout(requestTimeout) {}
78 
89  void setup(
90  const char* ssid = nullptr,
91  const char* password = nullptr,
92  uint16_t connectTimeoutMillis = kConnectTimeoutMillis);
93 
95  const char* getServer() const { return mServer; }
96 
98  bool isSetup() const { return mIsSetUp; }
99 
100  acetime_t getNow() const override;
101 
102  void sendRequest() const override;
103 
104  bool isResponseReady() const override;
105 
106  acetime_t readResponse() const override;
107 
108  private:
110  static const uint8_t kNtpPacketSize = 48;
111 
116  static const uint32_t kSecondsSinceNtpEpoch = 3155673600;
117 
119  void sendNtpPacket(const IPAddress& address) const;
120 
121  private:
122  const char* const mServer;
123  uint16_t const mLocalPort;
124  uint16_t const mRequestTimeout;
125 
126  mutable WiFiUDP mUdp;
127  // buffer to hold incoming & outgoing packets
128  mutable uint8_t mPacketBuffer[kNtpPacketSize];
129  bool mIsSetUp = false;
130 };
131 
132 }
133 }
134 
135 #endif // defined(ESP8266) || defined(ESP32)
136 
137 #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:48
const char * getServer() const
Return the name of the NTP server.
Definition: NtpClock.h:95
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:54
static const char kNtpServerName[]
Default NTP Server.
Definition: NtpClock.h:51
static const uint16_t kConnectTimeoutMillis
Number of millis to wait during connect before timing out.
Definition: NtpClock.h:63
static const uint16_t kRequestTimeoutMillis
Request time out milliseconds.
Definition: NtpClock.h:57
NtpClock(const char *server=kNtpServerName, uint16_t localPort=kLocalPort, uint16_t requestTimeout=kRequestTimeoutMillis)
Constructor.
Definition: NtpClock.h:71
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:98
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:60