<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Zdravím, odpovím tak nějak hromadně všem v jedné zprávě.</p>
<p>Ne, read návratový kod neošetřuje - dobrý nápad - read by mělo
vrátit počet byte paketu - zkusím kontrolovat, to by mohlo pomoci
na nějaké fake pakety.</p>
<p>Interní čas počítám a synchro dělám jednou za 12 hodin a při
startu, nejede mi tam nic kritického abych musel implementovat
časový fázový závěs (jestli se rybičkám rozsvítí o vteřinu dřív
anebo později je jedno :-)).</p>
<p>Jako časový server používám české pooly NTP serverů:</p>
<p>String ntp_hosts[NUM_NTP]
={"0.cz.pool.ntp.org","1.cz.pool.ntp.org","2.cz.pool.ntp.org"};<br>
</p>
<p>Prakticky to znamená, že každé čtení jde proti jinému NTP
serveru.</p>
<p>Celé jsou to zkoušel ve vlaku LEO Express do Prahy - Leoš má dost
blbou wifi, takže o výpadky tam není nouze, stejně tak o latenci
paketů jdoucí až >15s, měl jsem upravenou synchronizaci aby to
šlo co pár vteřin a ani jednou to nezablblo. Říkal jsem si, že
blbější situace už nenastane :-) (A nastala)</p>
<p>Díky</p>
<p>Petr<br>
</p>
<p><br>
</p>
<p> <br>
</p>
<p><br>
</p>
<div class="moz-cite-prefix">Dne 23. 07. 22 v 22:02 <a class="moz-txt-link-abbreviated" href="mailto:spam@nagano.cz">spam@nagano.cz</a>
napsal(a):<br>
</div>
<blockquote type="cite"
cite="mid:f1c7d302-530e-472d-8dd0-dd4aa4f2bbaa.maildroid@localhost">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div>Má read ošetřený návratový kód?<br>
L.<br>
<br>
<font color="#888888"><font color="#888888">Sent from </font><font
color="#888888"><a href="https://goo.gl/ODgwBb"
moz-do-not-send="true">MailDroid</a></font></font><br>
<br>
-----Original Message-----<br>
From: Petr Zapadlo <a class="moz-txt-link-rfc2396E" href="mailto:zapik@email.cz"><zapik@email.cz></a><br>
To: HW-news <a class="moz-txt-link-rfc2396E" href="mailto:hw-list@list.hw.cz"><hw-list@list.hw.cz></a><br>
Sent: so, 23 čvc 2022 21:28<br>
Subject: příjem NTP ESP8266/32<br>
<br>
</div>
Zdravím,
<br>
<br>
na většině projektů, kde je třeba čas, tak ho synchronizuji z
NTP. <br>
Občas (třeba jednou za půl roku) se stane, že ESP získá špatný
čas. <br>
Pokusil jsem se to eliminovat - načítám čas 3x a porovnávám -
použiji <br>
dvě hodnoty, které mají minimální rozestup. (pokud se nesejdou,
tak to <br>
ignoruji a zkouším znova)
<br>
<br>
Situace se zlepšila, přesto občas k problému dojde. Zdá se, že
četnost <br>
nějak závisí i na kvalitě internetové linky. U mě doma se to
prakticky <br>
neděje (Metronet, DSL, modem Terminator) , ale u známé se to děje
<br>
poměrně často (měsíčně) (O2, DSL, modem ZTE), u syna tak jednou za
půl <br>
roku (kabelovka Vodafone).
<br>
<br>
Vypadá to, že za nějakých podmínek projde UDP stackem v ESP i
paket, <br>
který není v pořádku - asi má i vadný checksum, ale vzhledem k
četnosti <br>
to nejsem schopen nijak ověřit. Případně projde nesmyslný paket
(ale to <br>
by měl eliminovat požadavek na 2 stejné hodnoty).
<br>
<br>
Jak se divám do struktury NTP paketu, tak tam už žádný kontrolní <br>
mechanizmus není. (dívám se dobře?)
<br>
<br>
Základní kus kodu je vzat z mnohokrát opakovaného příkladu:
<br>
<br>
Poslání paketu:
<br>
<br>
memset(packetBuffer, 0, NTP_PACKET_SIZE);
<br>
// Initialize values needed to form NTP request
<br>
// (see URL above for details on the packets)
<br>
packetBuffer[0] = 0b11100011; // LI, Version, Mode
<br>
packetBuffer[1] = 0; // Stratum, or type of clock
<br>
packetBuffer[2] = 6; // Polling Interval
<br>
packetBuffer[3] = 0xEC; // Peer Clock Precision
<br>
// 8 bytes of zero for Root Delay & Root Dispersion
<br>
packetBuffer[12] = 49;
<br>
packetBuffer[13] = 0x4E;
<br>
packetBuffer[14] = 49;
<br>
packetBuffer[15] = 52;
<br>
<br>
// all NTP fields have been given values, now
<br>
// you can send a packet requesting a timestamp:
<br>
_ntp_udp.beginPacket(timeServerIP, 123); //NTP requests are to
port 123
<br>
_ntp_udp.write(packetBuffer, NTP_PACKET_SIZE);
<br>
_ntp_udp.endPacket();
<br>
<br>
<br>
Příjem paketu:
<br>
<br>
_ntp_udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet
into <br>
the buffer
<br>
<br>
//the timestamp starts at byte 40 of the received packet and
is <br>
four bytes,
<br>
// or two words, long. First, esxtract the two words:
<br>
<br>
unsigned long highWord = word(packetBuffer[40],
packetBuffer[41]);
<br>
unsigned long lowWord = word(packetBuffer[42],
packetBuffer[43]);
<br>
<br>
<br>
Jak zvýšit spolehlivost a eliminovat blbý čas?
<br>
<br>
<br>
Díky
<br>
<br>
Petr
<br>
<br>
<br>
_______________________________________________
<br>
HW-list mailing list - sponsored by <a href="http://www.HW.cz"
moz-do-not-send="true">www.HW.cz</a>
<br>
<a href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
<br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list"
moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
<br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list - sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
</blockquote>
</body>
</html>