diff --git a/src/app.cpp b/src/app.cpp index c6a689ee..35db3f31 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -153,10 +153,13 @@ void app::onNetwork(bool gotIp) { if(gotIp) { ah::Scheduler::resetTicker(); regularTickers(); //reinstall regular tickers - every(std::bind(&app::tickSend, this), mConfig->inst.sendInterval, "tSend"); + if(!mConfig->inst.startWithoutTime) // already set in regularTickers + every(std::bind(&app::tickSend, this), mConfig->inst.sendInterval, "tSend"); mTickerInstallOnce = true; mSunrise = 0; // needs to be set to 0, to reinstall sunrise and ivComm tickers! - once(std::bind(&app::tickNtpUpdate, this), 2, "ntp2"); + + uint32_t nextTrig = (mTimestamp < 0x1337) ? 0 : (mConfig->ntp.interval * 60); + once(std::bind(&app::tickNtpUpdate, this), nextTrig, "ntp"); } } @@ -237,6 +240,7 @@ void app::tickNtpUpdate(void) { nxtTrig = mConfig->ntp.interval * 60; // check again in configured interval mNtpReceived = false; } + yield(); updateNtp(); diff --git a/src/network/AhoyNetwork.h b/src/network/AhoyNetwork.h index 4d465758..5ecb6ef4 100644 --- a/src/network/AhoyNetwork.h +++ b/src/network/AhoyNetwork.h @@ -11,9 +11,9 @@ #include "../utils/helper.h" #include "AhoyWifiAp.h" #include "AsyncJson.h" +#include #define NTP_PACKET_SIZE 48 - class AhoyNetwork { public: typedef std::function OnNetworkCB; @@ -26,6 +26,8 @@ class AhoyNetwork { mOnNetworkCB = onNetworkCB; mOnTimeCB = onTimeCB; + mNtpIp = IPAddress(0, 0, 0, 0); + if('\0' == mConfig->sys.deviceName[0]) snprintf(mConfig->sys.deviceName, DEVNAME_LEN, "%s", DEF_DEVICE_NAME); @@ -55,16 +57,37 @@ class AhoyNetwork { return ((mStatus == NetworkState::CONNECTED) || (mStatus == NetworkState::GOT_IP)); } - bool updateNtpTime(void) { - if(NetworkState::GOT_IP != mStatus) - return false; + static void dnsCallback(const char *name, const ip_addr_t *ipaddr, void *pClass) { + AhoyNetwork *obj = static_cast(pClass); + if (ipaddr) { + obj->mNtpIp = ipaddr->u_addr.ip4.addr; + } + } + + void updateNtpTime() { + if(mNtpIp != 0) { + startNtpUpdate(); + return; + } + + ip_addr_t ipaddr; + mNtpIp = WiFi.gatewayIP(); + // dns_gethostbyname runs asynchronous and sets the member mNtpIp which is then checked on + // next call of updateNtpTime + err_t err = dns_gethostbyname(mConfig->ntp.addr, &ipaddr, dnsCallback, this); + if (err == ERR_OK) { + mNtpIp = ipaddr.u_addr.ip4.addr; + startNtpUpdate(); + } + } + + protected: + void startNtpUpdate() { + DPRINTLN(DBG_INFO, F("get time from: ") + mNtpIp.toString()); if (!mUdp.connected()) { - IPAddress timeServer; - if (!WiFi.hostByName(mConfig->ntp.addr, timeServer)) - return false; - if (!mUdp.connect(timeServer, mConfig->ntp.port)) - return false; + if (!mUdp.connect(mNtpIp, mConfig->ntp.port)) + return; } mUdp.onPacket([this](AsyncUDPPacket packet) { @@ -72,7 +95,8 @@ class AhoyNetwork { }); sendNTPpacket(); - return true; + // reset to start with DNS lookup next time again + mNtpIp = IPAddress(0, 0, 0, 0); } public: @@ -185,7 +209,7 @@ class AhoyNetwork { std::swap(sort[i], sort[j]); } - private: + protected: void sendNTPpacket(void) { uint8_t buf[NTP_PACKET_SIZE]; memset(buf, 0, NTP_PACKET_SIZE); @@ -194,11 +218,6 @@ class AhoyNetwork { buf[1] = 0; // Stratum buf[2] = 6; // Max Interval between messages in seconds buf[3] = 0xEC; // Clock Precision - // bytes 4 - 11 are for Root Delay and Dispersion and were set to 0 by memset - buf[12] = 49; // four-byte reference ID identifying - buf[13] = 0x4E; - buf[14] = 49; - buf[15] = 52; mUdp.write(buf, NTP_PACKET_SIZE); } @@ -245,6 +264,8 @@ class AhoyNetwork { AhoyWifiAp mAp; DNSServer mDns; + IPAddress mNtpIp; + AsyncUDP mUdp; // for time server #if defined(ESP8266) WiFiEventHandler wifiConnectHandler, wifiDisconnectHandler, wifiGotIPHandler;