0

我有一个简单的 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 仍然可以工作(至少是串行线)

4

2 回答 2

1

A tmr.delay3 秒将搞砸 wifi 堆栈。使用 atmr.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 cloud builder 的当前版本

于 2016-04-14T16:16:59.230 回答
0

这是特里回答的补充。

正如他所说,主要问题是您的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 文档

于 2016-04-14T19:36:52.090 回答