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

How to clear static IP configuration and start DHCP

我正在使用这样的草图:

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 一起使用。

你是对的。 Arduino 固件存在 DHCP 问题。当我检查 WiFiSTA 固件实现时,我看到当您调用 config() 函数时 staticIP 标志被设置一次并且永远不会被清除。此标志保护 DHCP start/stop 操作。 因此,这是适合您的解决方案。只需将 ESP SDK header 添加到您的代码中,例如:

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

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

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

这真的应该是对已接受答案的评论,但我的声誉不够高...无论如何,正如该答案中所述,有一个内置选项可用于重置 staticIP 标志,但实现它的技巧工作是参数需要无符号。 IE。 WiFi.config(0u, 0u, 0u);。如果省略未签名的部分,您会收到已接受答案的评论中提到的 "conversion from 'int' to 'IPAddress' is ambiguous" 错误。

查看 Arduino 固件站的 the source class 可以看到 WiFi.config(0u, 0u, 0u); 除了执行 wifi_station_dhcpc_start() 之外实际上还更改了一个受保护的标志,所以我会说使用 WiFi.config(0u, 0u, 0u); 是正确的选择。

我试图将您需要的确切代码作为对 Anders 回复的编辑,但由于某种原因该编辑被拒绝了。有时爱堆栈溢出。我尝试了一段时间让它工作,但如果你只调用 WiFi.config(0u, 0u, 0u);,它就不起作用。我认为会起作用的许多其他组合都没有。感谢 Anders 和 Cagdas,因为这只是他们的 2 个答案的总和。这是让它工作所需的确切代码。抱歉,如果我违反了许多堆栈溢出规则中的另一个:/

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