2016-10-06 15 views
1

私はLua言語を使用して無線LAN接続を解決しようとしています。私は解決策を見つけるためにthe apiまで櫛を切ってきましたが、まだ何も解決していません。私は前の質問 dynamically switch between wifi networksを尋ねました。私がそれを求めたところで答えが出ましたが、私が期待したことは達成できませんでした。NodeMCU WiFi自動接続

基本的に、私は2つの異なるプロバイダから2つの異なるネットワークを持っています。 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) 

私はそのコードを実行すると、私はコンソール上はnilとしてeffectiveRouterを取得します。これは、メソッド呼び出しが完了する前にprintステートメントが実行されたことを示しています。print(effectiveRouter)これは私の初めての言語であるため、私は非常に非常に新しいluaです。私はこのボイラープレートのコードが以前に行われていなければならないと確信しています。誰かが私を正しい方向に向けることができますか? NodeMCU ESP8266用にすでに設定しているので、私はarduino IDEに移行しています。私はjava-OOPの背景から来ているので、私はより良いロジックを追うことができるかもしれません。

+1

effectiveRouterは、指定されたコードでは決してasignedされません。どのようにそれ以外の何かになる必要はありません? 1000ミリ秒後に最初にオフになるタイマーを開始します。その時点ではもちろん、effectiveRouterを印刷します。 effectiveRouterを印刷した後、最初の接続が試みられます。しかし、あなたのタイマーのコールバックで何が起こっても、effectiveRouterの値には影響しません – Piglet

+0

@ピグレットそれを指摘してくれてありがとう、私の間違いです。上のコードは、私が周りに遊んだ多くのバリエーションの一つです。関数のelse部分の中には、どこから空行がありますか? "effectiveRouter = dlink"という割り当てを削除しました – Binaryrespawn

答えて

3

最終的に私は座って、以前の答えからスケッチをテストしました。 2行が追加されています。

私が逃したのは、(デフォルト)の場合、wifi.sta.config()は接続試行をリセットすることです。ですから、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) 
+0

明確化のためにありがとう、私はコード – Binaryrespawn

+0

を見直すだろうちょうど1つの簡単な追加、あなたが設定を変更した "elseif"の中で、私はループを続けるためにタイマ開始関数を呼び出さなければならなかった。上記のコードを変更しました。もう一度ありがとう、あなたは男をロック! – Binaryrespawn

+0

バマー、もちろんそうです。デバイスが約1秒でAPに接続されているため、テスト中に気付かなかった。ありがとう、私は上記のコードでコメントを追加しました。 –

2

コールバックベースのアーキテクチャを移行して、正常に接続したことを確認することをお勧めします。ここではそのためのドキュメントです:

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

あなたがのために

wifi.STA_GOTIP

を聞いて、それにカスタム操作を行うことができます。 eventmonを開始することを忘れないでください。

P.S.私はあなたの変数effectiveRouterを関連する関数で見ることができません。

+0

これは実際の問題を解決するものではありません。 IMOそれは答えのための資格がありません。タイマーやコールバックを使用するのと同じ効果があります。コールバックは単にやや近代的なアプローチです。 –

+0

あなたは正しいです。私は、現在のコードの複雑さを減らし、関連する変数が定義されていないのでユーザーに注意を喚起したいだけです。だから、追跡が楽になるだろう。ご意見ありがとうございます。 – cagdas

関連する問題