WPS mit dem ESP8266 - AZ-Delivery

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.

 

 

Esp-8266Projekte für anfänger

15 Kommentare

Bruno SAVORNIN

Bruno SAVORNIN

Vielen Dank für Ihre Hilfe. Aufrichtig

Andreas Wolter

Andreas Wolter

@Bruno SAVORNIN: Sie benötigen einen anderen Core und andere Bibliotheken. Dazu müssen Sie im Menü “Board” einen ESP32 auswählen. Wenn der Core noch nicht installiert wurde, müssen Sie das vorher tun. Damit erhalten Sie die korrekten Bibliotheken und ein Beispielprogramm, den Sie im Menü “Beispiele” unter dem Punkt “WPS” finden.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Bruno SAVORNIN

Bruno SAVORNIN

Bonjour, merci de m’avoir répondu. Je pense que je me suis mai exprimé, et je vous prie de m’en excuser. J’ai installé le logiciel décrit dans l’article “wps mit dem esp8266” dans un ESP8266, et cela fonctionne parfaitement.
Ma question est la suivante : comment installer ce programme dans un ESP32 ?

Hallo, danke, dass Sie mir geantwortet haben. Ich glaube, ich habe mich vielleicht ausgedrückt, und ich entschuldige mich dafür. Ich habe die im Artikel “wps mit dem esp8266” beschriebene Software in einem ESP8266 installiert und sie funktioniert einwandfrei.
Meine Frage ist: Wie installiere ich dieses Programm in einem ESP32?
Vielen Dank für Ihre Hilfe. Aufrichtig

Andreas Wolter

Andreas Wolter

@Bruno SAVORNIN: wenn Sie im Menü unter “Board” einen ESP32 eingestellt haben, sollten Sie im Menü unter “Beispiele” den Punkt WPS finden. Versuchen Sie es damit.
Bei Github finden Sie dazu das hier:
https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFi/examples/WPS

Grüße,
Andreas Wolter
AZ-Delivery Blog

Bruno SAVORNIN

Bruno SAVORNIN

Bonjour, cela fonctionne parfaitement bien avec un ESP8266.
Je voudrais faire la même chose avec un ESP32, mais je me heurte à un message d’erreur lorsque je déclare “wifi.h” au lieu de “ESP8255wifi.h”.
Est-ce quelqu’un pourrait m’aider ? Merci. —> traduction via Google translate :

Hallo, es funktioniert perfekt mit einem ESP8266.
Ich würde das Gleiche gerne mit einem ESP32 machen, bekomme aber eine Fehlermeldung, wenn ich „wifi.h“ statt „ESP8255wifi.h“ deklariere.
Könnte mir jemand helfen? DANKE.

Gerald Lechner

Gerald Lechner

@Tim: Der ESP8266 sollte sich die Zugangsdaten merken, wenn eine Verbindung erfolgreich hergestellt wurde. Wenn das nicht funktioniert, könnten Sie die Zugangsdaten nach erfolgreicher Anmeldung im EEPROM Speicher des ESP8266 speichern. Eine Beschreibung dazu finden Sie unter dieser URL:
https://dillinger-engineering.de/esp8266-eeprom-richtig-verwenden/2020/10/?cn-reloaded=1

Tim

Tim

Moin zusammen,
das einloggen über WPS klappt bei mir. Allerdings werden die Zugangsdaten “WiFi.SSID,WiFi.psk().c_str())” nicht gespeichert und sind beim nächsten Start leer (“Erase-Flash:” beim 2. mal natürlich nur auf “only Sketch). D. h. die Werte sind leer (”") und er loggt sich dadurch wieder per WPS ein.
Ich frage im Code an anderer Stelle WiFi.localIP().toString().c_str() und ESP.getChipId() ab. Hier sind auch beide leer. In einem anderen Modul mit “manueller” Einwahl mit SSID und Passwort bekomme ich were zurück.
Ich habe es mit verschiedenen Baudraten versucht. Immer gleiches Ergebnis. Was mache ich falsch?

Gerald Lechner

Gerald Lechner

Das sollte kein Problem sein. Ich würde RXD benutzen, dann funktioniert die Ausgabe von Meldungen über die Serielle Schnittstelle weiterhin.

Jürgen Barnert

Jürgen Barnert

Vielen Dank für diesen schönen Artikel. Sehr clever. Ich habe aber ein Problem: D0 -D8 (GPIO 0,2,4,5,12,13,14,15,16) sind auf dem esp8266 belegt. Kann man für diesen Zweck (WPS) auch die GPIO 1 und 3 (RXD0 und TXDO) verwenden?

Juergen

Juergen

Und wer
#define WPS D3
nimmt, braucht nicht mal einen zusätzlichen Button sondern kann den Flash-Button des NodeMCU benutzen.

Ulrich Engel

Ulrich Engel

Hallo,
ich warte immer noch auf Unterstützung bei meinem Problem (s.o.)
MFG

4711engel

4711engel

Hi,
ich habe nun den Fehler gefunden und den Sketch hochgeladen.

Im Serial Monitor erhalte ich aber folgende Meldungen:
“WPS Konfiguration gestartet
wifi_wps_enable
wps scan
build public key start
build public key finish
scandone
scandone
scandone
scandone
scandone
wifi_wps_disable
Keine Verbindung über WPS herstellbar
"
Was mache ich falsch?

Gruß aus Berlin

4711engel

4711engel

Hi, interessantes Projekt. Dieses Neukompilieren in einem fremden Netz war immer lästig.

Ich habe Boards-Version 2.5.0 installiert und im Werkzeug-Menü beim Board “Erase-Flash:” auf Sketch + WiFi Settings gesetzt. Kompilieren läuft fehlerfrei durch. Nur beim Hochladen gibt eine Fehlermeldung.

“Arduino: 1.8.7 (Windows 7), Board: “NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Disabled, 4M (3M SPIFFS), v2 Lower Memory, Disabled, None, Sketch + WiFi Settings, 115200”

Build-Optionen wurden verändert, alles wird neu kompiliert
Der Sketch verwendet 299420 Bytes (28%) des Programmspeicherplatzes. Das Maximum sind 1044464 Bytes.
Globale Variablen verwenden 32428 Bytes (39%) des dynamischen Speichers, 49492 Bytes für lokale Variablen verbleiben. Das Maximum sind 81920 Bytes.
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
error: failed sending 0xC0
error: failed sending 8 bytes
error: failed sending 36 bytes
error: failed sending 0xC0
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_open failed
"

Habt Ihr einen Tip für mich
Vielen Dank und Gruß aus Berlin

Alex

Alex

Hallo,
geht das auch mit dem ESP8266-01 Modul, das Sie verkaufen?
Am besten nur mit den AT-Befehlen, ohne dass ich die Firmware des Moduls verändern muss?

DaMich

DaMich

Einfach genial!!!

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery