带有NodeMCU的ESP8266仅响应3次

时间:2016-04-13 06:45:47

标签: lua esp8266 nodemcu

我有一个简单的Lua脚本,可以创建一个侦听消息的服务器。当消息为“led1”或“led2”时,脚本将翻转两个GPIO的输出。问题是脚本只能工作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仍然可以工作(至少是串行线路)

2 个答案:

答案 0 :(得分:1)

3秒的tmr.delay会搞砸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

发送的最后一个arg只是一个关闭套接字的完成回调。您还需要关闭srv以释放Lua注册中对侦听器功能的引用。

确保使用nodeMCU云构建器中的当前dev版本。

答案 1 :(得分:0)

这是特里回答的补充。

正如他所说,主要问题是你的tmr.delay(3000000)。有一个原因,它接受 micro 秒而不是毫秒。以下是API documentation的摘录:

  

这通常是糟糕的想法,因为没有别的东西可以运行,而且   因此,网络堆栈(和其他东西)可能会倒下。该   只有时间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.status() == 5一样检查old Gist,而不是检查wifi.sta.getip()

另外,请查看net module API documentation