我正在尝试以这样的方式对我的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地址返回给连接到它的客户端?
感谢任何帮助。
谢谢!
答案 0 :(得分:0)
看起来它必然会发生,因为无线电模块在两种模式之间共享。
在此处找到此问题的解释:https://github.com/esp8266/Arduino/issues/3282
这与STA将切换到它尝试连接的AP的信道有关,而SoftAP将必须切换到相同的信道。因此,客户端(连接到SoftAP的PC或智能手机)必须在其新频道上重新连接到SoftAP。在大多数情况下,这会导致重置TCP连接。