Re: příjem NTP ESP8266/32

Miroslav Mraz mrazik na volny.cz
Pondělí Červenec 25 18:08:39 CEST 2022


Tak jsem asi přišel na to kde je primární problém. Už tu bylo řečeno, že 
servery v poolu mají přiřazeno k jednomu doménovému jménu více IP adres. 
Potud je to v pořádku, je celkem jedno jakou IP si vyberu. Problém je v 
tom, že tento seznam IP adres se v čase dost často mění. Daná adresa asi 
zůstává ještě nějakou dobu aktivní, ale nakonec začne buď vracet chybné 
pakety, nebo neodpovídá vůbec.
Takže po chybě je potřeba provést reconnect - nevím jak je to uděláno v 
té knihovně UDP, v unixu stačí zavřít soket a začít znovu s 
gethostbyname(). Klidně je možné použít stejné doménové jméno i pořadí v 
seznamu IP adres, stejně se dostanete na jinou IP. Kdyby člověk přečetl 
to RFC, tak by to asi věděl, ale jak se říká až selže vše, přečti si návod.

Mrazík

On 24. 07. 22 15:13, Miroslav Mraz wrote:
> Tak jsem si s tím chvíli hrál, ono se to může někdy hodit. Kontrola 
> délky přijatého paketu je sice fajn, ale zdaleka nestačí.
> https://labs.apnic.net/?p=462
> Je potřeba ještě (nejméně) kontrolovat hlavičku - v poli LI nesmí být 
> nastavena hodnota 3. Normálně se v bytu 0. vrací 0x24, při chybě 0xE4.
> Dále hodnota Stratum nesmí být 0. Pokud přijde divný paket, má správnou 
> délku, ale data jsou zřejmě nulová, protože se mi nastaví datum na 7. 
> února 2036. Pokud si tam dopíšete ještě ty 2 kontroly hlavičky, pak už 
> by to mělo fungovat správně. A skutečně se počet sekund v paketu počítá 
> od roku 1900. To musel vymyslet blbec. Bacha ty vícebytové proměnné jsou 
> ve velkém indiánu (což je pro síťové aplikace obvyklé), v knihovně je to 
> celkem správně.
> 
> if (((packetBuffer[0] >> 6) & 3) == 3) return false;
> if   (packetBuffer[1] == 0)            return false;
> 
> // zde by měla být data validní
> 
> Mrazík
> 


Další informace o konferenci Hw-list