📶
【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