NodeMCU学习(十一)--MQTT的订阅与发布

发布者:CreativeMind最新更新时间:2022-07-14 来源: csdn关键字:MQTT 手机看文章 扫描二维码
随时随地手机看文章

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  发布主题


关键字:MQTT 引用地址:NodeMCU学习(十一)--MQTT的订阅与发布

上一篇:MCU--新塘N76E003--IIC
下一篇:NodeMCU学习(十)--发送数据到OneNET物联网平台

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved