3

我正在使用这样的草图:

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 配置?我正在使用带有 esp8266 -12e 的 nodemcu v3。

4

3 回答 3

2

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

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

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

WiFi.disconnect(true);
delay(1000);
WiFi.begin(ssid, pass);
(void)wifi_station_dhcpc_start();
于 2016-10-17T07:52:32.383 回答
2

这确实应该是对已接受答案的评论,但我的声誉还不够高......无论如何,如该答案中所述,有一个用于重置 staticIP 标志的内置选项,但使其工作的诀窍是参数需要未签名。即WiFi.config(0u, 0u, 0u);。如果省略无符号部分,您会在已接受答案的评论中得到“从 'int' 到 'IPAddress' 的转换是不明确的”错误。

查看Arduino 固件的站类的源代码可以看到,WiFi.config(0u, 0u, 0u);除了执行之外,它实际上更改了一个受保护的标志wifi_station_dhcpc_start(),所以我会说 usingWiFi.config(0u, 0u, 0u);是要走的路。

于 2018-01-14T20:33:11.387 回答
2

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

WiFi.disconnect(true);
delay(1000);
WiFi.begin(ssid, password);
WiFi.config(0U, 0U, 0U);
于 2019-01-31T23:01:13.083 回答