📶

【ESP-IDF】Pingが送信できないときの対処法

に公開

はじめに

ESP-IDFでは、疎通確認をするためにlwIPで実装されているPingを使うことがあります。しかし、設定ミスがあると正しくPingが送信されず、かつログを見ても原因が良く分からないことがあります。
この記事では、筆者がこれまで遭遇した設定ミス例と解決方法を紹介します。

原因1. IPv4/v6を正しく設定していない

esp_ping_new_session()を呼び出すときのconfig(esp_ping_config_t)の項目にある、 ping_config.target_addr.typeを確認してください。ここでアドレスタイプが設定されないと、Pingが送信されません。

例えば、以下のようなコードでは送信に失敗します。

esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
struct in_addr addr;
addr.s_addr = [IPアドレス];
inet_addr_to_ip4addr(ip_2_ip4(&ping_config.target_addr), &addr);

inet_addr_to_ip4addr()を辿っていくと分かりますが、この関数ではtarget_addr.addrのみ設定され、target_addr.typeが設定されません。

上記のようなコードで、Pingの送信先IPを指定する場合は、inet_addr_to_ip4addr()を呼び出した後に、以下のようなコードを追加する必要があります。

 ping_config.target_addr.type = ESP_IPADDR_TYPE_V4;


inet_addr_to_ip4addr()の定義

また、アドレスタイプを正しく設定していない場合、ログに以下のようなエラーが残ります。

E (****) ping_sock: send error=0

原因2: 送信に使うインタフェース指定が間違っている

esp_ping_new_session()を呼び出すときのconfig(esp_ping_config_t)の項目にある、 ping_config.interfaceを確認してください。
例えば、Wi-Fiを使用するときは、以下のようにしてインターフェースのindexを取得できます。

//esp_netif_t *netif = esp_netif_create_default_wifi_sta(); //<-Wi-Fiインタフェースを初期化するときに呼び出す
ping_config.interface = esp_netif_get_netif_impl_index(netif);

Discussion