搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2021-2-28 12:29:58 | 显示全部楼层 |阅读模式
目前WiFiManager只能使用路由器的DHCP功能自动分配IP,如果要设置固定的静态IP,就要改WiFiManager库,有坛友做过这样的功能吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入70汤圆

发表于 2021-2-28 18:02:21 | 显示全部楼层
    wifiManager.setAPStaticIPConfig(IPAddress(192,168,1,99), IPAddress(192,168,1,1), IPAddress(255, 255, 255, 0));

出0入0汤圆

 楼主| 发表于 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里增加几个文本框填写,保存。

出0入0汤圆

 楼主| 发表于 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模式读出使用。

出0入70汤圆

发表于 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[12] = '\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[12] = '\0';

出0入0汤圆

发表于 2021-3-1 15:54:02 | 显示全部楼层
我用这个功能比较强,有静态IP的例子
https://github.com/khoih-prog/ESPAsync_WiFiManager

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2021-3-1 17:56:42 | 显示全部楼层
这会github打不开了 !!!

出0入70汤圆

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

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

出0入0汤圆

 楼主| 发表于 2021-3-1 23:19:58 | 显示全部楼层
SkyGz 发表于 2021-3-1 20:49
保存要用EEPROM的   保存地址要选一个, 不能占用已用的地址。。 已连接的SSID PASS是也是存在EEPROM的, ...

多谢了
继续研究

出0入0汤圆

发表于 2021-5-7 15:41:54 | 显示全部楼层
楼主研究成功了吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 16:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表