Re: příjem NTP ESP8266/32

spam na nagano.cz spam na nagano.cz
Sobota Červenec 23 22:02:11 CEST 2022


Má read ošetřený návratový kód?
L.

Sent from MailDroid

-----Original Message-----
From: Petr Zapadlo <zapik na email.cz>
To: HW-news <hw-list na list.hw.cz>
Sent: so, 23 čvc 2022 21:28
Subject: příjem NTP ESP8266/32

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


_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20220723/54accb67/attachment.htm>


Další informace o konferenci Hw-list