2017-12-23 54 views
-1

http.get()을 사용하여 현재 사용중인 API에서 JSON을 가져 오지만 데이터를 가져 오지 못합니다. 이 JSON이 NodeMCU에 비해 ​​너무 큽니다. 나는 subpart "stats :"에있는 정보 만 필요합니다. http.get() JSON의 일부만 가능합니까?NodeMCU에서 API를 사용할 때 JSON의 일부만 가져 오기

는 편집 :

이 나는 ​​또한 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"을 다른 함수에서 얻고 있기 때문에 "hashrate"는 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에서 데이터를 가져 오는 것으로 읽었습니다. co.kr은 원래 프로젝트에서 잘 작동합니다.

+0

이 같은 재미가 낮은 품질의 포스트 없지만이 개선 될 수있다 그리고 어떤이 생각하는 것 같이 아니, 그것은 오프 주제 아니라 그것은 NodeMCU에 루아 프로그래밍에 관하여이다.. 펌웨어. 누락 된 작은 자기 포함 된 코드 샘플 및 이상적으로 사용하는 API URL입니다. 유용한 링크 : https://stackoverflow.com/help/how-to-ask –

+0

@ MarcelStör 지금 많은 정보를 추가했습니다. 누군가가 지금 나를 도울 수 있기를 바랍니다 – Tanonic

+0

당신의 의견은 무엇입니까? –

답변

0

HTTP 모듈의 문제는 https://github.com/nodemcu/nodemcu-firmware/issues/1707과 관련되어 거의 확실합니다 (SSL 및 HTTP에는 문제가 있음).

따라서 현재 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에 대한 더 - 이동 보이지 않는다.
  • 현재 마스터 분기의 net/TLS 모듈이 api.aeon-pool.com에 연결하고 api.coinmarketcap.com에 연결하지 못합니다.
  • 오래되고 고정 된 1.5.4 분기를 사용하면 정확히 반대 방향입니다.
  • 펌웨어와 API 제공 업체간에 일치하지 않는 암호 조합에 문제가있을 수 있습니다.

-> :(그