2016-09-25 53 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