ESP32 WPS 上电重连
ESP32 WPS reconnect on power-on
我正在尝试开发一个物联网设备,它应该使用 HTTP/REST API 提供一些功能。我决定使用 ESP32 芯片("ESP32 dev board")。
现在我想实现一个易于使用的 WLAN 配置。我不想像许多其他示例那样在我的源代码中存储凭据;所以我决定使用WPS。
我尝试使用此处的源代码实现一个基本的 Web 服务器:
https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ - 然后我从 Wifi/WPS 示例中添加了 WPS 功能,该示例随 Arduino IDE 的 EPS32 扩展一起提供。
现在 WPS 已经工作了,即当开发板通电时它处于 WPS 连接模式并等待路由器接受 WPS 连接。成功获取SSID并连接到WLAN
但是当我关闭ESP32电源并再次开机时,我必须重新执行WPS重连程序。我希望重新连接,它存储凭据,并且能够在 ESP32 设备以后随时开机时再次连接到同一个 WLAN。我想我必须存储一些凭据并使用它们重新建立连接 - 但我从哪里获得凭据,以及如何重新连接?
我确实在网上搜索了 "ESP32 WLAN WPS reconnect" 和类似的术语,但只找到了非 wps(SSID + 密码)连接的重新连接策略。我也检查了 WiFi 库文档和 esp_wps 库文档,但没有找到合适的。
这是WLAN WPS连接源:
#include <WiFi.h>
#include "esp_wps.h"
#define ESP_WPS_MODE WPS_TYPE_PBC
esp_wps_config_t config = WPS_CONFIG_INIT_DEFAULT(ESP_WPS_MODE);
String wpspin2string(uint8_t a[]){
//...
}
void WiFiEvent(WiFiEvent_t event, system_event_info_t info){
switch(event){
case SYSTEM_EVENT_STA_START:
Serial.println("Station Mode Started");
break;
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("Connected to :" + String(WiFi.SSID()));
Serial.print("Got IP: ");
Serial.println(WiFi.localIP());
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("Disconnected from station, attempting reconnection");
WiFi.reconnect();
break;
case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
Serial.println("WPS Successfull, stopping WPS and connecting to: " + String(WiFi.SSID()));
esp_wifi_wps_disable();
delay(10);
WiFi.begin();
break;
case SYSTEM_EVENT_STA_WPS_ER_FAILED:
Serial.println("WPS Failed, retrying");
esp_wifi_wps_disable();
esp_wifi_wps_enable(&config);
esp_wifi_wps_start(0);
break;
case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
Serial.println("WPS Timedout, retrying");
esp_wifi_wps_disable();
esp_wifi_wps_enable(&config);
esp_wifi_wps_start(0);
break;
case SYSTEM_EVENT_STA_WPS_ER_PIN:
Serial.println("WPS_PIN = " + wpspin2string(info.sta_er_pin.pin_code));
break;
default:
break;
}
}
// some GPIO stuff, removed for SO question
void setup() {
// initialize some GPIO for status etc. - removed for SO
//Initialize serial and wait for port to open:
Serial.begin(115200);
while(!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// We start by connecting to a WiFi network
WiFi.onEvent(WiFiEvent);
WiFi.mode(WIFI_MODE_STA);
Serial.println("Starting WPS");
esp_wifi_wps_enable(&config);
esp_wifi_wps_start(0);
// attempt to connect to Wifi network:
while(WiFi.status() != WL_CONNECTED) {
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
delay(700);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop() {
//irrelevant for SO question
}
ESP,32 和 8266,记住它连接的最后一个 AP。没有任何凭据的简单调用 WiFi.begin();
将使其连接到最后一个 AP。然后在你的 while(WiFi.status() != WL_CONNECTED)
循环中你可以让它超时然后调用 esp_wifi_wps_start(0);
如果它没有连接。
我正在尝试开发一个物联网设备,它应该使用 HTTP/REST API 提供一些功能。我决定使用 ESP32 芯片("ESP32 dev board")。
现在我想实现一个易于使用的 WLAN 配置。我不想像许多其他示例那样在我的源代码中存储凭据;所以我决定使用WPS。
我尝试使用此处的源代码实现一个基本的 Web 服务器: https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ - 然后我从 Wifi/WPS 示例中添加了 WPS 功能,该示例随 Arduino IDE 的 EPS32 扩展一起提供。
现在 WPS 已经工作了,即当开发板通电时它处于 WPS 连接模式并等待路由器接受 WPS 连接。成功获取SSID并连接到WLAN
但是当我关闭ESP32电源并再次开机时,我必须重新执行WPS重连程序。我希望重新连接,它存储凭据,并且能够在 ESP32 设备以后随时开机时再次连接到同一个 WLAN。我想我必须存储一些凭据并使用它们重新建立连接 - 但我从哪里获得凭据,以及如何重新连接?
我确实在网上搜索了 "ESP32 WLAN WPS reconnect" 和类似的术语,但只找到了非 wps(SSID + 密码)连接的重新连接策略。我也检查了 WiFi 库文档和 esp_wps 库文档,但没有找到合适的。
这是WLAN WPS连接源:
#include <WiFi.h>
#include "esp_wps.h"
#define ESP_WPS_MODE WPS_TYPE_PBC
esp_wps_config_t config = WPS_CONFIG_INIT_DEFAULT(ESP_WPS_MODE);
String wpspin2string(uint8_t a[]){
//...
}
void WiFiEvent(WiFiEvent_t event, system_event_info_t info){
switch(event){
case SYSTEM_EVENT_STA_START:
Serial.println("Station Mode Started");
break;
case SYSTEM_EVENT_STA_GOT_IP:
Serial.println("Connected to :" + String(WiFi.SSID()));
Serial.print("Got IP: ");
Serial.println(WiFi.localIP());
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("Disconnected from station, attempting reconnection");
WiFi.reconnect();
break;
case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
Serial.println("WPS Successfull, stopping WPS and connecting to: " + String(WiFi.SSID()));
esp_wifi_wps_disable();
delay(10);
WiFi.begin();
break;
case SYSTEM_EVENT_STA_WPS_ER_FAILED:
Serial.println("WPS Failed, retrying");
esp_wifi_wps_disable();
esp_wifi_wps_enable(&config);
esp_wifi_wps_start(0);
break;
case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
Serial.println("WPS Timedout, retrying");
esp_wifi_wps_disable();
esp_wifi_wps_enable(&config);
esp_wifi_wps_start(0);
break;
case SYSTEM_EVENT_STA_WPS_ER_PIN:
Serial.println("WPS_PIN = " + wpspin2string(info.sta_er_pin.pin_code));
break;
default:
break;
}
}
// some GPIO stuff, removed for SO question
void setup() {
// initialize some GPIO for status etc. - removed for SO
//Initialize serial and wait for port to open:
Serial.begin(115200);
while(!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// We start by connecting to a WiFi network
WiFi.onEvent(WiFiEvent);
WiFi.mode(WIFI_MODE_STA);
Serial.println("Starting WPS");
esp_wifi_wps_enable(&config);
esp_wifi_wps_start(0);
// attempt to connect to Wifi network:
while(WiFi.status() != WL_CONNECTED) {
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
delay(700);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop() {
//irrelevant for SO question
}
ESP,32 和 8266,记住它连接的最后一个 AP。没有任何凭据的简单调用 WiFi.begin();
将使其连接到最后一个 AP。然后在你的 while(WiFi.status() != WL_CONNECTED)
循环中你可以让它超时然后调用 esp_wifi_wps_start(0);
如果它没有连接。