2016-05-08 5 views
0

前述のように私は天気APIに接続して結果を出力するスクリプトを作成しました。NodeMCU ESP 8266(devkit v2)のNodeMCU 0.9.6-dev:dofile()スクリプトがTCPサーバーに接続していない

インタプリタ(ESPlorer "ESPに送信し、行ごとに"行)を介して1行ずつ実行するとすべてうまく動作しますが、dofile()で実行するとサイトに接続できず失敗します。

私は混乱しています。私が無視している間違いを見つけてくれる人もいらっしゃいましたら幸いです。

がここにコードされています。彼らは時代遅れだとしてそれらの古い0.9.x事前に構築されたバイナリを使用しないでください、もはや

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

サポートされておらず、多くのバグを含んでいます。

Build your own NodeMCU firmware理想的にはdevブランチ(Espressif SDK 1.5.1)です。

NodeMCUファームウェアの非同期イベント駆動型の性質に慣れておく必要があります。 net.socket:send()がブロックされていた(つまり非同期ではない)古いSDKのバグだった。

したがって、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") 

https://nodemcu.readthedocs.io/en/dev/en/modules/net/のAPIドキュメントをご覧ください。

サイドノート:devブランチにHTTP経由のリモートリソースへのアクセスを簡素化するHTTP(クライアント)モジュールがあります。

+0

ありがとう、非常に参考になりました。 –

+0

お役立ち情報これであなたの問題が解決したら、StackOverflowがこのケースをクローズとしてマークできるように、回答を受け入れて/ upvoteしてください。 –

関連する問題