ESP8266と通信出来ない。
ESP8266のプログラム開発中にトラブルに遭遇。 それまで、普通に行えていたOTAでのプログラム書込ができなくなったのだ。pingにも反応しない。「宛先ホストに到達できません」と出る。
arp -a
の出力にターゲットのIPアドレスが無い。WireSharkで調べるとESP8266がarpに返事していない。
“esp8266 arp”でgoogle 検索。ESP8266には,ARP関連の問題があるらしい。 「しばらくするとARPに反応しなくなる」とか「複数のESP8266があるとWiFiルータのバグでARPに反応しなくなる」などという現象が報告されている。
私も複数のESP8266を同時に動作させている。WiFiルータがARPパケットを中継しなくなるのか? WiFi側の通信状況をモニタする方法がわからないので調べられない。ルータを再起動すると症状が消えたりする。
この問題を自力で解決するのは大変そうなので、対症療法に走る。手作業でARPテーブルにESP8266のMacアドレスを登録する。
ESP8266のMacアドレスがわからないと面倒なので、まず、シリアルポートとかに表示させる。IPアドレスは表示させているので、追加する感じ。プログラムとしては、次のようになる。
uint8_t mac[6]; WiFi.macAddress(mac); Serial.print("mac:"); for(int i=0;i<6;i++) Serial.printf("%c%02x",i>0?'-':' ',mac[i]); Serial.println();
次にWindowsでARPテーブルに登録する。 arpコマンドがあるのだから、arp -s で設定できるはずだが、何故か出来ない。コマンド・プロンプトを管理者で起動してもダメ。
設定方法を検索して、「sakashita-net.jp: arp -sでARPエントリを追加しようとすると「ARP エントリを追加できませんでした: アクセスが拒否されました。」というエラーになる」というページを発見。バッチリ書いてある。
コマンド・プロンプトを管理者権限で起動し、次のコマンドでアドレスをARPテーブルに追加できる。
$ netsh interface ipv4 set neighbors "イーサネット" "192.168.0.110" "5c-cf-7f-89-88-d3"
“イーサネット”は、インターフェース名で,次のコマンドで表示できる。
$ netsh interface ipv4 show interface
とりあえず、これで開発を進められる。でも、この問題はちゃんと解決して欲しい。
最近のコメント