Luat实例教程:mqtt协议

本示例实现的功能是:mqtt连接,发布消息,掉线处理。

1.在编辑工具建立一个test.lua的文件(不一定叫这个名字,用户可以自己随便取名)

2.设置本文件被全体可见。也就意味着,一旦test被某一文件加载,则test在任何文件中均可被看见,即test中全局变量和函数均可被任何文件调用。

module(...,package.seeall)

3.test文件头需要 require "xxx " 模块。加载后,就可以调用xxx.lua库文件中的全局变量和函数了。

require"misc"
require"mqtt"
require"common"

4.定义print函数,调试用

local function print(...)
    _G.print("test",...)
end

5.编写消息注册函数

local function imeirdy()
--创建一个mqtt client,默认使用的MQTT协议版本是3.1,如果要使用3.1.1,打开下面的注释--[[,"3.1.1"]]即可
--PROT,ADDR,PORT分别对应协议类型,服务器地址,端口。详情函数说明查阅mqtt api
mqttclient = mqtt.create(PROT,ADDR,PORT--[[,"3.1.1"]])
--配置遗嘱参数,如果有需要,打开下面一行代码,并且根据自己的需求调整will参数
--mqttclient:configwill(1,0,0,"/willtopic","will payload")
--配置clean session标志,如果有需要,打开下面一行代码,并且根据自己的需求配置cleansession;如果不配置,默认为1
--mqttclient:setcleansession(0)
--查询client状态测试
--sys.timer_loop_start(statustest,1000)
connect()
end

--如果读取到IMEI_READY消息,则调用imeirdy函数
local procer =
{
    IMEI_READY = imeirdy,
}
--注册消息的处理函数
sys.regapp(procer)

6.编写连接函数

function connect()
  --连接mqtt服务器
  --mqtt lib中,如果socket一直重连失败,默认会自动重启软件
  --注意sckerrcb参数,如果打开了注释掉的sckerrcb,则mqtt lib中socket一直重连失败时,不会自动重启软件,而是调用sckerrcb函数
  --对应的参数可以对应自己mqtt账户改变,详情函数说明查阅mqtt api
  mqttclient:connect(misc.getimei(),600,"user","password",connectedcb,connecterrcb--[[,sckerrcb]])
end

7.连接成功回调函数

local function connectedcb()
  print("connectedcb")
  --订阅主题
  mqttclient:subscribe({{topic="/event0",qos=0}, {topic="/中文event1",qos=1}}, subackcb, "subscribetest")
  --注册事件的回调函数,MESSAGE事件表示收到了PUBLISH消息
  mqttclient:regevtcb({MESSAGE=rcvmessagecb})
  --发布一条qos为0的消息
  pubqos0test()
  --发布一条qos为1的消息
  pubqos1test()
  --20秒后主动断开MQTT连接
  --sys.timer_start(disconnect,20000)
end

8.在编辑工具中建立一个名为main.lua的文件。lua脚本的执行从main.lua开始,main.lua是入口文件(注意:main.lua只能有一个)。在main.lua中把test加载进去就好了。sys.init()是对系统初始化,sys.run()是系统主程序。这两句必须有。


--重要提醒:必须在这个位置定义MODULE_TYPE、PROJECT和VERSION变量 --MODULE_TYPE:模块型号,目前仅支持Air201、Air202、Air800 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 MODULE_TYPE = "Air202" PROJECT = "MQTT" VERSION = "1.0.0" require"sys" require"test" if MODULE_TYPE=="Air201" then require"wdt" end sys.init(0,0) sys.run()

!!!attention

一个工程只有一个main.lua

发表评论

电子邮件地址不会被公开。 必填项已用*标注