如何缩短获取IP地址所需时间:NodeMCU

使用 NodeMCU 在 Station 模式下,使用以下代码片段在 init.lua 中,平均需要大约 6 次循环迭代才会报告 IP 地址(或达到 IP 堆栈就绪状态)

wifi.sta.disconnect()
--settings.lua
SSID    = "xxxx"
APPWD   = "yyyy"

cfg =
  {
    ip="192.168.0.85",
    netmask="255.255.255.0",
    gateway="192.168.0.1"
  }
wifi.sta.setip(cfg)
wifi.sta.config(SSID,APPWD)
wifi.sta.autoconnect(1)

-- wait for WIFI ----
function checkWIFI()
    print("Waiting for WIFI...")
    ipAddr = wifi.sta.getip()
    if ( ( ipAddr ~= nil ) and  ( ipAddr ~= "0.0.0.0" ) )then
        print("IP Address: " ..ipAddr)

    else
      -- schedule try again
      tmr.alarm( 0 , 1000 , 0 , checkWIFI)
    end
end
tmr.alarm( 0 , 1000 , 0 , checkWIFI)

尝试使用静态 IP 配置,并不会有不同。 这是正常现象吗? 有什么方法可以加快吗? 我的方法是否有误?

点赞
用户5699510
用户5699510

以下是我的实际经验,可能已经过时了。我需要重新测试这些...

我做了类似的事情,效果很好。然而,在“重置”后WiFi不能很快地可用,但在从深度睡眠中唤醒后非常快速可用。

第一次使用后(设置会自动保存),后来我只需要这样做

wifi.sta.setip(cfg)
wifi.sta.status() -- 这曾经加快了速度

我还将 wifi.sta.autoconnect(0) 设置为避免 dhcp 延迟。

顺便说一句,要检查连接,最好等待 wifi.sta.status() == 5

希望这有所帮助。

2015-12-20 02:34:07
用户270155
用户270155

基于@Eyal的回答,我通常在从深度睡眠中恢复(基于定时器)时能在415-470毫秒内获取到IP地址,从冷启动电源时则需要3.25秒。

注意:此解决方案中没有DNS解析。

将网络配置保存到闪存中

wifi.sta.clearconfig()
wifi.setmode(wifi.STATION)
station_cfg={}
station_cfg.ssid="MyWiFiNetwork"
station_cfg.pwd="MyWiFiPassword"
station_cfg.save=true
station_cfg.auto=false
wifi.sta.config(station_cfg)

每次启动时

cfg =
  {
    ip="192.168.0.99",
    netmask="255.255.255.0",
    gateway="192.168.0.1"
  }
wifi.sta.setip(cfg)
wifi.sta.connect()

使用以下代码进行测试

function checkWIFI()
    ipAddr = wifi.sta.getip()

    if ( wifi.sta.status() == wifi.STA_GOTIP )then
        --LED亮起
        gpio.write(4, gpio.LOW)
        gpio.mode(4, gpio.OUTPUT)
        print("时间 " .. tmr.now()/1000 .. "ms")
        print("IP地址: " ..ipAddr)

    else
      --设定再次尝试的时间
      tmr.create():alarm(50, tmr.ALARM_SINGLE, checkWIFI)
    end
    print("WiFi状态 "  ..  wifi.sta.status())
end
tmr.create():alarm(50, tmr.ALARM_SINGLE, checkWIFI)
2022-01-11 12:59:09