2017-12-23 7 views
-1

http.get()を使用して、使用しているAPIからJSONを取得していますが、データが取得されません。私はこのJSONがNodeMCUにとって大きすぎるのではないかと疑っています。私は、サブパート "stats:"の情報だけが必要です。それは可能なのはhttp.get() JSONのその部分ですか?NodeMCUでAPIを使用するときにJSONの一部のみを取得する

はEDITは:

これは私もgetstatsを()

function getaeonrate() 
http.get("https://api.coinmarketcap.com/v1/ticker/aeon/?convert=EUR", nil, function(code, dataaeon) 
    if (code < 0) then 
     print("can't get aeon")  
    else 
     -- Decode JSON data 
     m = cjson.decode(dataaeon) 
     -- Extract AEON/EUR price from decoded JSON 
     aeonrate = string.format("%f", m[1]["price_eur"]); 
     aeonchange = "24h " .. m[1]["percent_change_24h"] .. "% 7d " .. m[1]["percent_change_7d"] .. "%" 
     dofile('update_display.lua') 
     end 
    end) 
end 

の上に別のAPIからデータを取得し、別の機能を持っている。しかし、今奇妙なことがある私のコード

function getstats() 
http.get("https://api.aeon-pool.com/v1/stats_address?address=WmsGUrXTR7sgKmHEqRNLgPLndWKSvjFXcd4soHnaxVjY3aBWW4kncTrRcBJJgUkeGwcHfzuZABk6XK6qAp8VmSci2AyGHcUit", nil, function(code, pool) 
     if (code < 0) then 
      print("can't get stats") 
     else 
      h = cjson.decode(pool) 
      hashrate = h[1]["hashrate"] 
      print(hashrate) 
      dofile('update_display.lua') 
     end 
    end) 
end 

ですgetstats()から 'pool'にアクセスしたいときは、getaeonrate()からjsonデータを取得します。だから私は別の関数からjsonを取得しているので、 "ハッシュレート"はjsonでさえありません。

は私だけgetstatsを持つ新しいプロジェクトを()作ってみました、それは私はいつも、私は応答がapi.aeon-から大きすぎると考えた。この

HTTP client: Disconnected with error: -9 
HTTP client: Connection timeout 
HTTP client: Connection timeout 

昨日のようなエラーが出全く動作しません。 pool.com、私はあなたのウェブブラウザのjsonを見れば、トップエントリが 'stats:'であることがわかります。私はそれだけ必要ですが、他のものはありません。だからリクエストが大きい場合は、http.get()だけにjsonの部分、つまり私の元の質問がうまくいくでしょう。現時点では、何が正しく動作していないのか分かりませんが、nodemcuファームウェアは一般的にhttp.get()に問題があり、正しく動作しませんでしたが、api.coinmarketcapからデータを取得しています。 comは元のプロジェクトで正常に動作します。

+0

このようには楽しいが、低品質のポストではありませんが、それを向上させることができ、いくつかは、と思うかもしれないとして、いや、それはオフトピックはありませんそれはNodeMCUのLuaのプログラミングについてです。ファームウェア。欠けているのは、自己完結型の小さなコードサンプルで、理想的には使用しているAPIへのURLです。役に立つリンク:https://stackoverflow.com/help/how-to-ask –

+0

@MarcelStörは今多くの情報を追加しました誰かが今私を助けることを願って – Tanonic

+0

あなたのフィードバックは何ですか? –

答えて

0

HTTPモジュールの問題は、(SSL及びHTTPは問題がある)https://github.com/nodemcu/nodemcu-firmware/issues/1707に関するほぼ確実です。

したがって、私は、現在のmasterブランチの詳細ベアボーンTLSモジュールを試してみました。つまり、JSONコンテンツを探しているすべてのヘッダーを含むHTTP応答を手動で解析する必要があります。また、あなたはまだCJSONを使用しているとして、古いNodeMCUバージョンであるように見える - 私は以下SJSON使用:受信イベントはすべてのために解雇されていることを

現在NodeMCUマスターブランチ

function getstats() 
    buffer = nil 
    counter = 0 
    local srv = tls.createConnection() 
    srv:on("receive", function(sck, payload) 
    print("[stats] received data, " .. string.len(payload)) 
    if buffer == nil then 
     buffer = payload 
    else 
     buffer = buffer .. payload 
    end 
    counter = counter + 1 

    -- not getting HTTP content-length header back -> poor man's checking for complete response 
    if counter == 2 then 
     print("[stats] done, processing payload") 
     local beginJsonString = buffer:find("{") 
     local jsonString = buffer:sub(beginJsonString) 
     local hashrate = sjson.decode(jsonString)["stats"]["hashrate"] 
     print("[stats] hashrate from aeon-pool.com: " .. hashrate) 
    end 
    end) 
    srv:on("connection", function(sck, c) 
    sck:send("GET /v1/stats_address?address=WmsGUrXTR7sgKmHEqRNLgPLndWKSvjFXcd4soHnaxVjY3aBWW4kncTrRcBJJgUkeGwcHfzuZABk6XK6qAp8VmSci2AyGHcUit HTTP/1.1\r\nHost: api.aeon-pool.com\r\nConnection: close\r\nAccept: */*\r\n\r\n") 
    end) 
    srv:connect(443, "api.aeon-pool.com") 
end 

注意をネットワークフレーム:https://nodemcu.readthedocs.io/en/latest/en/modules/net/#netsocketon

NodeMCUは、TLSハンドシェイクエラーのためにapi.coinmarketcap.comへの接続を確立できません。それがなぜであるかわからない。そうでなければ、getaeonrate()も同様に実装できます。ネットモジュールはcoinmarketcap.comに接続することができ、古い枝付き

冷凍1.5.4ブランチ

function getaeonrate() 
    local srv = net.createConnection(net.TCP, 1) 
    srv:on("receive", function(sck, payload) 
    print("[aeon rate] received data, " .. string.len(payload)) 
    local beginJsonString = payload:find("%[") 
    local jsonString = payload:sub(beginJsonString) 
    local json = cjson.decode(jsonString) 
    local aeonrate = string.format("%f", json[1]["price_eur"]); 
    local aeonchange = "24h " .. json[1]["percent_change_24h"] .. "% 7d " .. json[1]["percent_change_7d"] .. "%" 
    print("[aeon rate] aeonrate from coinmarketcap.com: " .. aeonrate) 
    print("[aeon rate] aeonchange from coinmarketcap.com: " .. aeonchange) 
    end) 
    srv:on("connection", function(sck, c) 
    sck:send("GET /v1/ticker/aeon/?convert=EUR HTTP/1.1\r\nHost: api.coinmarketcap.com\r\nConnection: close\r\nAccept: */*\r\n\r\n") 
    end) 
    srv:connect(443, "api.coinmarketcap.com") 
end 

結論

  • HTTPモジュールとTLSが原因ファームウェア(1707)のバグのため、あなたのAPIのノー行くようではありません。
  • 現在のmasterブランチのnet/TLSモジュールは、api.aeon-pool.comに接続するために管理しますが、api.coinmarketcap.comには接続しません。
  • 古いと凍った1.5.4ブランチではまったく逆です。
  • ファームウェアとAPIプロバイダの間で一致しない暗号スイートに問題があるかもしれません。

- > :(その

関連する問題