Skip to main content


 

W5100 sockety zase zase zase!


Tak pro připomenutí: https://nerdica.net/display/a85d7459-205c-dc54-49db-a4d103232299

Dnes je to 29 dní, takže výtuh mě nepřekvapil. Ukazují se dvě velmi důležité věci, tedy padlé naděje:

1) prodloužit delay(X) těsně před client.stop() z 1 ms na 8 ms, jak doporučil @Kamil Zmeškal , ničemu nepomohlo

2) zkompilovat nejnovější knihovny z Arduino 1.8.9 nepomohlo

Dále se mi povedlo lépe než dřív zdokumentovat postup vedoucí k "vytuhnutí" (nejedná se o skutečný výtuh, všechno funguje, viz níže):

1) normálně používám daný web já ze stolního počítače z Google Chrome. Takto to m... show more

Možná by bylo zajímavé dumpnout síťový provoz za pomocí nějakého packet snifferu do souboru a podívat se, např. ve Wiresharku, jak si mezi sebou povídají. Mnohokrát mi to pomohlo.

tak máme 16.7., a výtuh se opět objevil. Zkusil jsem tedy wireshark a vidím tohle:
1) moje PC pošle TCP SYN paket na port 80 Arduina
2) Arduino za 111 mikrosekund odpoví TCP RST paketem
3) za 2,5 milisekundy moje PC pošle TCP retransmission SYN
4) Arduino opět hned odpoví TCP RST
5) moje PC to ještě jednou zkusí TCP retransmission SYN
6) Arduino na to zase hned TCP RST

moje PC je z toho tak vydivočené, že se zeptá ARP, jestli má arduino fakt tu IP adresu, jakou si myslí, že by mít mělo - na to W5100 okamžitě odpoví, že ano, že to souhlasí.

A pak se to opakuje od začátku, stále bezvýsledně.

Co se z toho dá poznat?

To bude následek, ne příčina. Třikrát provedený nepodařený handshake a poté kontrola adres v ARP tabulce. To je správné chování. W5100 nechce navázat spojení
Ty adresy skutečně sedí? Ve Wiresharku je nutné u jednotlivých paketů zkontrolovat zdrojovou a cílovou adresu a zdrojové a cílové porty. Pomáhá mi, když si to nakreslím na kus papíru.
Další možností je, že W5100 bude vytížené

Všechny adresy sedí. W5100 nemá být čím vytížené, na ping ochotně odpovídá. Taky samotný Arduino program normálně běží. Jen ta klasická webserverovská podmínka

if (webserver.available())

asi holt nevrátí true, z nějakého neznámého důvodu. Vždycky ale až tak po měsícid od restartu, čili je to nedebugovatelné.

Může být. To že zařízení odpovídá na ping ještě neznamená, že poběží webserver, naopak je to jen známka toho, že W5100 žije. Ping pouze použije ICMP protokol k tomu, aby zjistil dostupnost stroje v síti.
V okamžiku, kdy se v kódu spouští webserver, W5100 provádí interně sekvenci několika kroků. A podle mě, je jeden z prvních právě vytvoření funkčního TCP spojení, nad kterým bude probíhat vlastní komunikace webserveru. A to nevznikne. W5100 se z nějakého důvodu rozhodne, že nedovolí tento komunikační kanál vůbec vytvořit. Výsledkem je potom „false“ na test dostupnosti webserveru.
Napadá mě několik možných příčin:
1. Síť
• Jak jsi popisoval situaci, kdy se připojí Android... show more

Předně ti děkuji, že se tím vůbec zabýváš. Debugging této záležitosti celou dobu selhává na tom, že za prvé se mi nedaří reprodukovat problém, kdy chci, a za druhé problém nastává až za několik týdnů po restartu na produkčních zařízeních, které nemají vyveden sériový port a jsou různě nainstalované v ne moc dostupných zařízeních/místech.

Teď konkrétně k jednotlivým podezřením:
- nemám jiné zařízení se stejnou MAC adresou
- v software se nic v měsíčním rytmu neděje
- chybu v programu vyloučíme, až konečně zveřejním webserverovou knihovnu (mělo být už před 16 měsíci)
- hardware nejspíš není problém, p... show more
This entry was edited (2 months ago)

Ještě k tomu, co se k daným web serverům připojuje - je to vyloženě ad-hoc, když je potřeba třeba změnit nastavení limitu vody (jednou za několik dnů při dopouštění bazénu), nebo když je potřeba zatopit v koupelně (zcela náhodně, podle počasí), nebo doma vyvětrat (na termostatu zapnout větrání).
Většinou se to pokazí tím, že se na webserver připojí někdo jiný než já, což většinou lidé dělají z mobilů. Jakože mně to funguje, funguje, pak se připojí někdo jiný, a pak mně to nefunguje, a pak už to nikomu nefunguje (minule to ještě bylo tak, že to někomu předemnou pořád ještě fungovalo).
Připadá mi, že mám jedinou možnost, než to celé vyhodím do popelnice: postavit... show more
This entry was edited (2 months ago)

No ještě máš jednu možnost: překousnout svou mužskou ješitnost (Já na to příjdu!), vzít to jako fakt (это жизнь), dát do kódu reset jednou za 14 dní a věnovat svůj drahocený čas něčemu zajímavějšímu :)

Nad tím jsem už taky přemýšlel - upřímně řečeno třeba velké servery se takto běžně provozují, ovšem reset je tam manuální a dozorovaný, protože kolem toho skáčou admini. Tu bych mohl dát auto reset, ale představ si tu smůlu, když by můj automatický systém zastavil vodu v případě havárie, a ono by to zrovna přišlo těsně před plánovaný restart, který by obratem vodu zase otevřel a havárie by se tak významně zhoršila.

Mimochodem, výše jsem psal něco o ad-hoc připojování k web serveru, ale to je velká nepravda: zapomněl jsem, že mi na serveru doma běží cron, který každou minutu tahá data jak z termostatu, tak z vodoměru/wattmetru. Takže tam provoz je neustálý. Teoreticky se může n... show more

> ovšem reset je tam manuální a dozorovaný

Ne vzdycky. Pokud mas sluzbu, ktera leakuje pamet, tak je celkem normalni reseni ji cronem semtam otocit. Ne, ze by to bylo kdovijak elegantni, ale ucel to plni a nic to nestoji...

> představ si tu smůlu

No, idealne bys mel udelat nad timhle tematem obecnejsi uvahu ohledne spolehlivosti, defaultnich stavech a bezpecnych stavech. Protoze k tomu resetu nemusi dojit jenom tim autoresetem, ale treba kvuli vypadku proudu, napetove spicce atd. atd. Chce si to promyslet, jake vlastne mas na to zarizeni pozadavky a jak je splnit. My jsme treba tohle docela resili u jednoho projektu v Energomonitoru - konkretne u spinane zasuvky jsme docela dlouho resili, jak se ma vlastne chovat treba pri vypadku spojeni na server - co se vlastne ma stat, kdyz vypadne spojeni, uzivatel na webu zmeni stav zasuvky a pak se zasuvka pripoji? Navic jsme tam jeste dumali nad soubehy s casovanym vypinanim atd. Bylo to celkem komplexni. Bohuzel si uz nepamatuju detaily, takze zadne obecne pouceni z toho projek... show more

máš pravdu, ale já jsem asi tvrdohlavý - mým cílem je zkrotit Arduino Ethernet. Už jsem si postavil "test bed" a teď studuju zdrojáky Ethernet knihoven. Začíná to být velmi zajímavé, už jsem našel fakt divné věcičky...

Tak určitě je to záslužný, jestli tam nějaký chyby najdeš, neřkuli odstraníš. Já bych se na to asi spíš vyprdnul :)

dvě poznámky k věci: za prvé - nikde není řečeno, že SW restart opraví ethernet problém, takže možná, že ani plánované restarty by nepomohly, a za druhé - to je docela bomba - mě napadlo, proč smrt přichází až čtvrtý týden: v Arduinu je počitadlo času od startu, tzv. millis(), který 25. den přeteče do záporných hodnot, pokud ho někdo uloží do signed long nebo pokud někdo špatně provádí porovnání po odečtení.

Pokud se to děje se železnou pravidelností, tak něco kolem millis() zní jako docela žhavý kandidát.

Napadá mě taková zhůvěřilost: co kdybys millis() zkusil předělat tak, že se po nějaké době a případně za nějakých podmínek (nikdo tam není připojený?) posune o těch 25 dní dopředu? Ať na to nemusíš čekat.

to je jasné, to bude součástí mého test bedu - startovat se bude s millis = 2^31-10 :-)

No jo, zas nosim drivi do lesa :) Jsem celej zhavej, na co prijdes!

posunutý čas nic nepřinesl, takže záporným millis() to není.
This entry was edited (2 months ago)

Mas mou uprimnou soustrast :(