序号 | 其它NodeMCU LUA开发文档 |
---|---|
① | NodeMCU/ESP8266 DHT11使用 |
② | NodeMCU/ESP8266 HTTP POST数据至中国移动OneNET |
③ | NodeMCU/ESP8266 MQTT接入中国移动OneNET |
④ | NodeMCU/ESP8266 远程升级(OTA) |
⑤ | 微信小程序获取中移OneNET数据 |
⑥ | NodeMCU/ESP8266 NodeMCU连接阿里云 |
全套视频教程:Lua保姆级开发教程
本章主要讲解NodeMCU通过MQTT协议接入OneNET
注意:【本讲解使用语言为:LUA】
一. 首先让我们来了解一下OneNET云平台
在一次偶然的机会中遇到了中国移动的OneNET云平台,在使用了段时间后发现OneNET做的真心不错,功能多,界面也简洁简单,操作起来很方便,特别是OneNET的技术支持也很给力!!那么回归正题,中国移动物联网开放平台是中移物联网有限公司基于物联网技术和产业特点打造的开放平台和生态环境,适配各种网络环境和协议类型,支持各类传感器和智能硬件的快速接入和大数据服务,提供丰富的API和应用模板以支持各类行业应用和智能硬件的开发,能够有效降低物联网应用开发和部署成本,满足物联网领域设备连接、协议适配、数据存储、数据安全、大数据分析等平台级服务需求。(介绍是复制的~~)
二. 注册用户
注册很简单,跟着提示走就好。
三. 添加产品
1.注册并登录完成后,点击“开发者中心”
2.点击“添加产品”
3.除了联网方式填Wi-Fi,其它参数可随便,完成后点击确定。(本此教程就不再创建新的了)
四. 添加设备
1.到这一步,产品就创建完成了,点击“添加设备”开始增加第一个设备。
2.这里提个建议,鉴权信息可以写点比较规范的,如当下时间等。
3.添加成功后如下图所示(这是我以前添加的)
五. 流程简单介绍
1.NodeMCU连上Wi-Fi;
2.通过dht11获取温湿度值;(具体如何获取dht11数值在其它章节讲过。)
3.通过MQTT协议上传数据;
六. 先让NodeMCU连网
这里就直接上代码了,不详细讲解(官网都有很详细的介绍)。
print("Set up wifi...") --打印提示信息
wifi.setmode(wifi.STATION) --设置Wi-Fi模式为station
cfg = {} --创建一个table
cfg.ssid = "lzs" --这里填写你要连接Wi-Fi的名称
cfg.pwd = "1033878279" --这里填写你要连接Wi-Fi的密码
wifi.sta.config(cfg) --配置Wi-Fi
wifi.sta.connect() --连接Wi-Fi
time1 = tmr.create() --创建一个计时器
function Reconnect() --自定义函数
if wifi.sta.getip() == nil then
print("Disconnect,Waiting For IP...")
else
time1:stop() --如果已连接Wi-Fi则停止time计时器
print("Connect Normal")
end
end
time1:alarm(1000, tmr.ALARM_AUTO, Reconnect) --1秒执行1次Reconnect()
七. 通过dht11获取温湿度值
具体如何获取dht11数值已在其它章节讲过。这里直接配合上个步骤列出代码,如下:
print("Set up wifi...") --打印提示信息
wifi.setmode(wifi.STATION) --设置Wi-Fi模式为station
cfg = {} --创建一个table
cfg.ssid = "lzs" --这里填写你要连接Wi-Fi的名称
cfg.pwd = "1033878279" --这里填写你要连接Wi-Fi的密码
wifi.sta.config(cfg) --配置Wi-Fi
wifi.sta.connect() --连接Wi-Fi
time1 = tmr.create() --创建一个计时器
time2 = tmr.create() --创建一个计时器
Temp_Humi_Pin = 5 --定义dht11引脚为D5
function Reconnect() --自定义函数
if wifi.sta.getip() == nil then
print("Disconnect,Waiting For IP...")
else
time1:stop() --如果已连接Wi-Fi则停止time计时器
print("Connect Normal")
time2:alarm(1500, tmr.ALARM_AUTO, Up_AC_Message) --1.5秒执行1次Up_AC_Message()
end
end
function Up_AC_Message()
status,temp,humi,temp_dec,humi_dec = dht.read11(Weather_Pin) --获取温湿度
weather = {} --创建一个table
weather.temperature = temp --在列表中新建一个名为temperature的变量,并将temp的值赋给temperature
weather.humidity = humi --在列表中新建一个名为humidity的变量,并将humi的值赋给temperature
end
time1:alarm(1000, tmr.ALARM_AUTO, Reconnect) --1秒执行1次Reconnect()
八. 将数据上传至OneNET(重点)
1.首先在这先复制点有关MQTT的基础知识给大家看看,详细的大家可以度娘:
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
2.在这里我们首先要知道刚刚在OneNET平台中创建产品和设备产生几个相关信息:
(1). 产品id
(2). 设备id
(3). 设备鉴权信息
3.那么还要知道OneNET服务器的地址和端口号
(1).ServerAddr: 183.230.40.39
(2).port: 6002
4.上传数据特别需要注意的就是上传的数据格式,相信很多朋友们上传时,连数据都还没开始发,设备就被踢下线了??这到底是为什么呢,如果有这样的情况,那很大几率可以怀疑是你的数据格式出问题了。那么我用OneNET的设备仿真软件模拟上传一次给大家看看到底是什么原因:
在此讲一下,底下红框中一堆十六进制数中的第一位0x03就代表的是数据类型3(详情见OneNET的协议文档说明);第二位0x00和第三位0x22则分别是要发送数据的高低位,而剩下的一堆则是要发送的数据了。所以如果出现设备被踢下线的话,那么就是前三位十六进制数搞的鬼了,如果要解决其实就是把前三位十六进制数和要发送的内容一起上传(若理解错误,欢迎直接留言指出)。
- 这里依旧配合上个步骤列出代码,如下:
print("Set up wifi...") --打印提示信息
wifi.setmode(wifi.STATION) --设置Wi-Fi模式为station
cfg = {} --创建一个table
cfg.ssid = "lzs" --这里填写你要连接Wi-Fi的名称
cfg.pwd = "1033878279" --这里填写你要连接Wi-Fi的密码
wifi.sta.config(cfg) --配置Wi-Fi
wifi.sta.connect() --连接Wi-Fi
time1 = tmr.create() --创建一个计时器
time2 = tmr.create() --创建一个计时器
Temp_Humi_Pin = 5 --定义dht11引脚为D5
UPbroker = "183.230.40.39" --ServerAddr
UPport = 6002 --port
function Reconnect() --自定义函数
if wifi.sta.getip() == nil then
print("Disconnect,Waiting For IP...")
else
time1:stop() --如果已连接Wi-Fi则停止time计时器
print("Connect Normal")
--创建MQTT客户端。
client_TempHumiLed = mqtt.Client("这里填写你的设备id",120,"这里填写你的产品id","这里填写你的设备鉴权信息",false)
client_TempHumiLed:connect(UPbroker,UPport,0,0,function(client) --连接到给定主机,端口和安全选项指定的代理。
print(" connect success!")
end)
time2:alarm(1500, tmr.ALARM_AUTO, Up_AC_Message)
end
end
function Up_AC_Message()
status,temp,humi,temp_dec,humi_dec = dht.read11(Temp_Humi_Pin) --获取温湿度
weather = {} --创建一个table
weather.temperature = temp --在列表中新建一个名为temperature的变量,并将temp的值赋给temperature
weather.humidity = humi --在列表中新建一个名为humidity的变量,并将humi的值赋给temperature
ok,weather_message = pcall(sjson.encode, weather) --将Lua表编码为JSON字符串
header = string.char(3, 0, string.len(weather_message))..weather_message --将前三位数据转为十六进制再连上要发送的数据一起赋值给header
client_TempHumiLed:publish("$dp",header,0,0,function(client) --将header作为内容发布给OneNET系统主题“$dp”
print("PUBLISH weather SUCCESS!")
end)
end
time1:alarm(1000, tmr.ALARM_AUTO, Reconnect) --1秒执行1次Reconnect()函数
如果大家对某些函数看不懂的话,建议戳这到官网瞧瞧。还需要注意的是,ESPlorer这个软件在编译的时候不支持中文,所以在编译前先把注释删了。
九. 效果展示
十. 总结
对于本此上传数据的操作,需要注意的就是所上传数据的数据格式,当时我在这卡了有段时间。如果大家在学习的过程中发现有任何表达上的错误都可以直接留言指出。
QQ交流群:612683349
若有侵权,请告知!