-- LuaTools需要PROJECT和VERSION这两个信息 PROJECT = "mqttdemo" VERSION = "1.0.0" --[[ 本demo需要mqtt库, 大部分能联网的设备都具有这个库 mqtt也是内置库, 无需require ]] -- sys库是标配 _G.sys = require("sys") --[[特别注意, 使用mqtt库需要下列语句]] _G.sysplus = require("sysplus") -- local misc = require("misc") -- 获取IMEI -- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦 if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then pm.power(pm.PWK_MODE, false) end -- 自动低功耗, 轻休眠模式 -- Air780E支持uart唤醒和网络数据下发唤醒, 但需要断开USB,或者pm.power(pm.USB, false) 但这样也看不到日志了 -- pm.request(pm.LIGHT) --根据自己的服务器修改以下参数 -- local mqtt_host = "101.132.148.45" -- local mqtt_port = 1883 -- local mqtt_isssl = false -- local client_id = "1236" -- local user_name = mobile.imei(0) --861959064206365 -- local password = "" local mqtt_host = "lbsmqtt.airm2m.com" local mqtt_port = 1884 local mqtt_isssl = false local client_id = "abc" local user_name = "user" local password = "password" local pub_topic = "v1/devices/me/telemetry/dio" local sub_topic = "v1/devices/me/rpc/request/+" -- local topic2 = "/luatos/2" -- local topic3 = "/luatos/3" local mqttc = nil local mqttFlag = false local index = 0 -- 统一联网函数 -- sys.taskInit(function() -- sys.waitUntil("IP_READY") -- sys.publish("net_ready", mobile.imei()) -- end) local mqttTask = nil local function taskCb() end sys.taskInit(function() while true do sys.waitUntil("mqttReset") log.info("mqttReset ooooooooook") sysplus.taskDel("mqttTask") sys.wait(50) sysplus.taskInitEx(mqttTask, "mqttTask", taskCb) end end) mqttTask = function() local ret, device_id = sys.waitUntil("IP_READY") log.info("net is ok") -- 下面的是mqtt的参数均可自行修改 client_id = device_id -- pub_topic = "/luatos/pub/" .. device_id -- pub_topic = "v1/devices/me/telemetry".. device_id sub_topic = "v1/devices/me/rpc/request/+" -- 打印一下上报(pub)和下发(sub)的topic名称 -- 上报: 设备 ---> 服务器 -- 下发: 设备 <--- 服务器 -- 可使用mqtt.x等客户端进行调试 log.info("mqtt", "pub", pub_topic) log.info("mqtt", "sub", sub_topic) ------------------------------------- -------- MQTT 演示代码 -------------- ------------------------------------- mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file) mqttc:auth(client_id,user_name,password) mqttc:on(function(mqtt_client, event, data, payload) -- 用户自定义代码 log.info("mqtt", "event", event, mqtt_client, data, payload) if event == "conack" then -- 联上了 sys.publish("mqtt_conack") log.info("mqtt connect ack ok") mqtt_client:subscribe(sub_topic)--单主题订阅 elseif event == "recv" then log.info("mqtt", "downlink", "topic", data, "payload", payload) sys.publish("mqtt_payload", data, payload) elseif event == "sent" then log.info("mqtt", "sent", "pkgid", data) sys.publish("mqtt_sendok") elseif event == "disconnect" then sys.publish("mqtt_disconnect") end end) -- local mqttConnectFlag = false -- local mqttConnectIndex = 0 -- while not mqttConnectFlag do -- mqttConnectFlag = true -- mqttConnectFlag = mqttc:connect() -- mqttConnectIndex = mqttConnectIndex + 1 -- if mqttConnectIndex > 3 then -- sys.publish("mqttReset") -- break -- end -- sys.wait(100) -- end mqttc:connect() log.info("mqttFlag waiting conack") sys.waitUntil("mqtt_conack") log.info("mqtt conack ok") mqttFlag = true sys.publish("mqttRestartAgain") while true do -- 演示等待其他task发送过来的上报信息 local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 300000) if ret then -- 提供关闭本while循环的途径, 不需要可以注释掉 if topic == "close" then break end mqttc:publish(topic, data, qos) end -- 如果没有其他task上报, 可以写个空等待 --sys.wait(60000000) end end -- 这里演示在另一个task里上报数据, 会定时上报数据,不需要就注释掉 sys.taskInit(function() local data = "{\"temperature\":23.6}" local qos = 0 -- QOS0不带puback, QOS1是带puback的 while true do sys.wait(1000) if mqttFlag then log.info("mqttFlag is true") if mqttc and mqttc:ready() then local pkgid = mqttc:publish(pub_topic, index..data .. os.date(), qos) end end log.info("mqtt data for") end end) sys.taskInit(function() while true do if mqttFlag then index = index + 1 log.info("mqttFlag send ok") sys.waitUntil("mqtt_sendok") log.info("mqtt send ok [", index, "]") mqttc:disconnect() mqttFlag = false sys.waitUntil("mqtt_disconnect") sys.wait(500) mqttc:close() mqttc = nil sysplus.taskDel("mqttTask") mobile.flymode(0, true) --进入飞行模式 log.info("start cfun 0") sys.wait(9000) log.info("start cfun 1") sysplus.taskInitEx(mqttTask, "mqttTask", taskCb) sys.wait(500) mobile.flymode(0,false) --退出飞行模式 sys.waitUntil("mqttRestartAgain") log.info("mqtt IP_READY rady again") end log.info("mqtt task on") sys.wait(1000) end end) sysplus.taskInitEx(mqttTask, "mqttTask", taskCb) -- 用户代码已结束--------------------------------------------- -- 结尾总是这一句 sys.run() -- sys.run()之后后面不要加任何语句!!!!!