WPS mit dem ESP8266

WPS oder auch WiFi-Protected-Setup ist eine Methode um ein Gerät am WLAN-Netzwerk anzumelden ohne SSID und Passwort eingeben zu müssen. Bei vielen WLAN-Projekten wird SSID und Passwort im Programmcode definiert. Das heißt, dass das Programm für jedes WLAN neu kompiliert werden muss. Mit WPS ist das nicht notwendig und man kann einen Controler mit einem einmal kompilierten Programm an verschiedenen WLANs anmelden.

Der ESP8266 kann das ganz einfach. Wir brauchen nur eine Taste von irgendeinem GPIO Pin gegen Masse, mit der wir den Vorgang starten können.

Code:

 

#include <ESP8266WiFi.h>
#define WPS D4 //Pin für den WPS Taster


//Startet die WPS Konfiguration
bool startWPS() {
  Serial.println("WPS Konfiguration gestartet");
  bool wpsSuccess = WiFi.beginWPSConfig();
  if(wpsSuccess) {
      // Muss nicht immer erfolgreich heißen! Nach einem Timeout bist die SSID leer
      String newSSID = WiFi.SSID();
      if(newSSID.length() > 0) {
        // Nur wenn eine SSID gefunden wurde waren wir erfolgreich 
        Serial.printf("WPS fertig. Erfolgreich angemeldet an SSID '%s'\n", newSSID.c_str());
      } else {
        wpsSuccess = false;
      }
  }
  return wpsSuccess; 
}

//Setup Funktion
void setup() {
  Serial.begin(74880); //mit 74880 sind auch die Meldungen beim Start sichtbar
  Serial.setDebugOutput(true); //Wenn true werden zusätzliche Debug Informationen ausgegeben
  delay(1000);
  Serial.printf("\nVersuche Verbindung mit gespeicherter SSID '%s'\n", WiFi.SSID().c_str());
  pinMode(WPS, INPUT_PULLUP); //Taster Eingang aktivieren

  WiFi.mode(WIFI_STA);
  WiFi.begin(WiFi.SSID().c_str(),WiFi.psk().c_str()); // letzte gespeicherte Zugangsdaten
  int cnt = 0;
  //Wir versuchen eine Anmeldung
  while ((WiFi.status() == WL_DISCONNECTED) && (cnt < 10)){
    delay(500);
    Serial.print(".");
    cnt++;
  }

  wl_status_t status = WiFi.status();
  if(status == WL_CONNECTED) {
    Serial.printf("\nErfolgreich angemeldet an SSID '%s'\n", WiFi.SSID().c_str());
  } else {
    //Wir waren nicht erfolgreich starten daher WPS
    Serial.printf("\nKann keine WiFi Verbindung herstellen. Status ='%d'\n", status); 
    Serial.println("WPS Taste am Router drücken.\n WPS Taste am ESP drücken!");
    while (digitalRead(WPS)!=0) {yield();}   
    if(!startWPS()) {
       Serial.println("Keine Verbindung über WPS herstellbar");  
    }
  } 
}


void loop() {
  // Code fürs Programm

}

 

 Ein bestehendes Projekt lässt sich sehr einfach mit der WPS-Funktion erweitern.

Statt der fest definierten SSID und Passwort verwenden wir die Werte die sich der ESP8266 im Flash-Speicher gemerkt hat.

WiFi.begin(WiFi.SSID().c_str(),WiFi.psk().c_str());

Sollte damit keine Verbindung möglich sein, wird ein entsprechender Text ausgegeben, dass WPS zuerst am Router und dann durch das Drücken unseres Tasters gestartet werden soll. Statt der Textausgabe könnte man z.B. eine LED aufleuchten lassen. Nachdem erkannt wurde, dass der Taster gedrückt wurde, rufen wir die Funktion startWPS auf, die den Rest erledigt.

In der Arduino IDE solltet ihr im Werkzeug-Menü beim Board "Erase-Flash:" auf Sketch + WiFi Settings setzen, damit beim nächsten Start wieder ein WPS stattfinden kann. Sonst werden nach einem erfolgreichen WPS die gespeicherten Zugangsdaten verwendet.

Erase Flash

Wichtiger Hinweis: Achtet darauf, dass die richtige ESP8266 Software installiert ist. Dazu öffnet ihr den Boardverwalter und scrollt nach unten bis ihr den esp8266 findet. Hier sollte die Version 2.5 oder höher installiert werden. Bei der Version 2.4.2 war die WPS Funktion disabled. Bei älteren Versionen hat sie auch funktioniert.

 

 

Letzter Artikel Retro Uhr mit ESP, RTC und LED-Matrix
Neuer Artikel Eigenen Treiber "Entwickeln" auf Basis von FTDI -Teil 2

Kommentar

DaMich - April 18, 2019

Einfach genial!!!

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe