MQTT是一個(gè)基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議,該協(xié)議構(gòu)建于 TCP/IP協(xié)議上,由IBM在1999年發(fā)布。MQTT最大優(yōu)點(diǎn)在于可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實(shí)時(shí)可靠的消息服務(wù)。作為一種低開銷、低帶寬占用的即時(shí)通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動(dòng)應(yīng)用等方面有較廣泛的應(yīng)用。
本文旨在幫助使用LierdaNT35模組進(jìn)行開發(fā)的用戶,讓其能快速使用模組本身的各種硬件資源,文章概述了MQTT的特性、以及使用LierdaNT35模組連接MQTT服務(wù)器和阿里云平臺(tái)的具體流程。
1.MQTT協(xié)議的通信模型
MQTT的通信是通過(guò)發(fā)布/訂閱的方式來(lái)實(shí)現(xiàn)的,訂閱和發(fā)布又是基于主題(Topic)的。發(fā)布方和訂閱方通過(guò)這種方式來(lái)進(jìn)行解耦,它們沒(méi)有直接地連接,它們需要一個(gè)中間方。在MQTT里面我們稱之為Broker,用來(lái)進(jìn)行消息的存儲(chǔ)和轉(zhuǎn)發(fā)。一次典型的MQTT消息通信流程如下所示。

發(fā)布方(Publisher)連接到Broker;訂閱方(Subscriber)連接到Broker,并訂閱主題Topic1;發(fā)布方(Publisher)發(fā)送給Broker一條消息,主題為Topic1;Broker收到了發(fā)布方的消息,發(fā)現(xiàn)訂閱方(Subscriber)訂閱了Topic1,然后將消息轉(zhuǎn)發(fā)給訂閱方(Subscriber);訂閱方從Broker接收該消息。其中Publisher和Subscriber是相對(duì)于Topic來(lái)說(shuō)的身份,如果一個(gè)Client向某個(gè)Topic發(fā)布消息,那么這個(gè)Client就是Publisher;如果一個(gè)Client訂閱了某個(gè)Topic,那么它就是Subscriber。
2.MQTT協(xié)議通信測(cè)試
本次測(cè)試通過(guò)MQTT.fx工具測(cè)試數(shù)據(jù)是否收發(fā)成功。進(jìn)入工具的設(shè)置界面,Client ID需要修改,不能使用默認(rèn)的,不能使用重復(fù)的,否則會(huì)導(dǎo)致MQTT連接失敗。服務(wù)器的地址和端口需要設(shè)置正確,我們?cè)O(shè)置服務(wù)器地址為test.mosquitto.org,這是一個(gè)公用MQTT測(cè)試服務(wù)器,端口為1883,若使用該服務(wù)器,則端口號(hào)不能做修改,否則會(huì)連接失敗。


在Subscribe設(shè)置中訂閱主題,訂閱的主題設(shè)置為/lierda/NT35_topic。

接下來(lái)是NT35模組對(duì)該主題進(jìn)行訂閱,訂閱完成后即可測(cè)試通信效果。
1、定義并激活PDP上下文:AT+CGDCONT=1,"IP","CMNET";AT+CGACT=1,1。
2、查看獲取的IP地址:AT+CGPADDR。

3、連接MQTT服務(wù)器:AT+MQTTCONN="test.mosquitto.org",1883,"lierda1234",90,0。
AT+MQTTCONN=<host>,<port>,<clientid>,<keepalive>,<cleansession>,[username],[password]
<host>為MQTT服務(wù)器的host name,在這里是MQTT.fx設(shè)置中的MQTT Broker Address。
<port>為MQTT服務(wù)器的端口號(hào),在這里是MQTT.fx設(shè)置中的Broker Port。
<clientid>為客戶id,不可重復(fù)。
<keepalive>為MQTT連接存在時(shí)長(zhǎng),范圍為30-1800,時(shí)間單位為秒。
<cleansession>輸入為0。
4、訂閱主題:AT+MQTTSUBUNSUB="/lierda/NT35_topic",1,1。
AT+MQTTSUBUNSUB=<topic>,<sub flag>,<qos>
<topic>為準(zhǔn)備訂閱的主題,在這里是MQTT.fx中訂閱的主題。
<sub flag>1為訂閱,0為取消訂閱。
<qos>為服務(wù)質(zhì)量,輸入可為0或者1或者2;當(dāng)取消訂閱,即<sub flag>為0時(shí),該參數(shù)不用填寫。

5、發(fā)布消息:AT+MQTTPUB="/lierda/NT35_topic","hellolierda",1,0,0。
AT+MQTTPUB=<topic>,<message>,<qos>,<duplicate>,<retain>
<topic>為發(fā)布消息的MQTT目標(biāo)主題,在這里是之前訂閱的主題。
<message>為發(fā)布的消息的內(nèi)容。消息內(nèi)容的長(zhǎng)度,主題的長(zhǎng)度與其他包數(shù)據(jù)的長(zhǎng)度(不超過(guò)9字節(jié))之和最大為256字節(jié)。
<qos>輸入值為0或者1或者2。
<duplicate>輸入值為0或者1。
<retain>輸入值為0或者1。





6、取消訂閱:AT+MQTTSUBUNSUB="/lierda/NT35_topic",0。
7、斷開連接:AT+MQTTDISCONN。
3.MQTT連接阿里云IoT平臺(tái)
1、登錄阿里云物聯(lián)網(wǎng)平臺(tái) http://iot.aliyun.com,完成注冊(cè)和實(shí)名認(rèn)證后,平臺(tái)會(huì)自動(dòng)生成一個(gè)公共實(shí)例,本次測(cè)試于該公共實(shí)例中進(jìn)行。

2、點(diǎn)擊設(shè)備管理--產(chǎn)品--創(chuàng)建產(chǎn)品,進(jìn)入新建產(chǎn)品界面。

3、在新建產(chǎn)品界面中,節(jié)點(diǎn)類型選擇為直連設(shè)備,連網(wǎng)方式選擇為蜂窩(2G/3G/4G/5G),數(shù)據(jù)格式選擇為透?jìng)?自定義,數(shù)據(jù)校驗(yàn)級(jí)別選擇為弱校驗(yàn),認(rèn)證方式選擇為設(shè)備密鑰,再點(diǎn)擊確認(rèn)按鍵,完成產(chǎn)品的創(chuàng)建。

4、點(diǎn)擊設(shè)備管理--設(shè)備--添加設(shè)備。

5、在"添加設(shè)備"界面中,選擇剛剛創(chuàng)建的產(chǎn)品,并輸入DeviceName,點(diǎn)擊確認(rèn)。

6、設(shè)備添加完成后,點(diǎn)擊查看進(jìn)入設(shè)備詳情界面。

7、在設(shè)備詳情界面中,點(diǎn)擊DeviceSecret后面的查看,即可查看ProductKey,DeviceName和DeviceSecret。


8、點(diǎn)擊設(shè)備管理--產(chǎn)品--查看,進(jìn)入產(chǎn)品詳情界面。

9、在產(chǎn)品詳情界面中,點(diǎn)擊Topic類列表--自定義Topic--定義Topic類,開始自定義Topic。

10、為方便測(cè)試,在自定義Topic時(shí),設(shè)備操作權(quán)限選擇為"發(fā)布和訂閱",Topic類名可自定義。

下圖為創(chuàng)建好的自定義Topic。

11、NT35模組上電,自動(dòng)附著PS,手動(dòng)定義和激活PDP上下文,需要發(fā)送并執(zhí)行的指令為AT+CGDCONT=1,”IP”,”CMNET”;AT+CGACT=1,1。
激活完成后通過(guò)指令"AT+CGPADDR",可查詢獲取到的IP地址。

12、非動(dòng)態(tài)鑒權(quán):AT+ALICAUTH=<mode>,<product key>,<device name>,<device secret>
<mode>設(shè)置為0時(shí)為非動(dòng)態(tài)鑒權(quán),設(shè)置為1時(shí)為動(dòng)態(tài)鑒權(quán)。
<product key>,<device name>和<device secret>參數(shù)見步驟7中的第二張圖,一一填入。
具體指令如下AT+ALICAUTH=0,"gt5xRLG8Qg1","NT35_TEST","7b47f6ecb55a63ef2b524243c817ba78"。
13、創(chuàng)建連接:AT+ALICCONN=60,1。

14、訂閱主題Topic:AT+ALICSUB=<topic>,<qos>。
<topic>為步驟10中自定義的Topic,/gt5xRLG8Qg1/${deviceName}/user/123,其中${deviceName}部分替換為當(dāng)前在線設(shè)備的DeviceName,在本次的測(cè)試中即為NT35_TEST。
具體指令為AT+ALICSUB="/gt5xRLG8Qg1/NT35_TEST/user/123",1。


15、發(fā)布消息:AT+ALICPUB=<topic>,<qos>,<message>[,<duplicate>][,<retain>]。
<topic>為已訂閱的主題,在本次測(cè)試中為/gt5xRLG8Qg1/NT35_TEST/user/123。
<qos>為服務(wù)質(zhì)量,可設(shè)置為0或者1或者2。
<message>為發(fā)布的消息的內(nèi)容。
具體指令為AT+ALICPUB="/gt5xRLG8Qg1/NT35_TEST/user/123",1,"hello"。


16、模組接收消息


17、取消訂閱:AT+ALICUNSUB="/gt5xRLG8Qg1/NT35_TEST/user/123"。
18、斷開連接:AT+ALICDISCONN。