在Nodemcu Esp8266 lua编程中,使用client:send()发送整个HTML代码。
2016-8-30 20:54:22
收藏:0
阅读:118
评论:5
我创建了一个 lua 文件,实现了一个 2 路继电器模块,通过一个网站控制卷帘门。
我跟着_led_webserver_ 的例子走,并在那基础上扩展了我的代码。
我尝试了很多种方法用 client:send() 函数来 发送一个完整的 html 页面,但好像都行不通。
这是一个我自己开发的页面,在电脑上可以正常工作,但我找不到简单的方法来发送它。
我声明了一个本地变量(比如 _test_),它包含所有的 HTML 代码,然后将它作为参数放入 client:send(test)。
还有其他方法可以做到吗?
点赞
用户1241224
发送超过几百个字节的调用通常失败。另外要意识到,在相同的lua代码块内对send进行多次连续调用会排队并在代码块返回后异步执行--这会消耗不切实际的大量内存。
因此,使用运行时值串联构建任何复杂页面都是有问题的。更合理的方法是让ESP8266将数据作为JSON返回,并从PC提供复杂页面,其中嵌入了查询ESP的脚本,并将数据折叠到页面中。
2015-08-09 16:07:35
用户1142045
在eps8266上,TCP堆栈不支持跨IP数据包进行流式传输。每次发送可以达到一个完整的IP数据包,但如果超过这个长度,你必须使用soc:on("sent",回调函数)逐个数据包发送。有关更多讨论,请参阅nodeMCU非官方FAQ。
2015-09-06 22:15:26
用户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
其他海报已经提供了很多好的信息,但我认为目前还没有一个好的解决方案来解决这个问题,即使在非官方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
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你可以使用以下代码:
buf = "<h1> ESP8266 Web 服务器</h1>"; buf = buf.."<h2>副标题</h2>"; client:send(buf);