使用WIFI_AP_STA模式

时间:2017-09-30 11:04:17

标签: arduino esp8266 nodemcu arduino-esp8266

我正在尝试以这样的方式对我的NodeMCU(Lolin v3)板进行编程,以便我可以使用它来配置WiFi设置,而无需对凭证进行硬编码。我知道有一个WiFiManager库,但我不打算使用它,因为我需要自己实现,而不是使用库提供的UI。用户提供的凭证使用SPIFFS存储在文件中,用于检查是以AP_STA模式还是仅以STA模式启动电路板。

以下是我使用的逻辑:

void connectWiFi(String ssid, String password, boolean staOnly = false) {
  boolean state = true;
  int i = 0;
  if(staOnly)
    WiFi.mode(WIFI_STA);
  WiFi.begin(ssid.c_str(), password.c_str());
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    if (i > 10) {
      state = false;
      break;
    }
    i++;
  }
  return state;
}

void join() {
  String ssid = setupServer.arg("ssid");
  String password = setupServer.arg("password");
  result = connectWifi(ssid, password);
  if(result) {
    Serial.println("Connected");
    // **THIS IS THE PROBLEMATIC PART**
    setupServer.send(200, "text/plain", WiFi.localIP().toString());
    // save credentials to a file
    Serial.println("Conf saved");
    delay(2000);
    ESP.restart();
  } else
    setupServer.send(200, "text/plain", "fail");
  }

void setup() {
  Serial.begin(115200);
  WiFi.disconnect(true);
  boolean fileExists = SPIFFS.exists(WIFI_CONF_FILE);
  if(!fileExists) {
    WiFi.mode(WIFI_AP_STA);
    WiFi.softAP("AP", "password");
    IPAddress myIP = WiFi.softAPIP();
    setupServer = ESP8266WebServer(myIP, 8888);
    setupServer.on("/join", join);
    setupServer.begin();
  } else {
    // read file contents for ssid and password
    connectWifi(ssid, password, true);
    // do some work here
  }
}

void loop() {
  setupServer.handleClient();
}

所以现在当我进行全新启动时,电路板进入AP_STA模式并以SSID AP启动。我连接到它并在浏览器中打开http://192.169.4.1/join?ssid=mywifi&password=12345678。不知怎的,连接终止了,我得到了#34; Destination Unreachable"在我的浏览器中。但是串行监视器打印了“连接”和“连接”。并且' Conf已保存'。

我想知道为什么它不会将成功响应返回给浏览器。连接到WiFi后我需要localIP。如果失败,它会正确返回失败的响应。如何确保在重新启动之前始终将分配给它的IP地址返回给连接到它的客户端?

感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来它必然会发生,因为无线电模块在两种模式之间共享。

在此处找到此问题的解释:https://github.com/esp8266/Arduino/issues/3282

  

这与STA将切换到它尝试连接的AP的信道有关,而SoftAP将必须切换到相同的信道。因此,客户端(连接到SoftAP的PC或智能手机)必须在其新频道上重新连接到SoftAP。在大多数情况下,这会导致重置TCP连接。