NodeMCU WiFi 自动连接

NodeMCU WiFi auto connect

我正在尝试使用 Lua 语言解决 wifi 连接问题。我一直在梳理 the api to find a solution but nothing solid yet. I asked a previous question,,答案确实按照我提出的方式解决了问题,但没有达到我的预期。

基本上,我有来自两个不同提供商的两个不同网络。我想让 ESP8266 12e 做的就是检测当前网络何时或是否无法访问互联网并自动切换到下一个网络。它必须以 3 分钟的间隔持续尝试连接,直到成功而不是放弃。

出于测试目的,我在下面尝试了这段代码。计划是利用变量"effectiveRouter"写一些逻辑根据当前路由器切换

effectiveRouter = nil
function wifiConnect(id,pw)
    counter = 0
    wifi.sta.config(id,pw)
    tmr.alarm(1, 1000, tmr.ALARM_SEMI, function()  
    counter = counter + 1
        if counter < 10 then  
            if wifi.sta.getip() == nil then
              print("NO IP yet! Trying on "..id)
              tmr.start(1)
            else
                print("Connected, IP is "..wifi.sta.getip())

            end
        end     
    end)
end
wifiConnect("myNetwork","myPassword")
print(effectiveRouter)

当我 运行 该代码时,我在控制台上得到 effectiveRouter 作为 nil。这告诉我方法调用完成之前的打印语句 运行 print(effectiveRouter)。我对 lua 非常陌生,因为这是我第一次使用这种语言。我确信这个样板代码之前一定已经完成了。有人可以指出我正确的方向吗?我愿意转向 arduino IDE,因为我已经为 NodeMCU ESP8266 设置了它。也许我可以更好地遵循逻辑,因为我来自 java-OOP 背景。

您最好迁移基于回调的架构以确保您已成功连接。这是它的文档:

https://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistaeventmonreg

您可以收听

wifi.STA_GOTIP

并在其中进行自定义操作。不要忘记启动 eventmon。

P.s。我无法在相关函数中看到您的变量 effectiveRouter。

我最终坐下来测试了之前答案的草图。再加两行,我们就可以开始了...

我错过的是 wifi.sta.config()auto connect == true 时重置连接尝试(这是默认设置)。因此,如果您在连接到 X 的过程中调用它连接到 AP X,它将从头开始 - 因此在再次调用之前通常不会获得 IP。

effectiveRouter = nil
counter = 0
wifi.sta.config("dlink", "password1")
tmr.alarm(1, 1000, tmr.ALARM_SEMI, function()
  counter = counter + 1
  if counter < 30 then
    if wifi.sta.getip() == nil then
      print("NO IP yet! Keep trying to connect to dlink")
      tmr.start(1) -- restart
    else
      print("Connected to dlink, IP is "..wifi.sta.getip())
      effectiveRouter = "dlink"
      --startProgram()
    end
  elseif counter == 30 then
    wifi.sta.config("cisco", "password2")
    -- there should also be tmr.start(1) in here as suggested in the comment
  elseif counter < 60 then
    if wifi.sta.getip() == nil then
      print("NO IP yet! Keep trying to connect to cisco")
      tmr.start(1) -- restart
    else
      print("Connected to cisco, IP is "..wifi.sta.getip())
      effectiveRouter = "cisco"
      --startProgram()
    end
  else
    print("Out of options, giving up.")
  end
end)