我正在使用这样的草图:
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。
答案 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);