Files
cinema-display/firmware/main/wps.c
2025-10-08 07:59:23 +02:00

122 lines
4.6 KiB
C

#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
static const char *TAG = "WPS_EXAMPLE";
// Funktion, um WPS zu starten (z.B. durch Button-Interrupt aufgerufen)
void start_wps_process()
{
ESP_LOGI(TAG, "Starting WPS...");
// esp_wifi_wps_config_t wps_config = WPS_CONFIG_INIT_DEFAULT(WPS_TYPE_PBC);
// ESP_ERROR_CHECK(esp_wifi_wps_enable(&wps_config));
// ESP_ERROR_CHECK(esp_wifi_wps_start(0)); // Start WPS indefinitely (handle timeout via event)
}
static void wifi_event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{
if (event_base == WIFI_EVENT)
{
switch (event_id)
{
case WIFI_EVENT_STA_START:
ESP_LOGI(TAG, "WIFI_EVENT_STA_START: Wi-Fi station started.");
// Option 1: Start WPS direkt hier
// start_wps_process();
// Option 2: Warten auf externen Trigger (z.B. Button), siehe start_wps_process()
// Optional: Versuchen, sich normal zu verbinden, falls Zugangsdaten gespeichert sind
// esp_wifi_connect();
break;
case WIFI_EVENT_STA_CONNECTED:
ESP_LOGI(TAG, "WIFI_EVENT_STA_CONNECTED");
// Falls verbunden (z.B. aus Flash), WPS deaktivieren, falls es noch lief
// esp_wifi_wps_disable();
break;
case WIFI_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG, "WIFI_EVENT_STA_DISCONNECTED");
// Eventuell normalen Verbindungsversuch starten oder auf WPS-Trigger warten
// esp_wifi_connect(); // Oder: Warte auf Button für WPS
break;
case WIFI_EVENT_STA_WPS_ER_SUCCESS:
ESP_LOGI(TAG, "WIFI_EVENT_STA_WPS_ER_SUCCESS");
// WPS erfolgreich, Zugangsdaten wurden empfangen.
// Der Wi-Fi Stack versucht nun automatisch, sich zu verbinden.
// WPS deaktivieren.
ESP_ERROR_CHECK(esp_wifi_wps_disable());
// Optional: Zugangsdaten auslesen und speichern, falls nötig (normalerweise nicht erforderlich, da der Stack sie intern nutzt)
break;
case WIFI_EVENT_STA_WPS_ER_FAILED:
ESP_LOGI(TAG, "WIFI_EVENT_STA_WPS_ER_FAILED");
ESP_ERROR_CHECK(esp_wifi_wps_disable());
// Hier Fehlerbehandlung: Info an User, evtl. erneuten Start ermöglichen
break;
case WIFI_EVENT_STA_WPS_ER_TIMEOUT:
ESP_LOGI(TAG, "WIFI_EVENT_STA_WPS_ER_TIMEOUT");
ESP_ERROR_CHECK(esp_wifi_wps_disable());
// Hier Fehlerbehandlung: Info an User, evtl. erneuten Start ermöglichen
break;
case WIFI_EVENT_STA_WPS_ER_PIN:
ESP_LOGI(TAG, "WIFI_EVENT_STA_WPS_ER_PIN");
// Relevant für PIN-Modus
// wifi_event_sta_wps_er_pin_t* event = (wifi_event_sta_wps_er_pin_t*) event_data;
// ESP_LOGI(TAG, "WPS PIN: %.*s", event->pin_code_len, event->pin_code); // Beispiel: ESP32 generiert PIN
break;
default:
break;
}
}
else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
{
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
ESP_LOGI(TAG, "Got IP address: " IPSTR, IP2STR(&event->ip_info.ip));
// Verbindung erfolgreich hergestellt
}
}
void wifi_init_sta_wps(void)
{
// 1. NVS initialisieren
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 2. TCP/IP Stack initialisieren
ESP_ERROR_CHECK(esp_netif_init());
// 3. Event Loop erstellen
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 4. Default Wi-Fi Station Netif erstellen
esp_netif_create_default_wifi_sta();
// 5. Wi-Fi Treiber initialisieren
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 6. Event Handler registrieren
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));
// 7. Wi-Fi Modus auf Station setzen
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
// 8. Wi-Fi starten (löst WIFI_EVENT_STA_START aus)
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "Wi-Fi Initialisierung abgeschlossen.");
ESP_LOGI(TAG, "Bereit für WPS Trigger (z.B. Button-Druck oder automatischen Start in STA_START).");
}