我创建了一个lua文件,它实现了一个2relay模块,通过网站控制滚动快门
我按照 led_webserver 示例进行了操作,并从那里扩展了我的代码
我尝试了很多方法来发送一个完整的HTML页面,功能client:send()
,
但它似乎没有用。
这是我自己开发的一个页面,它可以在电脑上运行,但我找不到一种简单的发送方式。
我声明了一个包含所有html代码的局部变量(例如 test ),然后我把它作为参数放在`client:send(test)中。
有人知道另一种方法吗?
答案 0 :(得分:2)
eps8266上的TCP堆栈不支持跨IP数据包流式传输。每次发送最多可以包含一个完整的IP数据包但长于此数据包,并且您已使用soc:on("sent",callback)
逐个数据包发送它们。有关详细信息,请参阅nodeMCU Unofficial FAQ。
答案 1 :(得分:1)
其他海报提供了很多好的信息,但我认为即使在非官方的常见问题解答中,这个问题还没有很好的具体解决方案。
要发送大型静态文件,您可以使用回调从闪存中加载它们并以块的形式发送它们。正如其他人所提到的,一次通话可以发送多少是有限的。单个回调中的多个发送调用可能无法按预期处理,并且可能占用太多内存。这是一个以块为单位加载和发送文件的简短示例:
local idx = 0 --keep track of where we are in the file
local fname = "index.html"
function nextChunk(c) --open file, read a chunk, and send it!
file.open(fname)
file.seek("set", idx)
local str = file.read(500)
if not str then return end --no more to send.
c:send(str)
idx = idx + 500
file.close() --close the file to let other callbacks use the filesystem
end
client:on("sent", nextChunk) --every time we send a chunk, start the next one!
nextChunk(client) --send the first chunk.
或者,使用协同程序和计时器,我们可以使它更灵活:
local ready = true --represents whether we are ready to send again
client:on("sent", function() ready=true end) --we are ready after sending the previous chunk is finished.
local function sendFile(fname)
local idx=0 --keep track of where we are in the file
while true do
file.open(fname)
file.seek("set", idx)
local str = file.read(500)
if not str then return end --no more to send.
c:send(str)
ready=false --we have sent something. we are no longer ready.
idx = idx + 500
file.close() --close the file to let other callbacks use the filesystem
coroutine.yield() --give up control to the caller
end
end
local sendThread = coroutine.create(sendFile)
tmr.alarm(0, 100, 1, function() --make a repeating alarm that will send the file chunk-by-chunk
if ready then coroutine.resume(sendThread, "index.html") end
if coroutine.status(sendThread) == "dead" then tmr.stop(0) end --stop when we are done
end)
答案 2 :(得分:0)
您可以使用以下内容:
buf = "<h1> ESP8266 Web Server</h1>";
buf = buf.."<h2>Subtitle</h2>";
client:send(buf);
答案 3 :(得分:0)
在一次通话中发送超过几百个字节会失败。还要意识到,在块返回后,在同一个lua块中发送的多个连续调用将被排队并异步执行 - 这会消耗不切实际的内存量。
因此,在连接运行时值的情况下构建任何复杂性的页面都是有问题的。一种更合理的方法是让ESP8266只返回JSON数据,并从PC上提供精美页面,使用嵌入式脚本查询ESP并将数据折叠到页面中。
答案 4 :(得分:0)
我找到了一个简单的解决方案。 我不得不发送一个包含文本的大文件,我使用了以下代码:
file.open("example.txt","r")
for counter=1, numboflinesinfile-1 do
client:send(file.readline() .. "<br>");
end
file.close()
计数器只是一个计数变量 numberoflinesinfile是您要发送的行数。
不是一个干净的解决方案,可能违反所有程序规则,但作为魅力。