2016-10-06 4 views
1

루아 어를 사용하여 wifi 연결을 해결하려고합니다. 나는 해결책을 찾기 위해 the api을 샅샅이 뒤졌지만 아직은 단단한 것이 없다. 나는 이전 질문 인 dynamically switch between wifi networks을 물었고 나는 그 질문에 답을했으나 예상했던대로 성취하지 못했습니다.NodeMCU WiFi 자동 연결

기본적으로 두 개의 서로 다른 제공 업체의 두 가지 네트워크가 있습니다. 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) 

, 나는 콘솔에 전무로 effectiveRouter를 얻을. 이것은 메서드 호출이 완료되기 전에 print 문이 실행되었음을 알려줍니다. print(effectiveRouter). 나는이 언어를 처음 사용하기 때문에 루아에 대해 매우 새롭다. 나는이 보일러 플레이트 코드가 전에 이루어 졌음에 틀림 없다는 것을 확신합니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까? NodeMCU ESP8266을 이미 설정했기 때문에 arduino IDE로 전환 할 수 있습니다. 내가 java-OOP 배경에서 왔을 때 나는 논리를 더 잘 따라갈 수 있을지 모른다.

+1

effectiveRouter는 제공된 코드에서 어떠한 값도 할당되지 않습니다. 어떻게 다른 일이 될 수 있습니까? 1000ms 후에 처음으로 꺼지는 타이머를 시작합니다. 그 시점에서 물론 effectiveRouter를 인쇄합니다. effectiveRouter를 인쇄 한 후 첫 번째 연결 시도가 발생합니다. 그러나 타이머 콜백에서 어떤 일이 발생하더라도 effectiveRouter – Piglet

+0

@ Piglet 값에 영향을 미치지 않습니다.이를 지적 해 주셔서 감사합니다. 실수입니다. 위의 코드는 내가 가지고 놀았던 많은 변형 중 하나입니다. 함수의 else 부분에서 "effectiveRouter = dlink"라는 과제를 삭제 한 곳의 빈 줄이 있습니다 – Binaryrespawn

답변

3

나는 결국 앉아서 이전의 대답에서 나의 스케치를 테스트했다. 두 개의 추가 라인과 우리가 갈 게있어 ...

내가 놓친 것은 (기본값) 인 경우 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

을 검토 할 것입니다. 설정을 변경 한 "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