ESP8266-01 NodeMCU 通过 Lua 读取 JSON

我怎样才能从本地服务器收到并显示发送的 JSON 数据呢?我的意思是 ESP8266 版本 01 上的 Lua 脚本。最终,我想通过 I2C 将数据显示在连接到 ESP8266 的 2x16 LCD 上。

我想将 ESP-01 连接到一个 WebAPI 服务器,该服务器动态地以 JSON 格式发送包含不同信息的数据。我希望这些信息能够显示在连接到 ESP 的液晶显示屏上。我不知道如何解码 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) -- 这是第 10 行
print(t.lowVersion)

会显示:

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

如何从 JSON 中显示 "lowVersion" 或 "highVersion" 的值?

点赞
用户131929
用户131929

因此,这个问题的关键在于为什么你的cjson.decode()失败了?这是因为你的服务器似乎没有返回有效的 JSON。

以下两个示例在最近的dev分支节点MCU固件上都可以正常工作。

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},或者可能返回某些不可见但无效的字符。

2016-05-25 22:52:44