esp8266 arduino 的WiFiManager库怎么增加静态ip设置功能?
目前WiFiManager只能使用路由器的DHCP功能自动分配IP,如果要设置固定的静态IP,就要改WiFiManager库,有坛友做过这样的功能吗?wifiManager.setAPStaticIPConfig(IPAddress(192,168,1,99), IPAddress(192,168,1,1), IPAddress(255, 255, 255, 0)); SkyGz 发表于 2021-2-28 18:02
wifiManager.setAPStaticIPConfig(IPAddress(192,168,1,99), IPAddress(192,168,1,1), IPAddress(255,...
这个是把ip固定到程序里,现在是想要可以自己更改设置,在WifiManager里增加几个文本框填写,保存。 SkyGz 发表于 2021-2-28 18:02
wifiManager.setAPStaticIPConfig(IPAddress(192,168,1,99), IPAddress(192,168,1,1), IPAddress(255,...
这个静态IP是STA的静态IP,不是AP模式的IP。有个函数:
setSTAStaticIPConfig
看代码,里面有相关内容
/**
* HTTPD CALLBACK save form and redirect to WLAN config page again
*/
void WiFiManager::handleWifiSave() {
#ifdef WM_DEBUG_LEVEL
DEBUG_WM(DEBUG_VERBOSE,F("<- HTTP WiFi save "));
DEBUG_WM(DEBUG_DEV,F("Method:"),server->method() == HTTP_GET? (String)FPSTR(S_GET) : (String)FPSTR(S_POST));
#endif
handleRequest();
// @todo use new callback for before paramsaves
if ( _presavecallback != NULL) {
_presavecallback();
}
//SAVE/connect here
_ssid = server->arg(F("s")).c_str();
_pass = server->arg(F("p")).c_str();
if(_paramsInWifi) doParamSave();
if (server->arg(FPSTR(S_ip)) != "") {
//_sta_static_ip.fromString(server->arg(FPSTR(S_ip));
String ip = server->arg(FPSTR(S_ip));
optionalIPFromString(&_sta_static_ip, ip.c_str());
#ifdef WM_DEBUG_LEVEL
DEBUG_WM(DEBUG_DEV,F("static ip:"),ip);
#endif
}
if (server->arg(FPSTR(S_gw)) != "") {
String gw = server->arg(FPSTR(S_gw));
optionalIPFromString(&_sta_static_gw, gw.c_str());
#ifdef WM_DEBUG_LEVEL
DEBUG_WM(DEBUG_DEV,F("static gateway:"),gw);
#endif
}
if (server->arg(FPSTR(S_sn)) != "") {
String sn = server->arg(FPSTR(S_sn));
optionalIPFromString(&_sta_static_sn, sn.c_str());
#ifdef WM_DEBUG_LEVEL
DEBUG_WM(DEBUG_DEV,F("static netmask:"),sn);
#endif
}
if (server->arg(FPSTR(S_dns)) != "") {
String dns = server->arg(FPSTR(S_dns));
optionalIPFromString(&_sta_static_dns, dns.c_str());
#ifdef WM_DEBUG_LEVEL
DEBUG_WM(DEBUG_DEV,F("static DNS:"),dns);
#endif
}
String page;
if(_ssid == ""){
page = getHTTPHead(FPSTR(S_titlewifisettings)); // @token titleparamsaved
page += FPSTR(HTTP_PARAMSAVED);
}
else {
page = getHTTPHead(FPSTR(S_titlewifisaved)); // @token titlewifisaved
page += FPSTR(HTTP_SAVED);
}
page += FPSTR(HTTP_END);
server->sendHeader(FPSTR(HTTP_HEAD_CL), String(page.length()));
server->sendHeader(FPSTR(HTTP_HEAD_CORS), FPSTR(HTTP_HEAD_CORS_ALLOW_ALL));
server->send(200, FPSTR(HTTP_HEAD_CT), page);
#ifdef WM_DEBUG_LEVEL
DEBUG_WM(DEBUG_DEV,F("Sent wifi save page"));
#endif
connect = true; //signal ready to connect/reset process in processConfigPortal
}
这个handleWifiSave函数里会检查server->arg(FPSTR(S_ip)) 这个即使STA的静态IP,如果有值会传给_sta_static_ip变量用作sta模式的静态IP,还有网关、子网掩码、dns参数。
server在类中定义
std::unique_ptr<WM_WebServer> server;
ssid和密码也是存在这里的,是在AP模式下,通过192.168.4.1登录设置后保存,然后在STA模式读出使用。
//SAVE/connect here
_ssid = server->arg(F("s")).c_str();
_pass = server->arg(F("p")).c_str();
还没弄明白server->arg(FPSTR(S_ip) 这些怎么在AP模式下设置,怎么在STA模式读出使用。
huy666 发表于 2021-3-1 10:30
这个是把ip固定到程序里,现在是想要可以自己更改设置,在WifiManager里增加几个文本框填写,保存。 ...
你都不说清楚,以下仅供参考,我这是 在配置页面 增加输入框 保存authkey用的。。。 改保存IP 方法雷同。 也可以参考WiFiManager的例子 ParamsChildClass.ino
// 功能描述:设置点击保存的回调
void saveConfigCallback () {
Serial.println("Should save config");
shouldSaveConfig = true;
}
EEPROM.begin(1408);
EEPROM.get<Settings>(1280, sett);
WiFiManager wifiManager;
WiFi.mode(WIFI_STA);
// 设置点击保存的回调
wifiManager.setSaveConfigCallback(saveConfigCallback);
//添加配置输入框
WiFiManagerParameter custom_authkey("auth_key", "Authkey", sett.auth_key, 12);
wifiManager.addParameter(&custom_authkey);
//AP名称:ESP_AP 密码:12345678
if(!wifiManager.autoConnect("ESP_AP","12345678")) {
Serial.println(F("Failed to connect. Reset and try again. . ."));
Blinker.delay(3000);
ESP.restart();
Blinker.delay(5000);
}
Serial.println(F("Connected to Wifi."));
Serial.print(F("My IP:"));
Serial.println(WiFi.localIP());
// 保存自定义信息
if (shouldSaveConfig) {
Serial.println(F("saving config..."));
//取输入框信息 检测正确性 并 保存
strncpy(sett.auth_key, custom_authkey.getValue(), 12);
sett.auth_key = '\0';
if (!chkAuthkey(sett.auth_key, strlen(sett.auth_key))){
Serial.println(F("Authkey is wrong."));
wifiManager.resetSettings();
ESP.restart();
Blinker.delay(5000);
}
EEPROM.put<Settings>(1280, sett);
if (EEPROM.commit()) {
Serial.println(F("EEPROM successfully committed"));
} else {
Serial.println(F("ERROR! EEPROM commit failed"));
}
}
EEPROM.end();
sett.auth_key = '\0';
我用这个功能比较强,有静态IP的例子
https://github.com/khoih-prog/ESPAsync_WiFiManager SkyGz 发表于 2021-3-1 11:04
你都不说清楚,以下仅供参考,我这是 在配置页面 增加输入框 保存authkey用的。。。 改保存IP 方法雷 ...
根据您的思路,弄出来可以改静态IP,但是还不能保存,重启恢复默认值,正在研究ssid和password怎么保存的。
这会github打不开了 !!! huy666 发表于 2021-3-1 17:56
根据您的思路,弄出来可以改静态IP,但是还不能保存,重启恢复默认值,正在研究ssid和password怎么保存的 ...
保存要用EEPROM的 保存地址要选一个, 不能占用已用的地址。。 已连接的SSID PASS是也是存在EEPROM的, 这个由ESP8266的开发包自带的
SkyGz 发表于 2021-3-1 20:49
保存要用EEPROM的 保存地址要选一个, 不能占用已用的地址。。 已连接的SSID PASS是也是存在EEPROM的, ...
多谢了
继续研究 楼主研究成功了吗?
页:
[1]