NodeMCU 0.9.6-dev在ESP 8266(devkit v2)上:当使用dofile()脚本连接到TCP服务器时失败

正如标题所述,我编写了一个连接到天气API并输出结果的脚本。在解释器(ESPlorer“行发送”)中逐行运行代码时一切正常,但是当我通过'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()
点赞
用户131929
用户131929

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

最好从dev分支(Espressif SDK 1.5.1)中构建自己的NodeMCU固件。

然后您需要熟悉NodeMCU固件的异步事件驱动性质。net.socket:send()曾经是阻塞的(即非异步)在旧的SDK中是一个错误。

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

conn = net.createConnection()
conn:on("receive", function(conn, payload)
    -- 处理数据
end)
conn:on("connection", function(conn, payload)
    -- conn:send
end)
conn:connect(80, "api.openweathermap.org")

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

顺便提一下:在dev分支中有一个HTTP(客户端)模块,可简化通过HTTP访问远程资源的操作。

2016-05-08 13:49:03