2016-05-08 9 views
0

Wie erwähnt, schrieb ich ein Skript, das eine Verbindung zu einer Wetter-API herstellt und das Ergebnis ausdrucken.NodeMCU 0.9.6-dev auf ESP 8266 (devkit v2): während Dofile() Skript keine Verbindung zu TCP-Server

Alles funktioniert gut, wenn ich es Zeile für Zeile durch den Interpreter (ESPlorer "Senden an ESP- und Ausführen" Zeile für Zeile ""), aber wenn ich es über dofile() ausführen kann es keine Verbindung zur Website und schlägt fehl.

Ich bin verwirrt und hoffe, dass einige von euch den Fehler finden, den ich ignoriere. Hier

ist der Code:

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

Antwort

1

nicht jene alte 0.9.x verwenden vorgefertigte Binärdateien, da sie veraltet sind, nicht mehr unterstützt und enthalten viele Bugs.

Build your own NodeMCU firmware idealerweise aus dem Zweig dev (Espressif SDK 1.5.1).

Dann müssen Sie sich an die asynchrone, ereignisgesteuerte Art der NodeMCU-Firmware gewöhnen. Es war ein Fehler in den alten SDKs, der net.socket:send() jemals blockierte (d. H. Nicht asynchron).

Daher müssen Sie die eingehenden Daten im s:on('receive') Callback verarbeiten und Sie müssen mit dem Senden der Anfrage in s:on('connection') warten. Hier ist die Vorlage:

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

Werfen Sie einen Blick auf die API-Dokumentation zu https://nodemcu.readthedocs.io/en/dev/en/modules/net/.

Seitliche Anmerkung: Es gibt ein HTTP (Client) -Modul im Zweig dev, das den Zugriff auf Remoteressourcen über HTTP vereinfacht.

+0

Vielen Dank, sehr hilfreich. –

+0

Gut zu wissen. Wenn dies Ihr Problem löst, akzeptieren Sie und/upvote die Antwort, so dass StackOverflow diesen Fall als geschlossen markieren kann. –