116 lines
3.3 KiB
C++
116 lines
3.3 KiB
C++
/*
|
|
Example Code To Get ESP32 To Connect To A Router Using WPS
|
|
===========================================================
|
|
This example code provides both Push Button method and Pin
|
|
based WPS entry to get your ESP connected to your WiFi router.
|
|
|
|
Hardware Requirements
|
|
========================
|
|
ESP32 and a Router having WPS functionality
|
|
|
|
This code is under Public Domain License.
|
|
|
|
Author:
|
|
Pranav Cherukupalli <cherukupallip@gmail.com>
|
|
*/
|
|
|
|
#include "sdkconfig.h"
|
|
#if CONFIG_ESP_WIFI_REMOTE_ENABLED
|
|
#error "WPS is only supported in SoCs with native Wi-Fi support"
|
|
#endif
|
|
|
|
#include "WiFi.h"
|
|
#include "esp_wps.h"
|
|
/*
|
|
Change the definition of the WPS mode
|
|
from WPS_TYPE_PBC to WPS_TYPE_PIN in
|
|
the case that you are using pin type
|
|
WPS (pin is 00000000)
|
|
*/
|
|
#define ESP_WPS_MODE WPS_TYPE_PBC
|
|
|
|
void wpsStart() {
|
|
esp_wps_config_t config;
|
|
memset(&config, 0, sizeof(esp_wps_config_t));
|
|
//Same as config = WPS_CONFIG_INIT_DEFAULT(ESP_WPS_MODE);
|
|
config.wps_type = ESP_WPS_MODE;
|
|
strcpy(config.factory_info.manufacturer, "ESPRESSIF");
|
|
strcpy(config.factory_info.model_number, CONFIG_IDF_TARGET);
|
|
strcpy(config.factory_info.model_name, "ESPRESSIF IOT");
|
|
strcpy(config.factory_info.device_name, "ESP DEVICE");
|
|
strcpy(config.pin, "00000000");
|
|
esp_err_t err = esp_wifi_wps_enable(&config);
|
|
if (err != ESP_OK) {
|
|
Serial.printf("WPS Enable Failed: 0x%x: %s\n", err, esp_err_to_name(err));
|
|
return;
|
|
}
|
|
|
|
err = esp_wifi_wps_start(0);
|
|
if (err != ESP_OK) {
|
|
Serial.printf("WPS Start Failed: 0x%x: %s\n", err, esp_err_to_name(err));
|
|
}
|
|
}
|
|
|
|
void wpsStop() {
|
|
esp_err_t err = esp_wifi_wps_disable();
|
|
if (err != ESP_OK) {
|
|
Serial.printf("WPS Disable Failed: 0x%x: %s\n", err, esp_err_to_name(err));
|
|
}
|
|
}
|
|
|
|
String wpspin2string(uint8_t a[]) {
|
|
char wps_pin[9];
|
|
for (int i = 0; i < 8; i++) {
|
|
wps_pin[i] = a[i];
|
|
}
|
|
wps_pin[8] = '\0';
|
|
return (String)wps_pin;
|
|
}
|
|
|
|
// WARNING: WiFiEvent is called from a separate FreeRTOS task (thread)!
|
|
void WiFiEvent(WiFiEvent_t event, arduino_event_info_t info) {
|
|
switch (event) {
|
|
case ARDUINO_EVENT_WIFI_STA_START: Serial.println("Station Mode Started"); break;
|
|
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
|
|
Serial.println("Connected to :" + String(WiFi.SSID()));
|
|
Serial.print("Got IP: ");
|
|
Serial.println(WiFi.localIP());
|
|
break;
|
|
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
|
|
Serial.println("Disconnected from station, attempting reconnection");
|
|
WiFi.reconnect();
|
|
break;
|
|
case ARDUINO_EVENT_WPS_ER_SUCCESS:
|
|
Serial.println("WPS Successful, stopping WPS and connecting to: " + String(WiFi.SSID()));
|
|
wpsStop();
|
|
delay(10);
|
|
WiFi.begin();
|
|
break;
|
|
case ARDUINO_EVENT_WPS_ER_FAILED:
|
|
Serial.println("WPS Failed, retrying");
|
|
wpsStop();
|
|
wpsStart();
|
|
break;
|
|
case ARDUINO_EVENT_WPS_ER_TIMEOUT:
|
|
Serial.println("WPS Timedout, retrying");
|
|
wpsStop();
|
|
wpsStart();
|
|
break;
|
|
case ARDUINO_EVENT_WPS_ER_PIN: Serial.println("WPS_PIN = " + wpspin2string(info.wps_er_pin.pin_code)); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
delay(10);
|
|
Serial.println();
|
|
WiFi.onEvent(WiFiEvent); // Will call WiFiEvent() from another thread.
|
|
WiFi.mode(WIFI_MODE_STA);
|
|
Serial.println("Starting WPS");
|
|
wpsStart();
|
|
}
|
|
|
|
void loop() {
|
|
//nothing to do here
|
|
}
|