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