我想花时间使用带有nodeMCU的EPS8266将我的RTC设置为I2C。
这是我的誓言:
-- file print.lua
local file = assert(loadfile("httpget.lua"))
file() --get Date and Time from google
print("Print follows:") --this should be executed after "file()"
print(date)
这是文件httpget.lua
:
-- file httpget.lua
print('httpget.lua started')
conn=net.createConnection(net.TCP, 0)
-- show the retrieved web page
conn:on("receive", function(conn, payload)
date = string.sub(payload,string.find(payload,"Date: ")
+6,string.find(payload,"Date: ")+35)
conn:close()
end)
conn:on("connection", function(conn, payload)
print('\nConnected')
conn:send("HEAD / HTTP/1.1\r\n"
.."Host: google.com\r\n"
.."Accept: */*\r\n"
.."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"
.."\r\n\r\n")
end)
-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload)
print("Disconnected\r\n"..date)
end)
conn:connect(80,'google.com')
conn = nil
结果是:
> dofile("print.lua")
httpget.lua started
Print follows: -- this should be at the end
nil -- date==nil because httpget.lua not executed
>
Connected
Disconnected
Sun, 26 Apr 2015 10:30:03 GMT
如果我再次执行scipt(没有重置),我会从执行之前得到日期。 我该怎么做才能执行" httpget.lua"得到" date"在随后的scipt?
我使用的是带有由Lua 5.1.4驱动的NodeMCU 0.9.6 build 20150406的ESP8266。 https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#index
我通过USB将ESPlorer v2.0的sripts加载到我的ESP8266。 conn.net ...命令是NodeMCU固件的一部分(参见链接)。您只能使用EPS8288和NodeMCU固件运行脚本。我的问题是:我发现无法正常结束conn:net例程并将数据返回到下一个programm部分。
答案 0 :(得分:3)
当评论者指出网络代码将异步运行时,即conn:on
调用将立即返回,并且稍后将调用它们的回调。 conn:connect
调用可能不是异步调用,但这并没有帮助。
在conn:connect
调用完成后,您的print
调用将立即运行,尝试打印全局变量date
。大多数情况下,这将打印nil
,因为从Google获取数据的网络延迟将在> 10毫秒内,这意味着您的代码已经有足够的时间来执行print语句。如果您对网络延迟非常幸运,那么在极少数情况下您可能会获得正确的日期(尽管这会非常令人惊讶)。
要解决此问题,您需要在传递给接收数据的conn:on
的回调中将完成网络请求时执行的代码放入。在你当前的代码结构中,这有点难以做到。
一个简单的解决方案是:
local function onReceiveCb(str)
print("Print follows:")
print(str)
end
local file = assert(loadfile("httpget.lua"))
....
请注意,在添加httpget代码之前,我已添加了onReceiveCb
函数。在httpget中,您可以调用回调:
conn:on("receive", function(conn, payload)
date = string.sub(payload,string.find(payload,"Date: ")
+6,string.find(payload,"Date: ")+35)
conn:close()
onReceiveCb(date) -- Call the callback!
end)
答案 1 :(得分:0)
使用回调函数的提案不起作用。我遇到了编译器错误。我现在以另一种方式解决了这个问题。 在conn:on(“断开连接”,函数(conn,payload)中,我加载文件来设置我的RTC。这样我就可以将数据传递给设置RTC的程序。(参见我的输出)
感谢您的帮助!!!
> dofile("httpget.lua");
httpget.lua started
>
Connected
Disconnected
----------------
Date: Mon, 27 Apr 2015 12:02:17 GMT -- printed in httpget.lua
Date: Mon, 27 Apr 2015 12:02:17 GMT -- printed in set_date.lua
Set RTC:
23 2 19 2 39 4 21 -- Bytes 0-6 in decimal of the DS1307 (1h for Daylight Savings Time added)
done
- 这是工作脚本:
print('httpget.lua started')
conn=net.createConnection(net.TCP, 0)
-- show the retrieved web page
conn:on("receive", function (conn, payload)
date = string.sub(payload,string.find(payload,"Date: ")
+0,string.find(payload,"Date: ")+35)
conn:close()
end)
-- when connected, request page (send parameters to a script)
conn:on("connection", function(conn, payload)
print('\nConnected')
conn:send("HEAD / HTTP/1.1\r\n"
.."Host: google.com\r\n"
.."Accept: */*\r\n"
.."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"
.."\r\n\r\n")
end)
-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload)
print("Disconnected\r\n")
print("----------------")
print(date)
dofile("set_date.lua");
end)
conn:connect(80,'google.com')
conn=nil