NodeMCU 0.9.6-dev на ESP 8266 (devkit v2): пока скрипт dofile() не подключается к TCP-серверу

Как уже упоминалось, я написал скрипт, который подключается к 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()

person D. Schramm    schedule 08.05.2016    source источник


Ответы (1)


Не используйте эти старые готовые двоичные файлы 0.9.x, поскольку они устарели, больше не поддерживаются и содержат множество ошибок.

Создайте собственную прошивку NodeMCU в идеале из ветки dev (Espressif SDK 1.5.1 ).

Затем вам нужно привыкнуть к асинхронной, управляемой событиями природе прошивки NodeMCU. Это была ошибка в старых SDK, которую net.socket:send() когда-либо блокировал (т.е. неасинхронно).

Следовательно, вам нужно обработать входящие данные в обратном вызове s:on('receive'), и вам нужно подождать с отправкой запроса в s:on('connection'). Вот шаблон:

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")

Ознакомьтесь с документацией по API на странице https://nodemcu.readthedocs.io/en/dev/en/modules/net/.

Примечание: в ветке dev есть модуль HTTP (клиент), который упрощает доступ к удаленным ресурсам через HTTP.

person Marcel Stör    schedule 08.05.2016
comment
Спасибо, очень полезно. - person D. Schramm; 08.05.2016
comment
Хорошо знать. Если это решит вашу проблему, примите и/или проголосуйте за ответ, чтобы StackOverflow мог пометить это дело как закрытое. - person Marcel Stör; 08.05.2016