【问题标题】:dynamically switch between wifi networkswifi网络之间动态切换
【发布时间】:2017-02-02 21:24:03
【问题描述】:

我在家里有两个 WiFi 网络,我想使用我的 NodeMCU ESP8266 V1 从世界任何地方通过网络远程控制多个继电器。为此,我正在考虑测试 WiFi连接,如果我在 1 分钟内没有获得 IP,请尝试其他网络,直到我获得 IP。这是我在下面的代码中遵循的API docs for tmr

有没有办法使用 Lua 以编程方式在两个或多个 wifi 网络之间切换?我正在使用 Lua 语言,但如果需要,我可以迁移到 arduino IDE。

wifi.setmode(wifi.STATION)
myRouter = "dlink"
tmr.alarm(1, 60000, tmr.ALARM_SINGLE, function()
      if myRouter=="dlink" then
        print("Dlink selected")
        wifi.sta.config("dlink","password1")
        wifi.sta.connect()  
             if wifi.sta.getip() == nil then
                 print("NO IP yet! ,Connecting...")
             else
                 tmr.stop(1)
                 print("Connected, IP is "..wifi.sta.getip())
             end           
      elseif myRouter=="cisco" then
        print("Cisco selected")
        wifi.sta.config("cisco","passoword2")
        wifi.sta.connect()  
             if wifi.sta.getip() == nil then
                 print("NO IP yet! ,Connecting...")
             else
                 tmr.stop(1)
                 print("Connected, IP is "..wifi.sta.getip())
             end
      else
         print("No network is giving an ip")            
      end            
end)

我正在寻找的是一个回调,它会在计时器 "tmr" 到期时触发。这样我可以将变量更改为 myRouter="cisco"。请注意,在上面的代码中,我无法更改“myRouter”变量。

我考虑使用software watchdog 一直监控连接性,因此如果或当 WiFi 在一个网络上掉线时,它将通过运行上面的代码触发重新连接。我不确定如何执行此操作或通常如何执行此操作,因为我对 lua 非常陌生。请建议或指出可以在这方面提供帮助的资源。谢谢大家。

【问题讨论】:

  • 你可以随时在代码的任何地方改变myRouter的值。它是一个全局变量。至少在您提供的代码中。您的代码将在 1 分钟后尝试连接到网络。如果成功,则停止(您有一个单次计时器,无需停止它),如果您不成功,则打印“还没有 IP!,正在连接...”,然后您的程序就完成了。如果无法连接,为什么不重新启动计时器?请再次阅读 tmr 文档。我认为你没有得到它的作用。
  • 感谢您的快速回复,我理解它是一个全局变量,我可以随时更改它。问题是我什么时候改变它。是否有在计时器自动重新启动之前调用的函数,我可以在其中更新变量然后跳回计时器代码?也就是说,假设没有建立连接。我会查看文档。
  • 你应该在定时器回调中改变它。在您的实现中,当您初始化单次计时器 (tmr.ALARM_SINGLE) 时,计时器根本不会重新启动。它将在 60000 毫秒到期后执行您的代码一次。结帐自动和半自动计时器。尝试连接,启动计时器,当它到期时(1分钟后),检查是否成功,如果没有更改路由器并重新启动计时器(因此它将在1分钟内再次检查),如果是,你不必须重新启动计时器,然后你就完成了。

标签: lua wifi nodemcu


【解决方案1】:

这是一段未经测试的快速拼凑的代码。

effectiveRouter = nil
counter = 0
wifi.sta.config("dlink", "password1")
tmr.alarm(1, 1000, tmr.ALARM_SEMI, function()
  counter = counter + 1
  if counter < 60 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 < 120 then
    wifi.sta.config("cisco", "password2")
    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)

它将首先尝试连接到 'dlink' 60 秒,然后再连接到 'cisco' 60 秒,如果两次尝试均未成功,最终将放弃。它使用semi-automatic timer,只有在没有 IP 的情况下才会重新启动。

【讨论】:

  • Marcel Stör,感谢您的努力,我一定会测试代码。非常感谢。
  • @Binaryrespawn 如上所述,请确保您了解不同计时器模式的行为方式。单发、半自动和自动定时器。请注意,Marcel 在他的代码中使用了另一种计时器类型,而不是您使用的。我建议你从一个非常小的程序开始。 1 个打印文本的计时器。尝试所有模式,重新启动它,停止它,当你知道它是如何工作的时,在更复杂的场景中使用它,比如你的 wifi 连接代码。
  • 谢谢Piglet,在写最终代码之前我需要先熟悉一下api。你看这是我第一次尝试 Lua 代码。非常感谢
  • @Marcel Stör,您发送的代码解决了我的问题,但是我认为我将 wifi 站设置为自动,如此处所述nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistaconfig,因此它仅适用于第一个网络并尝试第二个网络.如果我故意为 dlink 提供了错误的密码,它不会连接到 cisco。我现在正在研究这个
猜你喜欢
  • 2011-10-22
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2012-04-19
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多