2016-10-06 5 views
1

Я пытаюсь разрешить соединение wifi с использованием языка Lua. Я расчесывал the api, чтобы найти решение, но ничего не получилось. Я задал предыдущий вопрос, dynamically switch between wifi networks, и ответ затронул вопрос так, как я его спросил, но он не выполнил то, что я ожидал.NodeMCU WiFi auto connect

В принципе, у меня есть две разные сети от двух разных поставщиков. Все, что я хочу сделать 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(effectiveRouter). Я очень новичок в lua, так как это мой первый раз с языком. Я уверен, что этот код котловой плиты должен был быть сделан раньше. Может ли кто-нибудь указать мне в правильном направлении? Я открыт для перехода в среду разработки arduino, поскольку я уже настроил ее для NodeMCU ESP8266. Возможно, я смогу лучше следовать логике, поскольку я исхожу из фона java-OOP.

+1

effectiveRouter никогда не присваивается никаким значением в предоставленном коде. как он должен стать чем-то другим, кроме нуля? вы запускаете таймер, который отключится в первый раз после 1000 мс. то вы сразу же печатаете эффективный Router, который, конечно, ноль в этот момент. первая попытка подключения произойдет после того, как вы напечатали эффективный роутер. Но независимо от того, что происходит в вашем обратном вызове таймера, это не влияет на значение effectiveRouter – Piglet

+0

@Piglet Спасибо, что указали это, моя ошибка. Код выше является одним из многих вариантов, с которыми я играл. Внутри другой части функции у меня есть пустая строка, из которой я удалил назначение «effectiveRouter = dlink» – Binaryrespawn

ответ

3

В итоге я сел и испытал свой эскиз из предыдущего ответа. Две дополнительные линии, и мы хорошо ...

Что я пропустил, так это то, что wifi.sta.config() сбрасывает попытки соединения, если auto connect == true (что по умолчанию). Итак, если вы позвоните ему, чтобы подключиться к AP X, пока он находится в процессе подключения к 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

Bummer, вы правы, конечно. Во время тестирования я не заметил, потому что мое устройство подключилось к AP примерно за 1 секунду. Спасибо, я добавил комментарий в код выше. –

2

Вы должны перенести архитектуру обратного вызова, чтобы быть уверенным, что вы успешно подключены. Вот документ для него:

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

Вы можете слушать

wifi.STA_GOTIP

И сделать свои собственные операции в нем. Не забудьте запустить eventmon.

P.s. Я не могу видеть вашу переменную effectiveRouter в связанной функции.

+0

Это никак не затрагивает реальную проблему. ИМО не претендует на получение ответа. Использование таймера или обратных вызовов имеет тот же эффект. Обратные вызовы - это просто более современный подход. –

+0

Вы правы, Марсель. Я просто хотел бы уменьшить сложность текущего кода и обратить внимание пользователя на то, что связанная переменная не определена. Так что было бы легче проследить. Спасибо за ваш комментарий. – cagdas

Смежные вопросы