2016-09-25 89 views
0

我在家里有两个WiFi网络,我想用我的NodeMCU ESP8266 V1来从世界任何地方通过网络远程控制几个中继。为了达到这个目的,我想测试WiFi连通性,如果我在1分钟内没有获得IP,请尝试其他网络,直到获得IP。这是我在下面的代码中遵循的API docs for tmr在WiFi网络之间动态切换

有没有办法使用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很新颖。请告知或指出我可以在这方面提供帮助的资源。多谢你们。

+0

您可以随时在代码中的任何地方更改myRouter的值。它是一个全球变量。至少在你提供的代码中。 您的代码将在1分钟后尝试连接到网络。如果你成功了,你就停下来(你有一个单独的计时器,不需要停止它),如果你没有成功,你打印出“没有IP!,连接...”,然后你的程序就完成了。如果无法连接,为什么不重新启动计时器? 请再次阅读tmr文档。我认为你没有得到它所做的。 – Piglet

+0

感谢您的快速回复,我了解它是一个全局变量,我可以随时更改它。问题是我什么时候改变它。是否有一个函数在定时器自动重新启动之前调用,我可以更新变量然后跳回到定时器代码中?也就是说,假设没有建立连接。我会查看文档。 – Binaryrespawn

+0

你应该在定时器回调中改变它。在你的实现中,当初始化单次计时器(tmr.ALARM_SINGLE)时,定时器将不会重新启动。它将在60000ms过期后执行您的代码。结帐自动和半自动计时器。 尝试连接,启动计时器,当计时器到期时(1分钟后),检查您是否成功,如果没有更改路由器并重新启动计时器(所以它会在1分钟内再次检查),如果是的话,不得不重新启动计时器,你就完成了。 – Piglet

回答

3

这是一个未经测试的快速放在一起的代码段。

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) 

它会首先尝试连接到60秒“DLINK”,再到“思科”另一个60年代,并最终放弃后,如果没有尝试是成功的。它使用semi-automatic timer,只有在没有IP的情况下才会重新启动。

+0

MarcelStör,感谢你的努力,我一定会测试代码。非常感谢。 – Binaryrespawn

+0

@Binaryrespawn如上所述,确保你得到不同的计时器模式的行为。单发,半自动和自动定时器。请注意,Marcel在他的代码中使用了另一个计时器类型。 我建议你从一个非常小的程序开始。 1个打印文本的计时器。尝试所有模式,重新启动它,停止它,当你知道它是如何工作的,在更复杂的场景中使用它,比如你的wifi连接代码。 – Piglet

+0

感谢Piglet,在编写最终代码之前,我需要熟悉api。你看到这是我第一次尝试Lua代码。非常感谢 – Binaryrespawn