ESP8266 с NodeMCU отвечает только 3 раза

У меня есть простой Lua-скрипт, который создает сервер, прослушивающий сообщения. Сценарий переворачивает вывод двух GPIO, когда появляется сообщение «led1» или «led2». Проблема в том, что скрипт работает только 2 или 3 раза. Я вернусь с настоящим сценарием.

Редактировать 1: сценарий для сервера следующий (часть GPIO была удалена для упрощения сценария):

wifi.setmode(1)
wifi.sta.config("my_router","12345678")
tmr.delay(3000000)
print(wifi.sta.getip())

s=net.createServer(net.TCP)
s:listen(433,function(conn)
    conn:on("receive",function(conn,payload)
        print(payload)
    conn:send("received")
    end)
    conn:on("sent",function(conn) conn:close() end)
end)

Результат следующий (если я отправлю «led1» на сервер более 3 раз):

>192.168.0.117 255.255.255.0 192.168.0.1
>led1
>led1
>led1

После этого клиент говорит, что «время ожидания соединения истекло», но ESP8266 все еще работает (по крайней мере, последовательные линии).


person Alex Radu    schedule 13.04.2016    source источник
comment
И сообщения об ошибках, если они есть. Перезагружается ли NodeMCU?   -  person dda    schedule 13.04.2016
comment
Вопрос бессмыслен, пока вы не покажете нам фактический код.   -  person Marcel Stör    schedule 13.04.2016
comment
Я знаю. На данный момент я просто хотел знать, возникла ли такая проблема у кого-либо еще. Еще не все   -  person Alex Radu    schedule 14.04.2016
comment
Нет, NodeMCU не перезагружается, серийный номер работает сразу после этого и на неопределенный срок.   -  person Alex Radu    schedule 14.04.2016


Ответы (2)


tmr.delay из 3 секунд испортит стек Wi-Fi. Используйте tmr.alarm и повесьте на него основную обработку. Этот пример отлично работал для меня:

do
  local srv = net.createServer(net.TCP)
    srv:listen(8888, function(sk)
      sk:on("receive", function(sk, rec)
      print("Received ", rec)
      sk:send("echo "..rec, sk.close)
    end)
  end)
  function close() srv:close() end
end

Последний аргумент для отправки — это просто обратный вызов завершения для закрытия сокета. Вам также нужно будет закрыть srv, чтобы освободить ссылку на функцию прослушивателя в реестре Lua.

Убедитесь, что вы используете текущую dev сборку облачного компоновщика nodeMCU.

person TerryE    schedule 14.04.2016
comment
Не могу поверить, что совершил такую ​​ошибку. Через 12 часов протестирую и сообщу результат! Спасибо! - person Alex Radu; 15.04.2016
comment
Действительно, эта задержка была проблемой. Теперь работает как шарм, спасибо! - person Alex Radu; 21.04.2016

Это в дополнение к ответу Терри.

Как он сказал, главная проблема в вашем tmr.delay(3000000). Есть причина, по которой он принимает микросекунды, а не миллисекунды. Вот выдержка из документации по API:

В целом это плохая идея, потому что больше ничего не запускается, и в результате сетевой стек (и другие вещи) может рухнуть. Единственное время, когда tmr.delay() может быть уместно использовать, - это при работе с периферийным устройством, которому требуется (очень) короткая задержка между командами или что-то подобное. Используйте с осторожностью!

Причина, по которой вы добавили задержку в первую очередь, заключается в том, что вы хотите дождаться полной инициализации стека WiFi (т.е. присвоения IP-адреса). Вместо этого вы хотите настроить tmr.alarm, который «зацикливается» с интервалом в 1 секунду, пока WiFi не будет готов. Вот сокращенный пример с сайта https://cknodemcu.wordpress.com:

--init.lua
function startup()
    -- do stuff here
end

print("set up wifi mode")
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID,PASSWORD)
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function() 
    if wifi.sta.getip() == nil then 
        print("IP unavaiable, Waiting...") 
    else 
        tmr.stop(1)
        print("Config done, IP is "..wifi.sta.getip())
        print("You have 5 seconds to abort Startup")
        print("Waiting...")
        tmr.alarm(0, 5000, 0, startup)
    end 
 end)

Вместо проверки wifi.sta.getip() вы также можете проверить wifi.sta.status() == 5 как я делаю в старом Gist.

Кроме того, ознакомьтесь с документацией по API сетевого модуля.

person Marcel Stör    schedule 14.04.2016