ESP 8266上的NodeMCU 0.9.6-dev(devkit v2):虽然dofile()脚本没有连接到TCP-server

时间:2016-05-08 11:07:36

标签: lua esp8266 nodemcu

如前所述,我编写了一个连接到天气API并打印出结果的脚本。

当我通过解释器逐行运行时,一切正常(ESPlorer"发送到ESP-并运行"逐行"")但是当我通过解释器执行时dofile()它无法连接到网站并失败。

我很困惑,希望你们中的一些人会发现我忽略的错误。

以下是代码:

data= ""
s= net.createConnection(net.TCP, 0)
s:on("receive", function(so, da) data= da end)
s:connect(80, "api.openweathermap.org")
s:send("GET /data/2.5/weather?q=berlin,de&appid=9a3719c191ce0e1e70673f892013647e&units=metric HTTP/1.1\r\nHost: www.api.openweathermap.org\r\n\r\n")
for x in string.gmatch(data, "([^\n]+)") do
    if string.find(x, '"coord"') ~= nil then
        for k,v in pairs(cjson.decode(x)) do
            if k == "main" or k == "weather" then 
            print("++++++"..k.."++++++")
            if type(v) == "table" then
                for kz, vz in pairs(v) do
                    if kz == 1 or kz == 2 then
                        for kd,vd in pairs(vz) do
                            print(kd,vd)
                        end 
                    else print(kz,vz) end
                    end end end
end end end
s:close()

1 个答案:

答案 0 :(得分:1)

不要使用那些旧的0.9.x预先构建的二进制文件,因为它们已经过时,不再受支持且包含大量错误。

Build your own NodeMCU firmware最好来自...getPrimarySub() memberOf $param ... UniversityConstamt.subjectCodes 分支(Espressif SDK 1.5.1)。

然后,您需要习惯于NodeMCU固件的异步事件驱动特性。这是dev阻止(即非异步)的旧SDK中的错误。

因此,您需要处理net.socket:send()回调中的传入数据,您需要等待s:on('receive')中的请求发送。这是模板:

s:on('connection')

查看https://nodemcu.readthedocs.io/en/dev/en/modules/net/上的API文档。

附注:conn = net.createConnection() conn:on("receive", function(conn, payload) -- processing data end) conn:on("connection", function(conn, payload) -- conn:send end) conn:connect(80, "api.openweathermap.org") 分支中有一个HTTP(客户端)模块,可以简化对HTTP上远程资源的访问。