2016-05-08 2 views
0

Как уже упоминалось, я написал скрипт, который подключается к API погоды и распечатывает результат.NodeMCU 0.9.6-dev на ESP 8266 (devkit v2): в то время как скрипт dofile() не подключается к TCP-серверу

Все работает нормально, когда я запускаю его по строкам через интерпретатор (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.9.x предварительно построенные исполняемые файлы, как они не устарели, больше не поддерживаются и содержат много ошибок.

Build your own NodeMCU firmware В идеале от филиала 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.

+0

Спасибо, очень полезно. –

+0

Полезно знать. Если это решит вашу проблему, примите и/отложите ответ, чтобы StackOverflow мог отметить этот случай как закрытый. –

Смежные вопросы