ESP8266-01 NodeMCU在Lua中读取JSON

时间:2016-05-23 15:50:37

标签: lua esp8266 nodemcu

如何接收和显示从本地服务器发送的JSON数据?我的意思是Lua中的脚本在ESP8266版本01上发射。最后,我想通过I2C在附加的LCD 2x16到ESP8266上显示数据。

我想将ESP-01连接到webapi服务器,该服务器以JSON动态发送包含不同信息的数据。我希望此信息显示在连接到ESP的LCD上。我不知道如何解码JSON数据。服务器地址为192.168.1.8:8057/api

行。我试试这个:

sk=net.createConnection(net.TCP, 0) 
sk:on("receive", function(sck, c) 
d = c
end )
sk:connect(8095,"192.168.1.8") 
sk:send("GET /api/ HTTP/1.1\r\nHost: 192.168.1.8\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")

print(d)

并显示结果:

{"lowVersion":1,"highVersion":3}

如果我尝试:

sk=net.createConnection(net.TCP, 0) 
sk:on("receive", function(sck, c) 
d = c
end )
sk:connect(8095,"192.168.1.8") 
sk:send("GET /api/ HTTP/1.1\r\nHost: 192.168.1.8\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")

local t = cjson.decode(d) -- this is line 10
print(t.lowVersion)

显示:

test.lua:10: Expected value but found invalid token at character 1

如何从JSON显示值“lowVersion”或“highVersion”?

1 个答案:

答案 0 :(得分:0)

所以,整个问题归结为你的cjson.decode()失败的原因?这是因为你的服务器似乎没有返回有效的JSON。

以下两个示例都可以在dev分支的最新NodeMCU固件上正常工作。

local t = cjson.decode('{"lowVersion":1,"highVersion":3}')
print(t.lowVersion)

http.get("http://httpbin.org/get", nil, function(code, data)
    if (code < 0) then
      print("HTTP request failed")
    else
      local t = cjson.decode(data)
      for k,v in pairs(t) do print(k,v) end
    end
  end)

收益率

1

args    table: 3fff0618
url http://httpbin.org/get
origin  xxx.71.91.xxx
headers table: 3fff0a88

因此,您的服务器似乎不会一直返回{"lowVersion":1,"highVersion":3},或者它可能会返回某些不可见但无效的字符。