Arduinoでイーサシールドを扱うとき、通信不具合を復旧できないのですが?
Arduino特有の問題というより、TCP/IPを詳しく知らないため、対策が頭打ちです。
イーサシールドに互換のある、W5100やenc28j60といったボードを使っているのですが、時折、通信に不具合が起きるらしく、不具合へ対応するコードが書けずにいます。
対策として、watchdogで再起動するのですが、どうも、失敗があります。原因は、ルータのクライアント一覧にあるとだめらしく、5分ほど置いてから再起動すると大丈夫なのです。
・arduino、httpでgetリクエストを投げる
・リクエスト処理が終わらず、8秒経つと、watchdogタイマで再起動
・3時間程度、1日程度、数週間と、頻度はばらばらで停止
通常、成功するまで再起動を続けるので、例えば、ルータ側に問題が生じても、おおむね復旧しますが、駄目な場合があり、現地対応するのですが、Arduinoの電源再投入では復旧しません。
バッファロールータに光回線とよくある構成でインターネットへ接続するのですが、ルータの管理画面にて、クライアント一覧に名前がある間、再接続を受付けません。
5分ほど待つと一覧から消えるらしく、何もなかったかのようにすんなりつながりますが、キャッシュを上書きしたり、キャッシュの有効期限を短くするなりの方法がないかなと。
自身の経験として、有線接続でも、Windows端末は、OS上で接続を切断、再度、接続すれば、すぐ通信できます。TCP/IPの正しい切断手順が守られず、再接続時に失敗しているようです。
Arduino上で再現するには、何から勉強したら良いのか、どなたか、ヒントを教えて下さる方があればと質問します。リセット操作をスケッチで行うなどの方法がないでしょうか。