WPS mit dem ESP8266 - AZ-Delivery

WPS of WiFi Protected Setup is een methode om een ​​apparaat op het WiFi-netwerk te registreren zonder de SSID en het wachtwoord in te voeren. Voor veel WLAN-projecten worden de SSID en het wachtwoord gedefinieerd in de programmacode. Dit betekent dat het programma voor elk WLAN opnieuw moet worden gecompileerd. Met WPS is dit niet nodig en kunt u een controller met een eenmaal gecompileerd programma op verschillende WLAN's registreren.

De ESP8266 kan dat heel gemakkelijk. We hebben slechts een knop nodig van elke GPIO-pin naar aarde om het proces te starten.

Code:

 

# opnemen <ESP8266WiFi.h>
#define WPS D4 // Pin voor de WPS-knop


// Start de WPS-configuratie
dwaas startWPS() {   Serie.println("WPS-configuratie gestart");   dwaas wpsSucces = WiFi.beginWPSConfig();   als(wpsSucces) {       // Hoeft niet altijd succesvol te betekenen! Na een time-out is de SSID leeg       String newSSID = WiFi.SSID();       als(newSSID.lengte() > 0) {         // We waren alleen succesvol als een SSID werd gevonden          Serie.printf("WPS klaar. Succesvol ingelogd op SSID '% s' \ n", newSSID.c_str());       } anders {         wpsSucces = fout;       }   }   terug wpsSucces; 
}

// setup-functie
nietig instellen() {   Serie.beginnen(74880); // met 74880 zijn de berichten ook zichtbaar bij het opstarten   Serie.setDebugOutput(waar); // Indien waar, wordt extra foutopsporingsinformatie uitgevoerd   vertraging(1000);   Serie.printf("\ nProbeer verbinding te maken met opgeslagen SSID '% s' \ n", WiFi.SSID().c_str());   pinMode(WPS, INPUT_PULLUP); // Activeer de invoerknop   WiFi.mode(WIFI_STA);   WiFi.beginnen(WiFi.SSID().c_str(),WiFi.psk().c_str()); // laatst opgeslagen inloggegevens   int cnt = 0;   // We proberen te registreren   terwijl ((WiFi.status() == WL_DISCONNECTED) && (cnt < 10)){     vertraging(500);     Serie.afdrukken(".");     cnt++;   }   wl_status_t status = WiFi.status();   als(status == WL_CONNECTED) {     Serie.printf("\ nSuccesvol ingelogd bij SSID '% s' \ n", WiFi.SSID().c_str());   } anders {     // We zijn er niet in geslaagd WPS te lanceren     Serie.printf("\ nKan geen wifi-verbinding tot stand brengen. Status = '% d' \ n", status);      Serie.println("Druk op de WPS-knop op de router. \ N Druk op de WPS-knop op de ESP!");     terwijl (digitaal lezen(WPS)!=0) {opbrengst();}        als(!startWPS()) {        Serie.println("Er kan geen verbinding tot stand worden gebracht via WPS");       }   } 
}


nietig lus() {   // code voor het programma

}

 

Een bestaand project kan heel eenvoudig worden uitgebreid met de WPS-functie.

In plaats van de vaste SSID en het wachtwoord gebruiken we de waarden die de ESP8266 in het flashgeheugen heeft opgeslagen.

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

Als hiermee geen verbinding mogelijk is, wordt een overeenkomstige tekst weergegeven dat WPS eerst op de router moet worden gestart en vervolgens door op onze knop te drukken. In plaats van de tekstuitvoer kan men b.v. laat een LED oplichten. Nadat is herkend dat de knop is ingedrukt, roepen we de startWPS-functie aan, die de rest doet.

In de Arduino IDE moet u "Erase-Flash:" instellen op Sketch + WiFi-instellingen in het toolmenu op het bord, zodat een WPS kan plaatsvinden de volgende keer dat u start. Anders worden de opgeslagen toegangsgegevens gebruikt na een succesvolle WPS.

Wis Flash

Belangrijke opmerking: Zorg ervoor dat de juiste ESP8266-software is geïnstalleerd. Open hiervoor de boardmanager en scrol naar beneden totdat je de esp8266 vindt. Versie 2.5 of hoger moet hier worden geïnstalleerd. In versie 2.4.2 was de WPS-functie uitgeschakeld. Het werkte ook met oudere versies.

 

 

Esp-8266Projekte für anfänger

18 Reacties

Tim Pustelni

Tim Pustelni

@Gerald: Danke, habe ich versucht. Dabei viel auf, dass der wert für psk() bei ger gerade hergrstellten Verbinung per WPS leer (also "" string) ist. Daher wurde er auch so im EEPROM gespeichert. Der Wert für die SSID war hingegen vorhanden und auch gespeichert. Ideen?

Tim Pustelni

Tim Pustelni

@Gerald: Danke. Habe ich gemacht. Die SSID wird gespeichert. und beim erneutem Start ausgegeben. Allerdings ist der Wert WiFi.SSID,WiFi.psk().c_str()) schon bei der (funktionierenden) Herstellung der Verbindung via WPS leer (Wird also im EEPROM als "" gespeichert. Da liegt wohl der Hund begraben.
Hier der um EEPROM erweiterte Code:
// Bibliotheken
#include // WiFi verbindung
#include // Zum Speichern der WPS / WLAN Daten

// Variablen
#define SERIAL_BAUDRATE 115200
#define ON_Board_LED 16 // Defining an On Board LED
#define led_built_in_ESP 13

#define MAX_STRING_LENGTH 20 // EPROM

struct {
char mySSID[MAX_STRING_LENGTH] = "";
char myPW[MAX_STRING_LENGTH] = "";
} settings;

void setup() {
// Initialisierung
Serial.begin(SERIAL_BAUDRATE);
delay(500);
EEPROM.begin(sizeof(settings)); // EPROM starten
WiFi.mode(WIFI_STA);
pinMode(ON_Board_LED,OUTPUT);
pinMode(led_built_in_ESP, OUTPUT);
digitalWrite(ON_Board_LED, HIGH); //—> Turn off Led On Board
digitalWrite(led_built_in_ESP, HIGH);

wifiSetup();

}

void wifiSetup() {
// Verbindungsversuch mit gespeicherten WPS-Daten
EpromRead();
WiFi.mode(WIFI_STA);
// Connect
WiFi.begin(settings.mySSID, settings.myPW); // reading data from EPROM,
Serial.println(“Verbindungsversuch mit vorhandenen Daten:”);
Serial.printf(settings.mySSID, settings.myPW, WiFi.localIP().toString().c_str());

int cnt = 0; // Bis verbunden oder 20 Veruche while ((WiFi.status() == WL_DISCONNECTED) && (cnt < 20)) { Serial.print(“.”); digitalWrite(ON_Board_LED, LOW); delay(100); digitalWrite(ON_Board_LED, HIGH); delay(100); cnt++; } digitalWrite(ON_Board_LED, HIGH); // LED aus wl_status_t status = WiFi.status(); if (status == WL_CONNECTED) { // verbunden Serial.printf(“Online: %s\n”, settings.mySSID, settings.myPW, WiFi.localIP().toString().c_str()); } else { // Nicht verbunden if (!startWPSPBC()) { Serial.println(“Verbindungsversuch fehlgeschlagen.”); } else { Serial.println(“Verbindungsversuch per WPS erfolgreich.”); Serial.print("SSID: "); Serial.println(WiFi.SSID); Serial.print("PSK: "); Serial.println(WiFi.psk().c_str()); Serial.print("IP: "); Serial.println(WiFi.localIP().toString()); //Serial.printf(“[WIFI] STATION Mode, SSID: %s, IP address: %s\n”, settings.mySSID, WiFi.localIP().toString().c_str()); } }

}

bool startWPSPBC() {
Serial.println(“Verbindungsversuch mit WPS”);
bool wpsSuccess = WiFi.beginWPSConfig();
if (wpsSuccess) {
//in case of a timeout returns an empty ssid
String newSSID = WiFi.SSID > 0) {
// WPSConfig has already connected in STA mode successfully
// Save to EPROM
strncpy(settings.mySSID, WiFi.SSID, MAX_STRING_LENGTH);
strncpy(settings.myPW, WiFi.psk().c_str(), MAX_STRING_LENGTH);
EpromWrite();
} else {
wpsSuccess = false;
}
}
return wpsSuccess;
}

void EpromRead() {
// READ DATA FROM EEPROM
Serial.println(“Reading old data from EEPROM:”);
//read data from EEPROM :
unsigned int addr = 0;
EEPROM.get(addr, settings); //read data from array in ram and cast it to settings
Serial.println(“Using EEPROM.get:”);
Serial.println("mySSID: " + String(settings.mySSID) + ",\t\tmyPW: " + String(settings.myPW));
}

void EpromWrite() {
// WRITE DATA FROM EEPROM
unsigned int addr = 0;
EEPROM.put(addr, settings); //write data to array in ram
EEPROM.commit(); //write data from ram to flash memory. Do nothing if there are no changes to EEPROM data in ram
}

void loop() {}

Tim Pustelni

Tim Pustelni

Hi,
Ich habe den Code 1:1 kopiert.
Die Anmeldung (beim erstem Mal) mit WPS funktioniert.
Beim Neustart sind die Ameldeinformationen in
WiFi.begin(WiFi.SSID,WiFi.psk().c_str()); // letzte gespeicherte Zugangsdaten
leer und ein Anmelden schlägt fehl.

Kann mir jmd helfen?
Danke.

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!!!

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  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