| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- --- 模块功能:微消息队列_MQTT客户端处理框架
- -- @author openLuat
- -- @module mqtt.mqttTask
- -- @license MIT
- -- @copyright openLuat
- -- @release 2022.08.31
- module(...,package.seeall)
- require"misc"
- require"mqtt"
- require"MessagemqttOutMsg"
- require"MessagemqttInMsg"
- local ready = false
- ---------------注意ParentTopic Group_ID 的长度不易过长 ,阿里云限制最多64个字符---------------
- ParentTopic="XXX" --父级Topic 必须在微消息队列MQTT版控制台创建
- Group_ID="XXXXX" --共用组名 必须在微消息队列MQTT版控制台创建
- HOST="XXXXX"--微消息队列接入点
- INSTANCE_ID="XXXXXX" --实例ID 微消息队列MQTT版控制台可以看到
- AccessKey_ID="XXXXXXXX" ---阿里云访问凭证
- AccessKey_Secret="XXXXXXXXXXX"
- ---------------微消息队列参数设置---------------
- --- MQTT连接是否处于激活状态
- -- @return 激活状态返回true,非激活状态返回false
- -- @usage mqttTask.isReady()
- function isReady()
- return ready
- end
- function getSubscribeTopic()
- -- return PARENT_TOPIC.."/y506/"..nvm.get("deviceSn")
- return ParentTopic.."/ceshiwanglong" ----改为自己的topic
- --------p2p模式----------------------
-
- ---return ParentTopic.."/p2p/".."/Group_ID .. "@@@" ..misc.getSn()/" ----改为自己的topic
- ----发送P2P消息时,需将二级Topic设为“p2p”,将三级Topic设为目标接收者的Client ID。
- ----接收消息的客户端无需任何订阅处理,只需要完成客户端的初始化即可收到P2P消息。
- --------p2p模式----------------------
- end
- --启动MQTT客户端任务
- sys.taskInit(function()
- local retryConnectCnt = 0
- while true do
- if not socket.isReady() then
- retryConnectCnt = 0
- -- 等待网络环境准备就绪,超时时间是5分钟
- sys.waitUntil("IP_READY_IND", 300000)
- end
- if socket.isReady() then
- -- 创建一个MQTT客户端
- local clientID = Group_ID .. "@@@" ..misc.getSn()
- local userName = "Signature|" .. AccessKey_ID .. "|" .. INSTANCE_ID
- local password = string.fromHex(crypto.hmac_sha1(clientID, clientID:len(),AccessKey_Secret,AccessKey_Secret:len()))
- password = crypto.base64_encode(password, password:len())
- local mqttClient = mqtt.client(clientID,600,userName,password,nil)
- -- 阻塞执行MQTT CONNECT动作,直至成功
- -- 如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
- -- mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
- if mqttClient:connect(HOST, 1883, "tcp") then
- retryConnectCnt = 0
- ready = true
- -- 订阅主题
- if mqttClient:subscribe(getSubscribeTopic(),1) then
- MessagemqttOutMsg.init()
- -- 循环处理接收和发送的数据
- while true do
- if not MessagemqttInMsg.proc(mqttClient) then
- log.error("mqttTask.MessagemqttInMsg.proc error")
- break
- end
- if not MessagemqttOutMsg.proc(mqttClient) then
- log.error("mqttTask.MessagemqttOutMsg.proc error")
- break
- end
- end
- MessagemqttOutMsg.unInit()
- end
- ready = false
- else
- retryConnectCnt = retryConnectCnt + 1
- end
- -- 断开MQTT连接
- mqttClient:disconnect()
- if retryConnectCnt >= 5 then
- link.shut()
- retryConnectCnt = 0
- end
- sys.wait(5000)
- else
- -- 进入飞行模式,20秒之后,退出飞行模式
- net.switchFly(true)
- sys.wait(20000)
- net.switchFly(false)
- end
- end
- end)
|