我在家里有两个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很新颖。请告知或指出我可以在这方面提供帮助的资源。多谢你们。
您可以随时在代码中的任何地方更改myRouter的值。它是一个全球变量。至少在你提供的代码中。 您的代码将在1分钟后尝试连接到网络。如果你成功了,你就停下来(你有一个单独的计时器,不需要停止它),如果你没有成功,你打印出“没有IP!,连接...”,然后你的程序就完成了。如果无法连接,为什么不重新启动计时器? 请再次阅读tmr文档。我认为你没有得到它所做的。 – Piglet
感谢您的快速回复,我了解它是一个全局变量,我可以随时更改它。问题是我什么时候改变它。是否有一个函数在定时器自动重新启动之前调用,我可以更新变量然后跳回到定时器代码中?也就是说,假设没有建立连接。我会查看文档。 – Binaryrespawn
你应该在定时器回调中改变它。在你的实现中,当初始化单次计时器(tmr.ALARM_SINGLE)时,定时器将不会重新启动。它将在60000ms过期后执行您的代码。结帐自动和半自动计时器。 尝试连接,启动计时器,当计时器到期时(1分钟后),检查您是否成功,如果没有更改路由器并重新启动计时器(所以它会在1分钟内再次检查),如果是的话,不得不重新启动计时器,你就完成了。 – Piglet