在Nodemcu Esp8266 lua编程中,使用client:send()发送整个HTML代码。

我创建了一个 lua 文件,实现了一个 2 路继电器模块,通过一个网站控制卷帘门。

我跟着_led_webserver_ 的例子走,并在那基础上扩展了我的代码。

我尝试了很多种方法用 client:send() 函数来 发送一个完整的 html 页面,但好像都行不通。


这是一个我自己开发的页面,在电脑上可以正常工作,但我找不到简单的方法来发送它。

我声明了一个本地变量(比如 _test_),它包含所有的 HTML 代码,然后将它作为参数放入 client:send(test)

还有其他方法可以做到吗?

点赞
用户2696938
用户2696938

你可以使用以下代码:

    buf = "<h1> ESP8266 Web 服务器</h1>";
    buf = buf.."<h2>副标题</h2>";
    client:send(buf);
2015-07-11 03:56:09
用户1241224
用户1241224
发送超过几百个字节的调用通常失败。另外要意识到,在相同的lua代码块内对send进行多次连续调用会排队并在代码块返回后异步执行--这会消耗不切实际的大量内存。

因此,使用运行时值串联构建任何复杂页面都是有问题的。更合理的方法是让ESP8266将数据作为JSON返回,并从PC提供复杂页面,其中嵌入了查询ESP的脚本,并将数据折叠到页面中。
2015-08-09 16:07:35
用户1142045
用户1142045

在eps8266上,TCP堆栈不支持跨IP数据包进行流式传输。每次发送可以达到一个完整的IP数据包,但如果超过这个长度,你必须使用soc:on("sent",回调函数)逐个数据包发送。有关更多讨论,请参阅nodeMCU非官方FAQ

2015-09-06 22:15:26
用户5381974
用户5381974

我发现了一个简单的解决方案。我需要发送一个包含文本的大文件,我用了以下代码:

    file.open("example.txt","r")
    for counter=1, numboflinesinfile-1 do
    client:send(file.readline() .. "<br>");
    end
    file.close()

其中,counter是一个计数变量,numberoflinesinfile是您想要发送的行数。这不是一个干净的解决方案,也许违反了所有程序规则,但是效果很好。

2015-09-27 16:03:31
用户5859865
用户5859865

其他海报已经提供了很多好的信息,但我认为目前还没有一个好的解决方案来解决这个问题,即使在非官方FAQ中也是如此。

要发送大的静态文件,你可以从闪存中加载它们并且使用回调函数将它们分块发送。就像其他人提到的,有一个发送最大数据量的限制。而且,单个回调中的多次发送调用可能无法按照您预期的方式处理它们,并且可能会占用太多内存。下面是一个简短的示例,展示了如何分块加载和发送一个文件:

local idx = 0 --跟踪文件中的文件位置
local fname = "index.html"

function nextChunk(c) --打开文件,读取一块并发送它!
      file.open(fname)
      file.seek("set", idx)
      local str = file.read(500)
      if not str then return end --没有更多要发送的了。
      c:send(str)
      idx = idx + 500
      file.close() --关闭文件以让其他回调使用文件系统
end
client:on("sent", nextChunk) --每次发送一块数据后,开始下一块数据!
nextChunk(client) --发送第一块数据。

或者,使用协同程序和定时器,我们可以使它更加灵活:

local ready = true --表示我们是否准备好再次发送
client:on("sent", function() ready=true end) --在发送前一块数据完成后,我们准备好进行下一块的发送。

local function sendFile(fname)
    local idx=0 --跟踪文件中的文件位置
    while true do
        file.open(fname)
        file.seek("set", idx)
        local str = file.read(500)
        if not str then return end --没有更多要发送的了。
        c:send(str)
        ready=false --我们已经发送了一些数据,现在我们不再准备好了。
        idx = idx + 500
        file.close() --关闭文件以让其他回调使用文件系统
        coroutine.yield() --将控制权交还给调用者
    end
end

local sendThread = coroutine.create(sendFile)
tmr.alarm(0, 100, 1, function() --创建一个重复定时器,以块为单位发送文件。
    if ready then coroutine.resume(sendThread, "index.html") end
    if coroutine.status(sendThread) == "dead" then tmr.stop(0) end --当完成后停止
end)
2016-01-30 03:55:16