首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ESP32 WiFi MODE_STM_AP.通过via接口动态改变WiFi站点

ESP32 WiFi MODE_STM_AP.通过via接口动态改变WiFi站点
EN

Stack Overflow用户
提问于 2022-06-26 17:05:43
回答 1查看 555关注 0票数 0

你好,亲爱的斯塔克溢流社区,

我有以下问题。我正在做的项目是这样的。

  1. ESP32 with AsyncWebserver和LittleFS
  2. ESP32在系统启动时建立了一个软AP (MODE_APSTA),包括STM (Station ),
  3. 作为web接口可以用于搜索范围内的网络。一旦您决定了一个网络,在web接口中选择它,并为SSID输入相应的密码。
  4. 通过Ajax请求将密码发送到ESP32 web服务器。web服务器将数据保存在配置文件中并重新启动。如果ESP在启动时确认配置文件是可用的,它应该从那里读取SSID和密码并连接到网络。
  5. 来自ESP的软AP应该保持位置并可用。

现在是问题: ESP重新启动,找到文件,并应该连接到访问点。但事实并非如此。我不知道问题出在哪里。我已经绝望两天了。

关于社会人士的意见,我会非常感激:)

代码语言:javascript
运行
复制
#include <FS.h>
#include <LittleFS.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <ArduinoJson.h>
#include <WiFiMulti.h>

const char* soft_ap_ssid = "WeiFeiFugger";
const char* soft_ap_password = "1234567890";
DynamicJsonDocument output(1024);
String ap_config;
String pass_config;
AsyncWebServer server(80);
WiFiMulti wifiMulti;

void WiFiEvent(WiFiEvent_t event) {
  Serial.printf("[WiFi-event] event: %d\n", event);

  switch (event) {
    case SYSTEM_EVENT_WIFI_READY: 
      Serial.println("WiFi interface ready");
      break;
    case SYSTEM_EVENT_SCAN_DONE:
      Serial.println("Completed scan for access points");
      break;
    case SYSTEM_EVENT_STA_START:
      Serial.println("WiFi client started");
      break;
    case SYSTEM_EVENT_STA_STOP:
      Serial.println("WiFi clients stopped");
      break;
    case SYSTEM_EVENT_STA_CONNECTED:
      Serial.println("Connected to access point");
      break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
      Serial.println("Disconnected from WiFi access point");
      break;
    case SYSTEM_EVENT_STA_AUTHMODE_CHANGE:
      Serial.println("Authentication mode of access point has changed");
      break;
    case SYSTEM_EVENT_STA_GOT_IP:
      Serial.print("Obtained IP address: ");
      Serial.println(WiFi.localIP());
      break;
    case SYSTEM_EVENT_STA_LOST_IP:
      Serial.println("Lost IP address and IP address is reset to 0");
      break;
    case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
      Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode");
      break;
    case SYSTEM_EVENT_STA_WPS_ER_FAILED:
      Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode");
      break;
    case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
      Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode");
      break;
    case SYSTEM_EVENT_STA_WPS_ER_PIN:
      Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode");
      break;
    case SYSTEM_EVENT_AP_START:
      Serial.println("WiFi access point started");
      break;
    case SYSTEM_EVENT_AP_STOP:
      Serial.println("WiFi access point  stopped");
      break;
    case SYSTEM_EVENT_AP_STACONNECTED:
      Serial.println("Client connected");
      break;
    case SYSTEM_EVENT_AP_STADISCONNECTED:
      Serial.println("Client disconnected");
      break;
    case SYSTEM_EVENT_AP_STAIPASSIGNED:
      Serial.println("Assigned IP address to client");
      break;
    case SYSTEM_EVENT_AP_PROBEREQRECVED:
      Serial.println("Received probe request");
      break;
    case SYSTEM_EVENT_GOT_IP6:
      Serial.println("IPv6 is preferred");
      break;
    case SYSTEM_EVENT_ETH_START:
      Serial.println("Ethernet started");
      break;
    case SYSTEM_EVENT_ETH_STOP:
      Serial.println("Ethernet stopped");
      break;
    case SYSTEM_EVENT_ETH_CONNECTED:
      Serial.println("Ethernet connected");
      break;
    case SYSTEM_EVENT_ETH_DISCONNECTED:
      Serial.println("Ethernet disconnected");
      break;
    case SYSTEM_EVENT_ETH_GOT_IP:
      Serial.println("Obtained IP address");
      break;
    default: break;
}}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) {
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}

 
void setup(){

  Serial.begin(115200);

  WiFi.onEvent(WiFiEvent);
  
  WiFi.mode(WIFI_MODE_APSTA);
  WiFi.softAP(soft_ap_ssid, soft_ap_password);
  // Initialize LittleFS
  if(!LittleFS.begin()){
    Serial.println("An Error has occurred while mounting LittleFS");
    return;
  }


  if (LittleFS.exists("/connect_ap.txt") && LittleFS.exists("/connect_pass.txt")){
    Serial.println("AP Settings files exist");
    File apfile = LittleFS.open("/connect_ap.txt", "r");
    while(apfile.available()){
     ap_config = apfile.readString();
    }   
    apfile.close();
    File passfile = LittleFS.open("/connect_pass.txt", "r");
    while(passfile.available()){
     pass_config = passfile.readString();
    }   
    passfile.close();
    LittleFS.remove("/connect_pass.txt");
    LittleFS.remove("/connect_ap.txt");
    ap_config.replace(' ', NULL);
    pass_config.replace(' ', NULL);
    Serial.println(ap_config + " " + pass_config);
    wifiMulti.addAP(ap_config.c_str(), pass_config.c_str());
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
    }
    //WiFi.begin(ap_config.c_str(), pass_config.c_str());  
  }else{
    Serial.println("AP Setting files do not exist");
  }
  //WiFi.mode(WIFI_MODE_APSTA);
  //WiFi.softAP(soft_ap_ssid, soft_ap_password);
  //WiFi.begin();
  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/index.html", String(), false);
  });
  // Route for root / web page
  server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/favicon.ico", "image/x-icon");
  });  
  // Route to load bootstrap.css file
  server.on("/bootstrap.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/bootstrap.css", "text/css");
  });
  // Route to load bootstrap.js file
  server.on("/bootstrap.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/bootstrap.js", "text/javascript");
  });
  // Route to load jquery.js file
  server.on("/jquery.js", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/jquery.js", "text/javascript");
  });
  // Route to load styles.css file
  server.on("/styles.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/styles.css", "text/css");
  });
  server.on("/connectionInfo", HTTP_GET, [](AsyncWebServerRequest *request){
    String connectionInfo;
    connectionInfo = WiFi.status();
    request->send(200, "text/plain", connectionInfo);
  });
  server.on("/reboot", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", "Rebooting");
    ESP.restart();
  });
  // Route to set scan Networks
  server.on("/scanNetwork", HTTP_GET, [](AsyncWebServerRequest *request){
  String jsonOut = "{'accesspoints': [";
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
      Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" [UNSECURED] ":" [SECURED] ");
      jsonOut += "{'ssid':'" + WiFi.SSID(i) + "', 'rssi':'" + WiFi.RSSI(i) + "', 'encryption':'" + ((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?"UNSECURED":"SECURED") + "'},"; 
      delay(10);
      
    }
  }
    jsonOut += "]}";
    Serial.println(jsonOut);
    request->send(200, "text/plain", jsonOut); 
  });

  // Route to connect to AP and scan network
  server.on("/connectAP", HTTP_GET, [](AsyncWebServerRequest *request){
    int paramsNr = request->params();
    Serial.println(paramsNr);
 
    String ssid_param = request->getParam("ssid")->value();
    String encryption_param = request->getParam("encryption")->value();
    String password_param = request->getParam("password")->value();
    Serial.println(ssid_param);
    Serial.println(encryption_param);
    Serial.println(password_param);
    File apfile = LittleFS.open("/connect_ap.txt", "w");
    apfile.print(ssid_param.c_str());
    delay(1);
    apfile.close();
    File passfile = LittleFS.open("/connect_pass.txt", "w");
    passfile.print(password_param.c_str());
    delay(1);
    passfile.close();
    //WiFi.disconnect();
    // Connect to Wi-Fi
    //WiFi.begin(ssid_param.c_str(), password_param.c_str());
    //if(password_param = ""){
    //  WiFi.begin(ssid_param.c_str());
    //}else{
    //  WiFi.begin(ssid_param.c_str(), password_param.c_str());      
    //}
    //IPAddress ip_recieved = WiFi.localIP();
    request->send(200, "text/plain", "Rebooting");//String(WiFi.localIP()
    delay(2000);
    ESP.restart();
  });
  

  // Start server
  server.begin();
}
 
void loop(){

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-26 17:54:03

解决了。这是"ap_config.replace(‘',NULL)“行的凭据解析中的一个问题。它删除了所有的东西。因此没有指定AP SSID。

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

https://stackoverflow.com/questions/72763607

复制
相关文章

相似问题

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