2016-04-13 3 views
0

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

Edit 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 все еще работает (по крайней мере, последовательные линии)

+2

И сообщения об ошибках, если они есть. Перезагружается ли NodeMCU? – dda

+0

Вопрос бессмыслен, пока вы не покажете нам фактический код. –

+0

Я знаю. На данный момент я просто хотел узнать, появилась ли такая проблема кому-либо еще.Еще не наступил –

ответ

1

tmr.delay из 3 secs испортит стек wifi. Используйте 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 с помощью узла cloudMCU cloud builder.

+0

Не могу поверить, что я совершил такую ​​ошибку. Через 12 часов я проверю его и скажу вам результат! Благодаря! –

+0

Действительно, эта задержка была проблемой. Работает как очарование сейчас, спасибо! –

0

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

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

Это вообще плохой идеи, потому что ничего не получает, чтобы бежать, и сетевой стек (и другие) могут упасть в результате. может использовать только время tmr.delay(), если речь идет о периферийном устройстве , которому требуется (очень) кратковременная задержка между командами или аналогичным. Следует использовать с осторожностью!

Причина, почему вы добавили задержку в первую очередь потому, что вы хотите, чтобы ждать, пока стек WiFi не полностью инициализирован (т.е. IP назначен). Вместо этого вы должны настроить tmr.alarm, который «петляет» через 1 с, пока Wi-Fi не будет готов. Вот сокращенный пример из 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, как я в old Gist.

Также взгляните на net module API documentation.

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