ESP8266/NodeMCU RESTful HTTP 发布
2018-3-1 2:32:12
收藏:0
阅读:85
评论:1
以下代码在 ESP8266 微控制器上运行,将基本传感器读数的流通过 HTTP 发布到 Ubidots Web 服务 API。使用 NodeMCU Lua 解释器(现在想使用 Lua,不想使用其他替代方案,例如 Arduino IDE 或 MicroPython。)
“传感器数据”似乎可以运行(现在是虚拟),计时器事件会发布读数,我认为 POST 的 JSON 格式和结构基本上正确,并且 WiFi 连接似乎正确,但最终没有数据到达云仪表板。
我认为我在设置 POST 语法时做了一些傻事。
我很感激一个新的视角来找到错误。
WIFI_SSID = "foo_ssid"
WIFI_PASSWORD = "secret_password"
API_TOKEN = "secret_ubidots_token"
update_period = 5 -- 秒
function format_json(variable1, value1, variable2, value2, variable3, value3)
-- 让我们允许嵌套 JSON 负载中的三个不同读数。
data = '{'..variable1..': {"value": '..value1..'},'
..variable2..': {"value": '..value2..'},'
..variable3..': {"value": '..value3..'}}'
return data
end
function postUbidots(deviceName, name1, value1, name2, value2, name3, value3)
connection_out = nil
connection_out = net.createConnection(net.TCP, 0)
connection_out:on("receive", function(connection_out, payload_out)
if (string.find(payload_out, "201 CREATED") ~= nil) then
print("POST OK");
end
end)
connection_out:on("connection", function(connection_out, payload_out)
data = format_json(name1, value1, name2, value2, name3, value3)
local post_string = "POST /api/v1.6/devices/"..deviceName.."/?token="
..API_TOKEN.." HTTP/1.1\n"
.."Host: things.ubidots.com\n"
.."Content-Type: application/json\n"
.."Content-Length: "..string.len(data).."\n"
..data.."\n"
connection_out:send(post_string)
end)
connection_out:on("disconnection", function(connection_out, payload_out)
connection_out:close();
collectgarbage();
end)
connection_out:connect(80, 'things.ubidots.com')
end
function readSensors()
-- 现在不用担心真正的传感器
-- 让我们编造一些虚拟变量。
sensor1_value = 90
sensor2_value = 65
sensor3_value = 30
postUbidots("deviceName", "sensor1", sensor1_value, "sensor2", sensor2_value, "sensor3", sensor3_value)
end
wifi.setmode(wifi.STATION)
wifi.setphymode(wifi.PHYMODE_G)
station_config={}
station_config.ssid=WIFI_SSID
station_config.pwd=WIFI_PASSWORD
station_config.auto=true
wifi.sta.config(station_config)
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip() == nil then
else
tmr.stop(1)
end
end)
print("WiFi connected.")
tmr.alarm(1, (update_period*1000), tmr.ALARM_AUTO, function() readSensors() end)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

问题在于如何格式化HTTP消息。尝试这样做:
local post_string = "POST /api/v1.6/devices/" .. deviceName .. "/?token=" .. API_TOKEN .. " HTTP/1.1\r\n" .. "Host: things.ubidots.com\r\n" .. "Content-Type: application/json\r\n" .. "Content-Length: " .. string.len(data) .. "\r\n\r\n" .. data ..参考文献:https://nodemcu.readthedocs.io/en/latest/en/modules/net/#netsocketsend
你知道我们有一个专门的HTTP模块,可以极大地简化事情吗? -> https://nodemcu.readthedocs.io/en/latest/en/modules/http/#httppost