Re: příjem NTP ESP8266/32

Petr Labaj labaj na volny.cz
Sobota Červenec 23 22:29:13 CEST 2022


Nejjednodušší na realizaci je asi zednická metoda - zvýšit počet čtení 
ze 3 třeba na 5 nebo víc.
Bude to předpokládám jenom nějaká triviální změna mezí v cyklu a pak v 
porovnání.
A hodnotu bych použil ne když se jich sejde n-1, ale jen když se jich 
sejde n.
Jinak spustit speciální ošetření, třeba čtení 10x a podobně (nebo 
logovat, ale to asi není kam).

Není to vyřešení příčiny, ale je to vyřešení výsledku.

PL

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

Dne 23.7.2022 v 21:27 Petr Zapadlo napsal(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