ESP-IDFを使ってみる

WiFi Power Save機能


esp32にはWiFiのPower Save機能が有りますが、これが原因でWiFi通信が正常にできないことが有ります。
私の場合、UDPのBroadcastメッセージを受信するアプリがどうしても動かなったので、
espressifの技術者に問合せして、WiFiのPower Save機能をOFFにすることで解決しました。

WiFiのPower Save機能では以下の3つのモードを選ぶことができますが、デフォルトでは「WIFI_PS_MIN_MODEM」になっています。
・WIFI_PS_NONE
節電なし
・WIFI_PS_MIN_MODEM
モデム省電力。このモードでは、ステーションはDTIM期間ごとにビーコンを受信するために起動します。
・WIFI_PS_MAX_MODEM
最大モデム省電力。このモードでは、ビーコンを受信する間隔は、wifi_sta_config_tのlisten_intervalパラメー ター によって決まります。

「WIFI_PS_MIN_MODEM」の状態では、UDPのメッセージ受信が正しく動きませんでした。
そこで、以下の様にWiFiの初期化関数の中で、節電なしのモードに変更することで正しく動くようになりました。
void wifi_init_sta()
{
    xEventGroup = xEventGroupCreate();

    tcpip_adapter_init();
    ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL) );

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = EXAMPLE_ESP_WIFI_SSID,
            .password = EXAMPLE_ESP_WIFI_PASS
        },
    };

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );

    wifi_ps_type_t type;
    ESP_ERROR_CHECK(esp_wifi_get_ps(&type));
    ESP_LOGI(TAG,"esp_wifi_get_ps=%d",type);
    if (type == WIFI_PS_NONE) {
        ESP_LOGI(TAG,"WIFI_PS_NONE");
    } else if (type == WIFI_PS_MIN_MODEM) {
        ESP_LOGI(TAG,"WIFI_PS_MIN_MODEM");
    } else if (type == WIFI_PS_MAX_MODEM) {
        ESP_LOGI(TAG,"WIFI_PS_MAX_MODEM");
    }

    ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE));


    ESP_ERROR_CHECK(esp_wifi_start() );

    ESP_LOGI(TAG, "wifi_init_sta finished.");
    ESP_LOGI(TAG, "connect to ap SSID:%s password:%s",
             EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
}

WiFiのPower Save機能については、こ ちらに少しだけ説明が有りますが、分かるまでメチャクチャはまりました。

続く...