ESP32 で無線 LAN 通信が行えることを監視する方法を紹介します.
はじめに
『ESP32 で電動シャッターを自動制御』で作ったシステムを便利に使っていたのですが,動作してから半年くらい経過したところで,2台中の1台が応答しなくなってしまいました.
安定稼働を目指してウォッチドックタイマー監視付きの無線 LAN の再接続処理は組み込んであったのですが,それもすり抜けてしまった模様.
そこで,ゲートウェイに対して定期的に ping を行って,無線 LAN の接続状態を監視する処理を組み込むことにしました.
ping のサンプルコード
ping を行うサンプルコードは下記になります.
ping_gatway()
を呼ぶと,ゲートウェイに対して ping を行い,タイムアウトの発生回数を timeout_count に格納します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include "ping/ping.h" #include "esp_ping.h" static const uint32_t PING_COUNT = 5; static uint32_t timeout_count = 0; static esp_err_t ping_handler(ping_target_id_t id, esp_ping_found * pf) { if (pf->send_count == PING_COUNT) { timeout_count = pf->timeout_count; } return ESP_OK; } static void ping_gatway() { tcpip_adapter_ip_info_t ip_info; uint32_t count = PING_COUNT; uint32_t timeout_msec = 100; uint32_t delay_msec = 500; if (tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip_info) != ESP_OK) { timeout_count = PING_COUNT; return; } ping_deinit(); esp_ping_set_target(PING_TARGET_IP_ADDRESS_COUNT, &count, sizeof(uint32_t)); esp_ping_set_target(PING_TARGET_RCV_TIMEO, &timeout_msec, sizeof(uint32_t)); esp_ping_set_target(PING_TARGET_DELAY_TIME, &delay_msec, sizeof(uint32_t)); esp_ping_set_target(PING_TARGET_IP_ADDRESS, &(ip_info.gw.addr), sizeof(uint32_t)); esp_ping_set_target(PING_TARGET_RES_FN, &ping_handler, sizeof(ping_handler)); ping_init(); } |
監視コード全体
無線 LAN を監視するコード全体は github の kimata/esp32_wifi_io/wifi_task.c にあります.
ゲートウェイへの ping が連続してタイムアウトした場合,リセットするようにしています.
注意事項
上のほうに掲載したコードにおいて,ping_handler()
は,ping した回数 + 1回呼ばれるようです.
コメント