|
@ -246,23 +246,39 @@ class AhoyNetwork { |
|
|
mUdp.write(buf, NTP_PACKET_SIZE); |
|
|
mUdp.write(buf, NTP_PACKET_SIZE); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief Handles an incoming NTP packet and extracts the time. |
|
|
|
|
|
* |
|
|
|
|
|
* This function processes an NTP packet received via UDP. It checks if the packet |
|
|
|
|
|
* is of valid length, extracts the NTP timestamp, and invokes a callback with the |
|
|
|
|
|
* extracted time. If the packet is too small to contain valid NTP data, it signals |
|
|
|
|
|
* an error via the callback. |
|
|
|
|
|
* |
|
|
|
|
|
* @param packet The received UDP packet containing NTP data. |
|
|
|
|
|
*/ |
|
|
void handleNTPPacket(AsyncUDPPacket packet) { |
|
|
void handleNTPPacket(AsyncUDPPacket packet) { |
|
|
char buf[80]; |
|
|
if (packet.length() < 48) { |
|
|
|
|
|
// Paket ist zu klein, um gültige NTP-Daten zu enthalten
|
|
|
|
|
|
mOnTimeCB(0); // Signalisiert Fehler
|
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint8_t buf[48]; |
|
|
memcpy(buf, packet.data(), sizeof(buf)); |
|
|
memcpy(buf, packet.data(), sizeof(buf)); |
|
|
|
|
|
|
|
|
unsigned long highWord = word(buf[40], buf[41]); |
|
|
unsigned long highWord = word(buf[40], buf[41]); |
|
|
unsigned long lowWord = word(buf[42], buf[43]); |
|
|
unsigned long lowWord = word(buf[42], buf[43]); |
|
|
|
|
|
|
|
|
// combine the four bytes (two words) into a long integer
|
|
|
// Kombinieren der vier Bytes (zwei Wörter) zu einem langen Integer
|
|
|
// this is NTP time (seconds since Jan 1 1900):
|
|
|
// Dies ist die NTP-Zeit (Sekunden seit dem 1. Jan 1900):
|
|
|
unsigned long secsSince1900 = highWord << 16 | lowWord; |
|
|
unsigned long secsSince1900 = highWord << 16 | lowWord; |
|
|
|
|
|
|
|
|
mUdp.close(); |
|
|
mUdp.close(); |
|
|
mNtpTimeoutSec = 0; // clear timeout
|
|
|
mNtpTimeoutSec = 0; // Timeout zurücksetzen
|
|
|
mOnTimeCB(secsSince1900 - 2208988800UL); |
|
|
mOnTimeCB(secsSince1900 - 2208988800UL); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected: |
|
|
protected: |
|
|
enum class NetworkState : uint8_t { |
|
|
enum class NetworkState : uint8_t { |
|
|
DISCONNECTED, |
|
|
DISCONNECTED, |
|
|