huy666 发表于 2021-2-28 12:29:58

esp8266 arduino 的WiFiManager库怎么增加静态ip设置功能?

目前WiFiManager只能使用路由器的DHCP功能自动分配IP,如果要设置固定的静态IP,就要改WiFiManager库,有坛友做过这样的功能吗?

SkyGz 发表于 2021-2-28 18:02:21

    wifiManager.setAPStaticIPConfig(IPAddress(192,168,1,99), IPAddress(192,168,1,1), IPAddress(255, 255, 255, 0));

huy666 发表于 2021-3-1 10:30:34

SkyGz 发表于 2021-2-28 18:02
wifiManager.setAPStaticIPConfig(IPAddress(192,168,1,99), IPAddress(192,168,1,1), IPAddress(255,...

这个是把ip固定到程序里,现在是想要可以自己更改设置,在WifiManager里增加几个文本框填写,保存。

huy666 发表于 2021-3-1 10:53:00

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模式读出使用。

SkyGz 发表于 2021-3-1 11:04:43

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';

wjd40 发表于 2021-3-1 15:54:02

我用这个功能比较强,有静态IP的例子
https://github.com/khoih-prog/ESPAsync_WiFiManager

huy666 发表于 2021-3-1 17:56:02

SkyGz 发表于 2021-3-1 11:04
你都不说清楚,以下仅供参考,我这是 在配置页面 增加输入框 保存authkey用的。。。 改保存IP 方法雷 ...

根据您的思路,弄出来可以改静态IP,但是还不能保存,重启恢复默认值,正在研究ssid和password怎么保存的。

huy666 发表于 2021-3-1 17:56:42

这会github打不开了 !!!

SkyGz 发表于 2021-3-1 20:49:58

huy666 发表于 2021-3-1 17:56
根据您的思路,弄出来可以改静态IP,但是还不能保存,重启恢复默认值,正在研究ssid和password怎么保存的 ...

保存要用EEPROM的   保存地址要选一个, 不能占用已用的地址。。 已连接的SSID PASS是也是存在EEPROM的, 这个由ESP8266的开发包自带的

huy666 发表于 2021-3-1 23:19:58

SkyGz 发表于 2021-3-1 20:49
保存要用EEPROM的   保存地址要选一个, 不能占用已用的地址。。 已连接的SSID PASS是也是存在EEPROM的, ...

多谢了
继续研究

dadaohyb 发表于 2021-5-7 15:41:54

楼主研究成功了吗?
页: [1]
查看完整版本: esp8266 arduino 的WiFiManager库怎么增加静态ip设置功能?