如今咱們來快速體驗一下,使用MQTT進行數據的發佈和訂閱。html
考慮到Mosquitto比較適合初學者,因此選擇它來作實驗。實驗環境是Windows 10 64 bit,Mosquitto版本是1.5.8。git
打開命令行終端,輸入以下命令訂閱主題topic1。github
$ mosquitto_sub -d -t topic1
Client mosqsub|3508-SCNWCL0121 sending CONNECT
Client mosqsub|3508-SCNWCL0121 received CONNACK (0)
Client mosqsub|3508-SCNWCL0121 sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)
Client mosqsub|3508-SCNWCL0121 received SUBACK
Subscribed (mid: 1): 0
複製代碼
以上第一行是命令,使用mosquitto_sub命令訂閱主題。shell
-d 參數表示啓用debug模式,這樣mosquitto_sub會顯示詳細的鏈接以及數據收發過程。windows
-t topic1 表示須要訂閱主題topic1。bash
這裏有些參數沒寫,都使用了默認值,如host使用了localhost,port使用了1883,而且使用了"mosqsub|3508-SCNWCL0121"做爲Client ID,其中3508是進程Id,SCNWCL0121是個人機器名。服務器
若是要指定host,port以及Client Id,能夠這樣使用。學習
$ mosquitto_sub -d -h localhost -p 1883 -i subscriber-test -t topic1
Client subscriber-test sending CONNECT
Client subscriber-test received CONNACK (0)
Client subscriber-test sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)
Client subscriber-test received SUBACK
Subscribed (mid: 1): 0
複製代碼
-h 表示hostui
-p 表示portspa
-i 表示客戶端ID。
其實全部的命令行使用均可以使用--help進行查閱,輸入
$ mosquitto_sub --help
你就會看到它的詳細用法,全部參數都顯示出來了,很詳細。
第二行和第三行是創建鏈接的過程。
Client mosqsub|3508-SCNWCL0121 sending CONNECT
Client mosqsub|3508-SCNWCL0121 received CONNACK (0)
複製代碼
表示客戶端「mosqsub|3508-SCNWCL0121」發送CONNECT,同時Broker回覆CONNACK (0)。其中0是狀態碼,表示鏈接成功。若是是其它數字,則表示鏈接失敗。失敗的緣由有不少,好比不支持當前協議,服務器不可用等等,具體可參見Connect Return Code。
第四行到第六行是訂閱主題的過程,
Client mosqsub|3508-SCNWCL0121 sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)
Client mosqsub|3508-SCNWCL0121 received SUBACK
Subscribed (mid: 1): 0
複製代碼
sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0)表示發送訂閱請求,
Mid是Message Id,從1開始計算,當一個鏈接發送多條消息時,Mid是遞增的。
Topic:topic1表示要訂閱的主題時topic1。
QoS:0指定了QoS等級,默認是0。
打開一個新的命令行終端,輸入如下命令
$ mosquitto_pub -d -t topic1 -m "Hello MQTT"
Client mosqpub|12796-SCNWCL012 sending CONNECT
Client mosqpub|12796-SCNWCL012 received CONNACK (0)
Client mosqpub|12796-SCNWCL012 sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (10 bytes))
Client mosqpub|12796-SCNWCL012 sending DISCONNECT
複製代碼
第一行是發佈消息命令,將消息發佈到主題topic1,-m 指定了發送消息的內容是"Hello MQTT"。咱們一樣啓用了debug模式。
第二行和第三行是鏈接過程
第四行是發佈的消息信息。
Client mosqpub|12796-SCNWCL012 sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (10 bytes))
複製代碼
其中d0, q0, r0, m1,分別是發佈消息指定的參數,這裏使用默認參數。
d0表示DUP爲0,DUP是是否重複標記,若是是第一次發送消息,則設置爲0。若是是重複投遞,好比QoS設置爲1,客戶端發送消息超時後服務器尚未回覆,客戶端爲確保消息能發出去,因而再發一次,這是DUP就設置爲1,代表這個消息是重複發送的。
q0表示QoS爲0。
r0表示RETAIN爲0。RETAIN意思是是否要求Broker幫我保留這條消息,若是設置爲1,則服務器會保留當前消息。當下一次有新的客戶端鏈接並訂閱topic1時,服務器自動發送這條保留的消息給客戶端。
m1表示消息序號,默認從1開始。
topic1是發佈到這個主題。
... (10 bytes)沒有顯示消息內容,可是顯示了消息長度是10個字節。
最後一行是斷開鏈接。
Client mosqpub|12796-SCNWCL012 sending DISCONNECT
發佈完消息後,再回到以前訂閱的終端,會顯示接收到的消息。
Client mosqsub|11104-SCNWCL012 received PUBLISH (d0, q0, r0, m0, 'topic1', ... (10 bytes))
topic1 Hello MQTT
複製代碼
第一行顯示收到PUBLISH數據包,第二行打印出接收到的數據。
Mosquitto是很容易使用的MQTT實現,包含了服務端和客戶端。在這個實驗中,咱們其實就執行了兩條命令。
$ mosquitto_sub -d -t topic1
$ mosquitto_pub -d -t topic1 -m "Hello MQTT"
複製代碼
分別表示訂閱主題和發佈消息,當另外一個客戶端發送消息成功後,訂閱端會收到消息並打印出來。
在以上命令中,-d參數很是有用,是咱們學習MQTT協議的利器,這裏舉個列子。
QoS是服務質量保證,在發佈消息時,當QoS設置爲0,那麼客戶端發送消息後,Broker是不作回覆的。
QoS設置爲1時,客戶端發送消息後,會等待Broker確認,若是等不到PUBACK,那麼過一段時間後會從新發送。這樣確保Broker能收到消息。咱們來對比一下。
$ mosquitto_pub -d -t topic1 -m "Hello MQTT"
Client mosqpub|6188-SCNWCL0121 sending CONNECT
Client mosqpub|6188-SCNWCL0121 received CONNACK (0)
Client mosqpub|6188-SCNWCL0121 sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (10 bytes))
Client mosqpub|6188-SCNWCL0121 sending DISCONNECT
複製代碼
$ mosquitto_pub -d -q 1 -t topic1 -m "Hello MQTT"
Client mosqpub|14788-SCNWCL012 sending CONNECT
Client mosqpub|14788-SCNWCL012 received CONNACK (0)
Client mosqpub|14788-SCNWCL012 sending PUBLISH (d0, q1, r0, m1, 'topic1', ... (10 bytes))
Client mosqpub|14788-SCNWCL012 received PUBACK (Mid: 1)
Client mosqpub|14788-SCNWCL012 sending DISCONNECT
複製代碼
當咱們發送消息時,若是增長參數-q 1,表示QoS設置成1。數據包就會多出一個回覆。
Client mosqpub|14788-SCNWCL012 received PUBACK (Mid: 1)
QoS的實現機制比較複雜,後續我會專門寫一篇文章講MQTT QoS,有興趣的能夠本身點擊連接先去看看。