?終于要講一講MQTT應(yīng)用!
本文應(yīng)各位大佬邀請(qǐng),詳細(xì)講解Air780EP模組MQTT應(yīng)用的多個(gè)AT命令。
Air780EP是低功耗4G模組之一,支持全系列的AT指令以及LuatOS腳本二次開(kāi)發(fā)。
一、準(zhǔn)備工作
1.1 硬件準(zhǔn)備
1.2 軟件準(zhǔn)備
進(jìn)入AT固件頁(yè)面按下Ctrl+F,搜索AirM2M_780EP_LTE_AT,即可找到Air780EP模塊所使用的AT固件。
本文示例為:
AirM2M_780EP_V1007_LTE_AT版本固件
推薦選用:相關(guān)型號(hào)固件名稱后面數(shù)字版本號(hào)最高的最新relase版本進(jìn)行調(diào)試。
二、MQTT應(yīng)用流程
合宙低功耗4G模塊支持MQTT和MQTT SSl協(xié)議,MQTT應(yīng)用的基本流程如下:
- 如果要支持SSL,配置SSL參數(shù)
- 通過(guò)TCP連接到MQTT服務(wù)器
- 發(fā)送MQTT CONNECT到服務(wù)器,打開(kāi)會(huì)話連接
- 訂閱或者發(fā)布消息
三、MQTT發(fā)布消息
先來(lái)看個(gè)正常情況下的AT命令序列,如果不理解AT命令含義,請(qǐng)自行參考AT手冊(cè)。
AT+CPIN?
+CPIN: READY //查詢sim卡是否正常
OK
AT+CGATT?
+CGATT: 1
//查詢是否附著上數(shù)據(jù)網(wǎng)絡(luò),如果返回+CGATT: 0表示未附著上
OK
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OKAT+MSUB="mqtt/sub_topic",0
OK
SUBACK
AT+MPUB="mqtt/pub_topic",0,0,"publish 0 payload"
OK
AT+MPUB="mqtt/pub_topic",1,0,"publish 1 payload"
OK
PUBACK
AT+MPUB="mqtt/pub_topic",2,0,"publish 2 payload"
OK
PUBREC
PUBCOMP
發(fā)布消息示例演示效果:
?
?
相關(guān)注意事項(xiàng):
01. 發(fā)送MIPSTART命令
收到OK僅僅表示4G模塊開(kāi)始處理這條命令,并不表示TCP已經(jīng)連接成功;只有收到CONNECT OK才是成功的應(yīng)答(其余錯(cuò)誤應(yīng)答,參考AT手冊(cè))。
02. 發(fā)送MCONNECT命令
收到OK僅僅表示4G模塊開(kāi)始處理這條命令,并不表示MQTT已經(jīng)連接成功;只有收到CONNACK OK才是成功的應(yīng)答(其余錯(cuò)誤應(yīng)答,參考AT手冊(cè))。
03. 發(fā)送MSUB命令
收到OK僅僅表示4G模塊開(kāi)始處理這條命令,并不表示MQTT已經(jīng)訂閱成功;只有收到SUBACK才是成功的應(yīng)答(其余錯(cuò)誤應(yīng)答,參考AT手冊(cè))。
04. 發(fā)送MPUB命令
如果QOS不是0,則收到OK僅僅表示4G模塊開(kāi)始處理這條命令,并不表示MQTT已經(jīng)發(fā)布成功;只有收到PUBACK(QOS為1時(shí))或者PUBCOMP(QOS為2時(shí))才是成功的應(yīng)答(其余錯(cuò)誤應(yīng)答,參考AT手冊(cè))。
四、MQTT接收消息
先來(lái)看下接收到訂閱消息時(shí)的AT命令處理序列,如果不理解AT命令含義,請(qǐng)自行參考AT手冊(cè)。
AT指令手冊(cè)下載鏈接:
https://doc.openluat.com/article/4985
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
AT+MSUB="mqtt/sub_topic",0
OK
SUBACK
AT+MPUB="mqtt/sub_topic",0,0,"123456"
//在mqtt/sub_topic上收到訂閱消息,payload為123456
//默認(rèn)是直接輸出收到的訂閱消息,不做緩存
+MSUB: "mqtt/sub_topic",6 byte,123456
//設(shè)置訂閱消息的處理模式,設(shè)置為緩存模式
//接下來(lái)收到訂閱消息時(shí),會(huì)提示訂閱消息的緩存位置
AT+MQTTMSGSET=1
OK
//在mqtt/sub_topic上收到一條訂閱消息,緩存到位置0
+MSUB: 0
//主動(dòng)讀取緩存的所有訂閱消息
AT+MQTTMSGGET
+MSUB:mqtt/sub_topic,6 byte,123456
OK
//在mqtt/sub_topic上收到一條訂閱消息,緩存到位置0
+MSUB: 0
//在mqtt/sub_topic上收到一條訂閱消息,緩存到位置1
+MSUB: 1
//主動(dòng)讀取緩存的所有訂閱消息
AT+MQTTMSGGET
+MSUB:mqtt/sub_topic,6 byte,123456
+MSUB:mqtt/sub_topic,6 byte,123456
OK
接收消息演示效果:
?
?
五、MQTT TCP被動(dòng)斷開(kāi)
先來(lái)看下連接被動(dòng)斷開(kāi)時(shí)的AT命令處理序列,如果不理解AT命令含義,請(qǐng)自行參考AT手冊(cè):
AT指令手冊(cè)下載鏈接:
https://doc.openluat.com/article/4985
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
CLOSED //此處TCP連接被動(dòng)斷開(kāi)
AT+MIPCLOSE
+CME ERROR: 767
//此處無(wú)論返回OK、ERROR還是CMEERROR,都直接跳過(guò),不用做正確性判斷
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
六、MQTT PDP被動(dòng)去激活
先來(lái)看下PDP被動(dòng)去激活時(shí)的AT命令處理序列,如果不理解AT命令含義,請(qǐng)自行參考AT手冊(cè)。
AT指令手冊(cè)下載鏈接:
https://doc.openluat.com/article/4985
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
+CGEV: NW PDN DEACT 1
//此處PDP被動(dòng)去激活
AT+MIPCLOSE
OK
//此處無(wú)論返回OK、ERROR還是CME ERROR,都直接跳過(guò),不用做正確性判斷
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
七、SSL帶證書(shū)驗(yàn)證流程【單向認(rèn)證】
先來(lái)看下SSL帶證書(shū)驗(yàn)證(單向認(rèn)證)時(shí)的AT命令處理序列,如果不理解AT命令含義,請(qǐng)自行參考AT手冊(cè)。
AT指令手冊(cè)下載鏈接:
https://doc.openluat.com/article/4985
AT+CGATT?
+CGATT: 1
OK
AT+FSCREATE="ca.crt"http://創(chuàng)建CA證書(shū)文件
OK
AT+FSWRITE="ca.crt",0,1212,15
//1212是證書(shū)文件長(zhǎng)度,15為超時(shí)時(shí)間,這里是舉例說(shuō)明,請(qǐng)?zhí)钊雽?shí)際數(shù)據(jù),不要照抄 >
//此處填寫(xiě)證書(shū)數(shù)據(jù)
OK
AT+SSLCFG="cacert",88,"ca.crt"
//設(shè)置CA證書(shū)文件為ca.crt
OK
AT+SSLCFG="seclevel",88,1
//1表示設(shè)置認(rèn)證模式為只對(duì)服務(wù)器認(rèn)證
OK
AT+MCONFIG="868488076506128","user","password"
//這三個(gè)參數(shù)可以不加雙引號(hào),第一個(gè)參數(shù)需要開(kāi)發(fā)者自己設(shè)置
//后兩個(gè)參數(shù)可以不填,格式為:
AT+MCONFIG="868488076506128","",""
OK
AT+SSLMIPSTART="airtest.openluat.com",8883
//開(kāi)發(fā)者請(qǐng)修改為自己的服務(wù)器地址和端口
OK
CONNECT OK
AT+MCONNECT=1,60
//在MIPSTART返回CONNECT OK后才能發(fā)MCONNECT命令
//而且要立即發(fā),否則會(huì)被服務(wù)器踢掉
OK
CONNACK OK
--后面發(fā)布和接收與前面一樣,直接參考
八、SSL帶證書(shū)驗(yàn)證流程【雙向認(rèn)證】
先來(lái)看下SSL帶證書(shū)驗(yàn)證(雙向認(rèn)證)時(shí)的AT命令處理序列,如果不理解AT命令含義,請(qǐng)自行參考AT手冊(cè)。
AT指令手冊(cè)下載鏈接:
https://doc.openluat.com/article/4985
AT+CGATT?
+CGATT: 1
OK
AT+FSCREATE="ca.crt" //創(chuàng)建CA證書(shū)文件
OK
AT+FSWRITE="ca.crt",0,1212,15
//1212是證書(shū)文件長(zhǎng)度,15為超時(shí)時(shí)間,這里是舉例說(shuō)明,請(qǐng)?zhí)钊雽?shí)際數(shù)據(jù),不要照抄 >
//此處填寫(xiě)證書(shū)數(shù)據(jù)
OK
AT+FSCREATE="client.crt"
//創(chuàng)建客戶端證書(shū)文件
OK
AT+FSWRITE="client.crt",0,1127,15 >
//此處填寫(xiě)證書(shū)數(shù)據(jù)
OK
AT+FSCREATE="client.key"
//創(chuàng)建客戶端key文件
OK
AT+FSWRITE="client.key",0,1679,15 >
//此處填寫(xiě)證書(shū)數(shù)據(jù)
OK
AT+SSLCFG="cacert",88,"ca.crt"
//設(shè)置CA證書(shū)文件為ca.crt
OK
AT+SSLCFG="clientcert",88,"client.crt"
//設(shè)置客戶端證書(shū)文件為client.crt
OK
AT+SSLCFG="clientkey",88,"client.key"
//設(shè)置客戶端密鑰文件為client.key
OK
AT+SSLCFG="seclevel",88,2
//設(shè)置認(rèn)證模式為雙向認(rèn)證
OK
AT+MCONFIG="868488076506128","user","password"
//這三個(gè)參數(shù)可以不加雙引號(hào),第一個(gè)參數(shù)需要開(kāi)發(fā)者自己設(shè)置
//后兩個(gè)參數(shù)可以不填,格式為:
AT+MCONFIG="868488076506128","",""
OK
AT+SSLMIPSTART="airtest.openluat.com",8883
//開(kāi)發(fā)者請(qǐng)修改為自己的服務(wù)器地址和端口
OK
CONNECT OK
AT+MCONNECT=1,60
//在MIPSTART返回CONNECT OK后才能發(fā)MCONNECT命令
//而且要立即發(fā),否則會(huì)被服務(wù)器踢掉
OK
CONNACK OK
--后面發(fā)布和接收與前面一樣,直接參考
九、常見(jiàn)問(wèn)題Q&A
以下針對(duì)客戶朋友們實(shí)際應(yīng)用中的反饋,整理了MQTT應(yīng)用中的常見(jiàn)問(wèn)題:
01. MQTT支持多連接嗎?
目前MQTT僅支持單連接,不支持多連接。
02. MQTT的遺囑如何使用?
通過(guò)AT+MCONFIG命令可以設(shè)置遺囑的qos、retain標(biāo)志、topic、payload。
在如下(包含但不僅限于)情況下,服務(wù)器會(huì)主動(dòng)發(fā)布遺囑消息到訂閱的客戶端:
- 模塊和服務(wù)器通信異常(例如:模塊突然關(guān)機(jī)、模塊進(jìn)入了一個(gè)沒(méi)有網(wǎng)絡(luò)信號(hào)的環(huán)境等)超過(guò)1.5倍(一般是1.5倍,但不排除服務(wù)器可以修改這個(gè)時(shí)間)的keep alive時(shí)間(可以通過(guò)AT+MCONNECT設(shè)置keep alive時(shí)間);
- 模塊主動(dòng)執(zhí)行AT+MDISCONNECT,或者AT+MIPCLOSE。
曾經(jīng)有用戶碰到過(guò)如下問(wèn)題:
模塊設(shè)置了遺囑topic為/will_topic,遺囑payload為offline,keep alive時(shí)間為5分鐘,模塊關(guān)機(jī)后,等待2分鐘。
在等待的2分鐘內(nèi),其他訂閱了/will_topic的客戶端沒(méi)有收到遺囑消息(這是正常的,因?yàn)檫€沒(méi)有到達(dá)1.5倍的keep alive時(shí)間)。
2分鐘后,模塊開(kāi)機(jī)MQTT重連成功后,其他客戶端卻收到了遺囑消息。這是什么原因呢?
這部分機(jī)制是服務(wù)器端設(shè)計(jì)的,和模塊無(wú)關(guān)。個(gè)人認(rèn)為:服務(wù)器端仍然在維持2分鐘前的那個(gè)MQTT連接,現(xiàn)在模塊開(kāi)機(jī),用同樣的client id重連后,會(huì)斷開(kāi)之前維護(hù)的相同client id的MQTT連接。斷開(kāi)時(shí),就發(fā)布了一次遺囑消息。
那這種問(wèn)題,如何解決呢?
模塊可以在AT+MCONNECT返回CONNACK OK之后,通過(guò)AT+MPUB一個(gè)topic為/will_topic,payload為online的消息,這樣訂閱了遺囑topic的其他客戶端,就會(huì)收到這個(gè)online消息。
03. 重試多次PDP,MQTT應(yīng)用一直連接失???
如果重試多次PDP激活,PDP一直激活失敗,或者M(jìn)QTT一直連接失敗,則嘗試使用如下手段恢復(fù):
- 使用RESET引腳復(fù)位模塊;
- 極端情況下,直接給模塊斷電,再上電,POWER KEY引腳拉低開(kāi)機(jī)。
04. MPUB命令中,payload包含"如何發(fā)送?
- 消息中內(nèi)嵌的雙引號(hào)請(qǐng)用22表達(dá);
- 控制字符 r(0x0D)請(qǐng)用?D表達(dá);
- 控制字符n(0x0A)請(qǐng)用?A表達(dá);
- 如果是MCU發(fā)消息,請(qǐng)用22,?D,?A來(lái)表達(dá),即需要轉(zhuǎn)義成。
05. 連接服務(wù)器失敗
- 檢查模塊信號(hào)、網(wǎng)絡(luò)注冊(cè)、網(wǎng)絡(luò)附著、PDP激活狀態(tài);
- 檢查SIM卡是否欠費(fèi);
- 使用mqtt.fx,連接服務(wù)器確認(rèn)是否可以連接成功,排除服務(wù)器故障;
- 部分國(guó)外的開(kāi)源項(xiàng)目提供免費(fèi)的MQTT代理服務(wù)器,因?yàn)榫W(wǎng)絡(luò)的原因,國(guó)內(nèi)存在嚴(yán)重的延遲或者丟包現(xiàn)象,導(dǎo)致程序運(yùn)行出現(xiàn)問(wèn)題,此現(xiàn)象在AT開(kāi)發(fā)時(shí)影響嚴(yán)重;
- 確認(rèn)是不是域名解析失敗導(dǎo)致,可以通過(guò)AT+CDNSGIP=確認(rèn)域名是否能正常解析(注意:該命令只有在執(zhí)行完at+cstt、at+ciicr、at+cifsr后才能正常工作)。
如不能正常解析,可以通過(guò)AT+CDNSCFG=ip1,ip2設(shè)置域名解析服務(wù)器。 - 在MIPSTART /SSLMIPSTART返回CONNECT OK后,才能發(fā)MCONNECT命令,而且要立即發(fā),否則會(huì)被服務(wù)器踢掉。
06. 數(shù)據(jù)接收緩存問(wèn)題
不緩存:
通過(guò)AT+MQTTMSGSET=0設(shè)置;收到訂閱的publish報(bào)文后,立即通過(guò)AT口輸出主題、payload長(zhǎng)度、payload內(nèi)容,每個(gè)報(bào)文中支持的payload內(nèi)容最長(zhǎng)4100字節(jié)。
內(nèi)存緩存:
通過(guò)AT+MQTTMSGSET=1設(shè)置;內(nèi)存中有一個(gè)緩存表,一條消息最多4kb,最多支持緩存4條publish報(bào)文;收到訂閱的publish報(bào)文后,插入緩沖表中的空閑位置,然后通過(guò)AT口輸出存儲(chǔ)位置;緩存表滿之后,新收到的publish報(bào)文會(huì)覆蓋最舊的publish報(bào)文。
注意事項(xiàng):
緩存表位于內(nèi)存中,斷電或者重啟后,緩存表中的數(shù)據(jù)會(huì)被清空;建議收到數(shù)據(jù)時(shí),通過(guò)AT+MQTTMSGGET及時(shí)讀取出來(lái),以防緩沖區(qū)滿覆蓋丟失數(shù)據(jù)。
07. 數(shù)據(jù)發(fā)送問(wèn)題
AT+MPUB最大publish 4100字節(jié),AT+MPUBEX長(zhǎng)度取值范圍1-4100。
?
-
嵌入式
+關(guān)注
關(guān)注
5056文章
18964瀏覽量
301702 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2900文章
44006瀏覽量
369898 -
模組
+關(guān)注
關(guān)注
6文章
1406瀏覽量
30207 -
MQTT
+關(guān)注
關(guān)注
5文章
646瀏覽量
22389
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論