Re: příjem NTP ESP8266/32

Petr Labaj labaj na volny.cz
Neděle Červenec 24 00:43:20 CEST 2022


Sakryš, to je ale chytrý server, ten Cisco switch.
Má blbě čas, ale stejně ho vrátí a jenom nastaví nějaký parametr.

Kdysi jsem musel napsat vlastní časový server (s protokolem rdate).
Tak jsem to udělal jednoduše tak, že dokud neměl od nadřízeného serveru 
přesný čas, tak prostě službu neposkytoval a žádost odmítl.
Rozumný klient (toho jsem psal taky) má seznam serverů. Tak když jeden 
službu neposkytuje, osloví dalšího.
Nojo, no. Nejsem tak chytrý jako Cisco.

PL

*********************

Dne 23.7.2022 v 23:20 Dodo Racek napsal(a):
> Okrem precitaneho casu z paketu sledujte aj stratum.
> Cim nizsie cislo, tym lepsie. (0- atomove hodiny, 1- synchronizovane 
> voci atomovym hodinam, 2- synchronizovane voci 1, atd...) na internete 
> bezne server bude mat stratum 2-3.
> Server MUSI mat stratum rovnake cislo.
> Ak serveru vypadne synchronizacia na presnejsi nadradeny, tak to 
> "oznami" klientom zmenou hodnoty v stratum. Cisla nad 10 sa pouzivaju 
> pre nepresny cas (lokalny oscilator bez synchronizacie), takemu casu 
> sa neveri.
>
> Ked sa nejedna o utok, ale o to, ze aj nadradeny server stratil presny 
> cas a oznamuje bludy, tak vam nepomoze ani 1000 nacitani a porovnavani.
>
> Ak je NTP server napr. cisco switch, alebo router, tak obycajne nema 
> vlastne HW hodiny. Po zapnuti, alebo reboote oznamuje klientom 
> nezmyselny cas az do chvile, kym sa nezosynchronizuje s nadradenym ntp 
> sevrom. To moze trvat aj 15 min. Oznamuje ale definovanym 
> (nakonfigurovanym) vysokym cislom pre stratum.
>
> Voci akemu NTP serveru (FQDN,IP) sa zvyknete synchronizovat?
>
>
> Dodo
>
> Dňa so 23. 7. 2022, 21:28 Petr Zapadlo <zapik na email.cz> napísal(a):
>
>     Zdravím,
>
>     na většině projektů, kde je  třeba   čas, tak ho synchronizuji z NTP.
>     Občas (třeba  jednou za půl roku) se stane, že ESP získá špatný čas.
>     Pokusil jsem se to eliminovat  - načítám čas 3x a porovnávám -
>     použiji
>     dvě hodnoty, které mají minimální rozestup. (pokud se nesejdou,
>     tak to
>     ignoruji a zkouším znova)
>
>     Situace se zlepšila, přesto občas k problému dojde. Zdá se, že
>     četnost
>     nějak závisí i na kvalitě internetové linky.  U mě doma se to
>     prakticky
>     neděje (Metronet, DSL, modem Terminator) , ale u známé se to děje
>     poměrně často (měsíčně) (O2, DSL, modem ZTE), u syna tak jednou za
>     půl
>     roku (kabelovka Vodafone).
>
>     Vypadá to, že za nějakých podmínek projde UDP stackem v ESP i paket,
>     který není v pořádku - asi má i vadný checksum, ale vzhledem k
>     četnosti
>     to nejsem schopen nijak ověřit.  Případně projde nesmyslný paket
>     (ale to
>     by měl eliminovat požadavek na 2 stejné hodnoty).
>
>     Jak se divám do struktury NTP paketu, tak tam už žádný kontrolní
>     mechanizmus není. (dívám se dobře?)
>
>     Základní kus kodu je vzat z mnohokrát opakovaného příkladu:
>
>     Poslání paketu:
>
>       memset(packetBuffer, 0, NTP_PACKET_SIZE);
>        // Initialize values needed to form NTP request
>        // (see URL above for details on the packets)
>        packetBuffer[0] = 0b11100011;   // LI, Version, Mode
>        packetBuffer[1] = 0;     // Stratum, or type of clock
>        packetBuffer[2] = 6;     // Polling Interval
>        packetBuffer[3] = 0xEC;  // Peer Clock Precision
>        // 8 bytes of zero for Root Delay & Root Dispersion
>        packetBuffer[12]  = 49;
>        packetBuffer[13]  = 0x4E;
>        packetBuffer[14]  = 49;
>        packetBuffer[15]  = 52;
>
>        // all NTP fields have been given values, now
>        // you can send a packet requesting a timestamp:
>        _ntp_udp.beginPacket(timeServerIP, 123); //NTP requests are to
>     port 123
>        _ntp_udp.write(packetBuffer, NTP_PACKET_SIZE);
>        _ntp_udp.endPacket();
>
>
>     Příjem paketu:
>
>     _ntp_udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into
>     the buffer
>
>          //the timestamp starts at byte 40 of the received packet and is
>     four bytes,
>          // or two words, long. First, esxtract the two words:
>
>          unsigned long highWord = word(packetBuffer[40],
>     packetBuffer[41]);
>          unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
>
>
>     Jak zvýšit spolehlivost a eliminovat blbý čas?
>
>
>     Díky
>
>     Petr_______________________________________________
>



Další informace o konferenci Hw-list