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