【2G模组Air202开发】Lua脚本编程实现MQTT协议连接Tlink平台(三)
【2G模組Air202開發(fā)】Lua腳本編程實(shí)現(xiàn)MQTT協(xié)議連接Tlink平臺(tái)(三)
?
整體思路:
因?yàn)槠^長(zhǎng),我這里分成5篇來詳細(xì)記錄。
【2G模組Air202開發(fā)】Lua腳本編程實(shí)現(xiàn)MQTT協(xié)議連接Tlink平臺(tái)(一)
【2G模組Air202開發(fā)】Lua腳本編程實(shí)現(xiàn)MQTT協(xié)議連接Tlink平臺(tái)(二)
【2G模組Air202開發(fā)】Lua腳本編程實(shí)現(xiàn)MQTT協(xié)議連接Tlink平臺(tái)(三)
【2G模組Air202開發(fā)】Lua腳本編程實(shí)現(xiàn)MQTT協(xié)議連接Tlink平臺(tái)(四)
【2G模組Air202開發(fā)】Lua腳本編程實(shí)現(xiàn)MQTT協(xié)議連接Tlink平臺(tái)(五)
?
?
對(duì)Air202模組MQTT的Lua程序編寫,同樣的先貼上第一部分的代碼
--- 模塊功能:MQTT客戶端處理框架 -- @author openLuat -- @module mqtt.mqttTask -- @license MIT -- @copyright openLuat -- @release 2018.03.28module(...,package.seeall)require"misc" require"mqtt" require"mqttOutMsg" require"mqttInMsg"--local ready = false local mqttip,mqttport,mqttuser,mqttpassword,mqttheartbeat = "mq.tlink.io","1883","MQTT","MQTTPW",60socket.setSendMode(1)--啟動(dòng)MQTT客戶端任務(wù) sys.taskInit(function()local retryConnectCnt = 0while true doif not socket.isReady() thenretryConnectCnt = 0--等待網(wǎng)絡(luò)環(huán)境準(zhǔn)備就緒,超時(shí)時(shí)間是5分鐘sys.waitUntil("IP_READY_IND",300000)end--是否獲取到分配的IP(是否連上網(wǎng))if socket.isReady() thenlocal imei = misc.getImei()--創(chuàng)建一個(gè)MQTT客戶端local mqttClient = mqtt.client(imei,mqttheartbeat,mqttuser,mqttpassword)--阻塞執(zhí)行MQTT CONNECT動(dòng)作,直至成功--如果使用ssl連接,打開mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根據(jù)自己的需求配置--mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})if mqttClient:connect(mqttip,mqttport,"tcp") then--連接成功log.info("mqttTask.mqttClient","Connet ok!","imei = " .. imei) retryConnectCnt = 0 --失敗次數(shù)清零--ready = true--訂閱主題if mqttClient:subscribe({["xxx".."/+"]=0}) then --xxx代表的是序列號(hào)mqttOutMsg.insertMsg("xxx","Iccid = " .. sim.getIccid(),0)--這個(gè)沒啥用--循環(huán)處理接收和發(fā)送的數(shù)據(jù)while true doif not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break endif not mqttOutMsg.proc(mqttClient) then log.error("mqttTask.mqttOutMsg proc error") break endendend--ready = falseelselog.info("mqttTask.mqttClient","Connet fail!") retryConnectCnt = retryConnectCnt+1 --失敗次數(shù)加一end--斷開MQTT連接mqttClient:disconnect()if retryConnectCnt>=5 then link.shut() retryConnectCnt=0 endsys.wait(5000)else--進(jìn)入飛行模式,20秒之后,退出飛行模式net.switchFly(true)sys.wait(20000)net.switchFly(false)endendend )?
貼上部分api:
這個(gè)部分就是mqtt任務(wù)的核心了,也是最難理解的地方,下面硬著頭皮來記錄下心得:
mqtt連接都是異步運(yùn)行的,何時(shí)應(yīng)該發(fā)送數(shù)據(jù),何時(shí)應(yīng)該接收數(shù)據(jù),這些邏輯應(yīng)該讓mqtt收發(fā)的進(jìn)程自己進(jìn)行控制。一般來說,我們會(huì)在模塊成功獲取基站分配的ip后,才會(huì)進(jìn)行網(wǎng)絡(luò)的連接操作,所以我們需要使用socket.isReady()函數(shù)來判斷是否連接網(wǎng)絡(luò),然后再進(jìn)行網(wǎng)絡(luò)操作,在成功獲取ip后,我們才能新建一個(gè)mqtt對(duì)象,對(duì)其進(jìn)行聯(lián)網(wǎng)操作。為了增加代碼的穩(wěn)健性,我們可以利用sys.waitUntil()函數(shù),設(shè)置五分鐘內(nèi)沒有獲取到ip就開啟飛行模式幾秒,再關(guān)閉,讓模塊重新去獲取GPRS連接。同樣,我們也可以給mqttClient:connect(mqttip,mqttport,"tcp")的連接加上錯(cuò)誤次數(shù)的判斷,連接錯(cuò)誤超過五次,強(qiáng)制斷開socket連接,等待五秒后重試。這些都理解之后那就是mqtt的收發(fā)數(shù)據(jù)了,這里是直接寫在一個(gè)死循環(huán)里面的。
要注意的是:
在接收和發(fā)送函數(shù)不返回false的情況下,接收和發(fā)送循環(huán)會(huì)一直進(jìn)行下去;只有當(dāng)兩個(gè)函數(shù)之一返回false時(shí),才會(huì)觸發(fā)break導(dǎo)致退出該接收和發(fā)送循環(huán)。所以接收和發(fā)送函數(shù)里面還要加上一定的機(jī)制才能使得mqtt任務(wù)的健全。
好了,此篇就只記錄這個(gè)mqtt主任務(wù),接收和發(fā)送函數(shù)留在下一篇。
?
這是次篇幅記錄網(wǎng)絡(luò)MQTT的主任務(wù)部分,MQTT的收發(fā)消息實(shí)現(xiàn)請(qǐng)移步接下來的篇幅。
By Urien 2019年6月29日 09:05:04
總結(jié)
以上是生活随笔為你收集整理的【2G模组Air202开发】Lua脚本编程实现MQTT协议连接Tlink平台(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EMC现场测试-EFT、ESD、Surg
- 下一篇: 三维重构 c++_超越三维:在电路网络中