MQTT應用:Air780EP低功耗4G模組AT開發

电子老师傅發表於2024-10-16

終於要講一講MQTT應用!

本文應各位大佬邀請,詳細講解Air780EP模組MQTT應用的多個AT命令。

Air780EP是低功耗4G模組之一,支援全系列的AT指令以及LuatOS指令碼二次開發。

一、準備工作

圖片

MQTT應用:Air780EP低功耗4G模組AT開發

1.1 硬體準備

  • 合宙EVB_Air780EP開發板一套,包括天線、SIM卡;

  • USB線

  • PC電腦

1.2 軟體準備

  • 串列埠除錯工具
    如果沒有準備,推薦使用LLCOM:

  • AT韌體下載

進入AT韌體頁面按下Ctrl+F,搜尋AirM2M_780EP_LTE_AT,即可找到Air780EP模組所使用的AT韌體。

本文示例為:
AirM2M_780EP_V1007_LTE_AT版本韌體

推薦選用:相關型號韌體名稱後面數字版本號最高的最新relase版本進行除錯。

二、MQTT應用流程

合宙低功耗4G模組支援MQTT和MQTT SSl協議,MQTT應用的基本流程如下:

  1. 如果要支援SSL,配置SSL引數

  2. 透過TCP連線到MQTT伺服器

  3. 傳送MQTT CONNECT到伺服器,開啟會話連線

  4. 訂閱或者釋出訊息

三、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

釋出訊息示例演示效果:

圖片

MQTT應用:Air780EP低功耗4G模組AT開發

圖片

MQTT應用:Air780EP低功耗4G模組AT開發

相關注意事項:

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應用:Air780EP低功耗4G模組AT開發

圖片

MQTT應用:Air780EP低功耗4G模組AT開發

五、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"//建立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)請用\0D表達;

  • 控制字元\n(0x0A)請用\0A表達;

  • 如果是MCU發訊息,請用\\22,\\0D,\\0A來表達,即\需要轉義成\\。


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。

相關文章