NodeMCU实现订阅和发布主题。
1、要点扫盲
1.1 MQTT
《MQTT协议--MQTT协议简介及原理》
《MQTT协议--MQTT协议解析》
1.2 OneNET
《NodeMCU学习(十)--发送数据到OneNET物联网平台》
《NodeMCU学习(九)--连接OneNET物联网平台》
《OneNET物联网平台介绍》
OneNET物联网平台
《设备终端接入协议-MQTT》
2、主要API
2.1 WiFi
(1)wifi.setmode()
(2)wifi.sta.config()
(3)wifi.sta.connect()
关于API的使用方法,可以参考博客《NodeMCU学习(六)--WiFi》,也可以参考官网对API的说明。
2.2 MQTT
(1)mqtt.Client()
(2)mqtt.client:connect()
(3)mqtt.client:publish()
(5)mqtt.client:on()
(6) mqtt.client:subscribe()
3、OneNET平台接入流程
4、编写Lua脚本
4.1 源代码
cfg = {}
cfg.ssid = "OnePlus6"
cfg.pwd = "1234567890"
wifi.setmode(wifi.STATIONAP)
wifi.sta.config(cfg)
wifi.sta.connect()
DeviceID = "1234567890"
ProductID = "123456"
KeepAlive = 20
AuthoInfo = "123456"
host = "183.230.40.39"
port = 6002
myClient = mqtt.Client(DeviceID, KeepAlive, ProductID, AuthoInfo)
timer1 = tmr.create()
timer2 = tmr.create()
function ReConnect()
if wifi.sta.getip() == nil then
print("Connect AP,waitting...")
else
print("Connected AP ,success!")
print("IP is:"..wifi.sta.getip())
timer1:stop()
myClient:connect(host, port, function(client)
print("Connected OneNET success!")
end)
myClient:on("connect", function(clinet)
if(myClient:subscribe("pc_to_mcu_topic",0)) then
print("subscribe is success.")
end
end)
myClient:on("message", function(client , topic , message)
print("get a message.n")
print(topic..":"..message)
end)
timer2:alarm(1000, tmr.ALARM_AUTO, Update_Message)
end
end
timer1:alarm(1000,tmr.ALARM_AUTO,ReConnect)
currentSum = 0
voltageSum = 0
function Update_Message()
info = {}
info.curr = currentSum
info.volt = voltageSum
currentSum = currentSum + 1
voltageSum = voltageSum - 1
ok,message = pcall(sjson.encode, info)
print("message:"..message)
header = string.char(3, 0 ,string.len(message))..message
myClient:publish("$dp", header, 0, 0, function(client)
print("Publish info success!")
end)
myClient:publish("led1_topic", "led1", 0, 0, function(client)
--print("PUBLISH led SUCCESS!")
end)
end
4.2 代码解析
(1)myClient = mqtt.Client(DeviceID, KeepAlive, ProductID, AuthoInfo)
DeviceID = "1234567890"--根据自己的设备ID填写
ProductID = "123456"--根据自己的产品ID填写
KeepAlive = 20--保持连接的间隔时间,可根据实际需要填写
AuthoInfo = "123456"--设备对应的鉴权信息
(2)myClient:connect()
myClient:connect(host, port, function(client)
print("Connected OneNET success!")
end)
host:OneNET平台的MQTT协议对应的服务器IP
port:OneNET平台的MQTT协议对应的服务器开放的端口
function(client)():连接成功后的回调函数
(3)ok,message = pcall(sjson.encode, info)
1)pcall在保护模式(protected mode)下执行函数内容,同时捕获所有的异常和错误。若一切正常,pcall返回true以及“被执行函数”的返回值;否则返回nil和错误信息。
2)把info转换为json键值对;
(4)header = string.char(3, 0 ,string.len(message))..message
1)string.char()把数字或字符连接成字符串;
2)header为MQTT协议中的协议头,3表示MQTT数据包类型为PUBLISH
(5)myClient:publish()
myClient:publish("$dp", header, 0, 0, function(client)
print("Publish info success!")
end)
topic:
Payload:包含真正的数据点内容;
function(client)()为发送成功后的回调函数;
(6)mqtt.client:on(),监听事件
(7)mqtt.client:subscribe(),订阅主题
5、调试
5.1 准备工作
(1)需要在平台上创建两个设备;
(2)两个NodeMCU模块,或者用两个MQTT调试软件代替也可以(本人使用一个NodeMCU模块,另一个客户端用调试软件代替);
(3)MQTT协议调试软件,“simulatedevice_v1.0.7.exe”,该软件可以在OneNET平台上获取;
5.2 试验目的
通过OneNET平台,实现两个不同网络的客户端进行数据交互。
5.3 订阅主题
NodeMCU订阅主题,MQTT调试软件发布主题。
5.4 发布主题
设计资源 培训 开发板 精华推荐
- LT1302 2 节电池至 5V/600mA 升压型 DC/DC 转换器的典型应用电路
- 用于有线网络的 400W、400V DC 到 DC 单路输出电源
- 具有欠压锁定功能的 LT3990IMSE-3.3 5V 降压转换器的典型应用
- AM2M-1205SH30-NZ 5 Vout、2W 单路输出 DC-DC 转换器的典型应用
- flowshutter-FC-size
- LT1764EFE-1.8 并联 LDO 稳压器以实现更高输出电流的典型应用
- DER-847 - 具有色温控制功能的 50 W 2 级升压和隔离反激式三合一可调光 LED 镇流器
- BP5220A降压DC/DC转换器输出电压升高的典型应用电路
- AM6TW-4803DH35Z ±3.3V 6 瓦双路输出 DC/DC 转换器的典型应用
- 使用 Analog Devices 的 AD9743BCPZ 的参考设计