如何清除静态IP配置并启动DHCP

时间:2016-10-16 11:18:25

标签: arduino esp8266 arduino-ide arduino-esp8266

我正在使用这样的草图:

WiFi.config(IP, Gate, Subnet);
WiFi.begin (ssid, pass);

//-- somewhere below I want to drop the static IP configuration and obtain IP with DHCP.

WiFi.disconnect ();
WiFi.begin (ssid, pass). //ssid and pass are the same as above.

但IP并没有改变。似乎WiFi尚未重新连接。如何在不重启的情况下丢弃静态IP配置?我正在使用nodemcu v3和esp8266 -12e。

3 个答案:

答案 0 :(得分:2)

你是对的。 Arduino固件存在DHCP问题。当我从WiFiSTA固件实现中检查时,我看到当你调用config()函数时,staticIP标志被设置一次并且永远不会被清除。该标志保护DHCP启动/停止操作。 所以,这里有一个解决方案。只需将ESP SDK标头添加到您的代码中,如:

extern "C" {
  #include "user_interface.h"
}

现在您可以从之前被标志阻止的固件调用dhcp启动功能。但是,请注意,您必须在WiFi.begin()之后稍稍调用它。使用下面的代码块:

WiFi.disconnect(true);
delay(1000);
WiFi.begin(ssid, pass);
(void)wifi_station_dhcpc_start();

答案 1 :(得分:2)

这应该是对已接受的答案的评论,但我的声誉还不够......无论如何,如该答案所述,有一个内置的选项可以重置staticIP标志,但让它工作的诀窍是参数需要是无符号的。即public static string Left(this string input, int count) => String.Join("", (input + "").ToCharArray().Take(count)); 。如果省略未签名的部分,您将从' int'转换为"转换。到' IPAddress'暧昧"在接受的答案的评论中提到的错误。

查看the source以获取Arduino固件的站类,除了执行WiFi.config(0u, 0u, 0u);之外,WiFi.config(0u, 0u, 0u);实际上可以看到wifi_station_dhcpc_start()实际上更改了受保护的标志,所以我会说使用WiFi.config(0u, 0u, 0u);是要走的路。

答案 2 :(得分:0)

我试图将所需的确切代码作为对Anders响应的编辑,但是由于某种原因,该编辑被拒绝。有时爱堆栈会溢出。我尝试了一段时间以使其正常工作,如果您仅致电WiFi.config(0u, 0u, 0u);,它将无法正常工作。我认为很多其他组合都行不通。值得赞扬的是安德斯(Anders)和卡格达斯(Cagdas),这只是他们两个答案的总和。这是使它工作所需的确切代码。抱歉,如果我违反了许多堆栈溢出规则中的另一个规则:/

WiFi.disconnect(true);
delay(1000);
WiFi.begin(ssid, password);
WiFi.config(0U, 0U, 0U);