首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ESP32 WPS在电源上重新连接

ESP32 WPS在电源上重新连接
EN

Stack Overflow用户
提问于 2017-12-29 15:27:32
回答 2查看 5K关注 0票数 10

我正在尝试开发一个IoT设备,它应该提供一些使用HTTP的功能。我决定使用ESP32芯片(在"ESP32开发板“上)。

现在,我想实现一个易于使用的WLAN配置。和其他示例一样,我不想在源代码中存储凭据;所以我决定使用WPS。

我尝试使用以下源代码实现一个基本的web服务器:https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ -然后我从Arduino IDE的EPS32扩展附带的Wifi/WPS示例中添加了WPS功能。

现在WPS已经工作了,也就是说,当开发板启动时,它处于WPS连接模式,等待路由器接受WPS连接。它成功地获得了SSID,并连接到WLAN。

但是,当我打开ESP32,再次打开电源时,我必须再次执行WPS重新连接过程。我希望有一个重新连接,存储凭证,并能够再次连接到相同的无线局域网时,ESP32设备是在任何时候开-在以后。我想我必须存储一些凭据,并使用它们来重新建立连接--但是我在哪里获得凭据,以及如何重新连接?

我确实搜索了"ESP32 WLAN重新连接“和类似的术语,但是只找到了用于非WPS (SSID + password)连接的重新连接策略。我也检查了WiFi库文档和esp_wps库文档,但没有找到合适的地方。

这是WLAN WPS连接源:

代码语言:javascript
复制
#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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-02 21:53:50

ESP,包括32和8266,还记得它连接到的最后一个AP。因此,没有任何凭据的简单调用WiFi.begin();将使其连接到最后一个AP。然后,在您的while(WiFi.status() != WL_CONNECTED)循环中,您可以使其超时,如果不连接,则调用esp_wifi_wps_start(0);

票数 6
EN

Stack Overflow用户

发布于 2022-09-19 15:08:16

你可以在这里找到答案,https://www.esp32.com/viewtopic.php?f=19&t=27004

SSID和密码存储在配置中并提供给esp_wifi_set_config,在WPS完成后,您可以通过以下方式再次使用getter函数:

代码语言:javascript
复制
wifi_config_t config;
esp_err_t err = esp_wifi_get_config(WIFI_IF_STA, &config);
if (err == ESP_OK) {
  printf("SSID: %s, PW: %s\n", (char*) config.sta.ssid, (char*) config.sta.password);
} else {
  printf("Couldn't get config: %d\n", (int) err);
}

然后,您可以在该结构中再次找到SSID和密码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48024780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档