標(biāo)題: MQTT學(xué)習(xí)筆記—MQTT協(xié)議體驗(yàn) Mosquitto安裝和使用 [打印本頁]

作者: 51hei小林    時(shí)間: 2016-9-25 11:06
標(biāo)題: MQTT學(xué)習(xí)筆記—MQTT協(xié)議體驗(yàn) Mosquitto安裝和使用
0 前言

    MQTT是IBM開發(fā)的一個(gè)即時(shí)通訊協(xié)議。MQTT是面向M2M和物聯(lián)網(wǎng)的連接協(xié)議,采用輕量級(jí)發(fā)布和訂閱消息傳輸機(jī)制。Mosquitto是一款實(shí)現(xiàn)了 MQTT v3.1 協(xié)議的開源消息代理軟件,提供輕量級(jí)的,支持發(fā)布/訂閱的的消息推送模式,使設(shè)備對設(shè)備之間的短消息通信簡單易用。
    若初次接觸MQTT協(xié)議,可先理解以下概念:
【MQTT協(xié)議特點(diǎn)】——相比于RESTful架構(gòu)的物聯(lián)網(wǎng)系統(tǒng),MQTT協(xié)議借助消息推送功能,可以更好地實(shí)現(xiàn)遠(yuǎn)程控制。
【MQTT協(xié)議角色】——在RESTful架構(gòu)的物聯(lián)網(wǎng)系統(tǒng),包含兩個(gè)角色客戶端和服務(wù)器端,而在MQTT協(xié)議中包括發(fā)布者,代理器(服務(wù)器)和訂閱者。
【MQTT協(xié)議消息】——MQTT中的消息可理解為發(fā)布者和訂閱者交換的內(nèi)容(負(fù)載),這些消息包含具體的內(nèi)容,可以被訂閱者使用。
【MQTT協(xié)議主題】——MQTT中的主題可理解為相同類型或相似類型的消息集合。

1 安裝和使用注意點(diǎn)
1.1 安裝



    截止2015年12月,最新版本為mosquitto-1.4.5

# 下載源代碼包



wget http://mosquitto.org/files/source/mosquitto-1.4.5.tar.gz# 解壓
tar zxfv mosquitto-1.4.5.tar.gz
# 進(jìn)入目錄
cd mosquitto-1.4.5

# 編譯

make
# 安裝
sudo make install





1.2 安裝注意點(diǎn)



【1】編譯找不到openssl/ssl.h
    【解決方法】——安裝opensslsudo apt-get install libssl-dev



【2】編譯過程找不到ares.h
sudo apt-get install libc-ares-dev
【3】編譯過程找不到uuid/uuid.h
sudo apt-get install uuid-dev
【4】使用過程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory


    【解決方法】——修改libmosquitto.so位置

# 創(chuàng)建鏈接
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
# 更新動(dòng)態(tài)鏈接庫
sudo ldconfig
【5】make: g++:命令未找到  
    【解決方法】
    安裝g++編譯器
sudo apt-get install g++



2 簡單測試
    一個(gè)完整的MQTT示例包括一個(gè)代理器,一個(gè)發(fā)布者和一個(gè)訂閱者。測試分為以下幾個(gè)步驟:
【1】啟動(dòng)服務(wù)mosquitto。
【2】訂閱者通過mosquitto_sub訂閱指定主題的消息。
【3】發(fā)布者通過mosquitto_pub發(fā)布指定主題的消息。
【4】代理服務(wù)器把該主題的消息推送到訂閱者。

【測試說明】
    測試環(huán)境:ubuntu 14.04 虛擬機(jī)
    在本例中,發(fā)布者、代理和訂閱者均為localhsot,但是在實(shí)際的情況下三種并不是同一個(gè)設(shè)備,在mosquitto中可通過-h(--host)設(shè)置主機(jī)名稱(hostname)。為了實(shí)現(xiàn)這個(gè)簡單的測試案例,需要在linux中打開三個(gè)控制臺(tái),分別代表代理服務(wù)器、發(fā)布者和訂閱者。



圖1 示例

2.1 啟動(dòng)代理服務(wù)

mosquitto -v
    【-v】打印更多的調(diào)試信息

2.2 訂閱主題
mosquitto_sub -v -t sensor

    【-t】指定主題,此處為sensor

    【-v】打印更多的調(diào)試信息

2.3 發(fā)布內(nèi)容
mosquitto_pub -t sensor  -m 12

    【-t】指定主題
    【-m】指定消息內(nèi)容


2.4 運(yùn)行結(jié)果
    當(dāng)發(fā)布者推送消息之后,訂閱者獲得以下內(nèi)容
sensor 12
    而代理服務(wù)器控制臺(tái)中會(huì)出現(xiàn)——連接、消息發(fā)布和心跳等調(diào)試信息。通過代理服務(wù)器的調(diào)試輸出可以對MQTT協(xié)議的相關(guān)過程有所了解。


圖2 代理服務(wù)器調(diào)試輸出


3 總結(jié)
    通過Mosquitto實(shí)現(xiàn)MQTT協(xié)議代理器(服務(wù)器),為今后的MQTT協(xié)議應(yīng)用做準(zhǔn)備。本文并沒有分析MQTT協(xié)議的種種細(xì)節(jié),但是希望通過一個(gè)簡單的例子把MQTT協(xié)議“使用起來”,通過使用過程來理解MQTT協(xié)議,在過程中關(guān)注細(xì)節(jié)收集疑問,再閱讀MQTT協(xié)議具體內(nèi)容,這樣學(xué)習(xí)起來就不至于枯燥乏味(即使MQTT協(xié)議只有40多頁,但是初次閱讀我還是沒能理解其內(nèi)涵,只能怪自己智商太低,學(xué)術(shù)不精。)



4 參考資料
【1】Mosquitto簡要教程(安裝/使用/測試)
【2】解決編譯過程中找不到ares.h的問題
【3】解決使用過程中找不到libmosquitto.so.1的問題

==============================================================


MQTT - MQ Telemetry Transport


消息體




MessageType



CONNECT
TCP連接建立完畢后,Client向Server發(fā)出一個(gè)Request。
如果一段時(shí)間內(nèi)接收不到Server的Response,則關(guān)閉socket,重新建立一個(gè)session連接。
如果一個(gè)ClientID已經(jīng)與服務(wù)器連接,則持有同樣ClientID的舊有連接必須由服務(wù)器關(guān)閉后,新建立才能建立。

CONNACK
Server發(fā)出Response響應(yīng)。
0x00 Connection Accepted
0x01 Connection Refused: unacceptable protocol version
0x02 Connection Refused: identifier rejected
0x03 Connection Refused: server unavailable
0x04 Connection Refused: bad user name or password
0x05 Connection Refused: not authorized


PUBLISH 發(fā)布消息
Client/Servier均可以進(jìn)行PUBLISH。
publish message 應(yīng)該包含一個(gè)TopicName(Subject/Channel),即訂閱關(guān)鍵詞。

關(guān)于Topic通配符
/:用來表示層次,比如a/b,a/b/c。
#:表示匹配>=0個(gè)層次,比如a/#就匹配a/,a/b,a/b/c。
單獨(dú)的一個(gè)#表示匹配所有。
不允許 a#和a/#/c。
+:表示匹配一個(gè)層次,例如a/+匹配a/b,a/c,不匹配a/b/c。
單獨(dú)的一個(gè)+是允許的,a+不允許,a/+/b不允許

PUBACK 發(fā)布消息后的確認(rèn)
QoS=1時(shí),Server向Client發(fā)布該確認(rèn)(Client收到確認(rèn)后刪除),訂閱者向Server發(fā)布確認(rèn)。

PUBREC / PUBREL / PUBCOMP
QoS=2時(shí)
1. Server->Client發(fā)布PUBREC(已收到);
2. Client->Server發(fā)布PUBREL(已釋放);
3. Server->Client發(fā)布PUBCOMP(已完成),Client刪除msg;
訂閱者也會(huì)向Server發(fā)布類似過程確認(rèn)。

PINGREQ / PINGRES 心跳
Client有責(zé)任發(fā)送KeepAliveTime時(shí)長告訴給Server。在一個(gè)時(shí)長內(nèi),發(fā)送PINGREQ,Server發(fā)送PINGRES確認(rèn)。
Server在1.5個(gè)時(shí)長內(nèi)未收到PINGREQ,就斷開連接。
Client在1個(gè)時(shí)長內(nèi)未收到PINGRES,斷開連接。
一般來說,時(shí)長設(shè)置為幾個(gè)分鐘。最大18hours,0表示一直未斷開。


QoS



QoS=0:最多一次,有可能重復(fù)或丟失。

QoS=1:至少一次,有可能重復(fù)。
Client[Qos=1,DUP=0/*重復(fù)次數(shù)*/,MessageId=x] --->PUBLISH--> Server收到后,存儲(chǔ)Message,發(fā)布,刪除,向Client回發(fā)PUBACK
Client收到PUBACK后,刪除Message;如果未收到PUBACK,設(shè)置DUP++,重新發(fā)送,Server端重新發(fā)布,所以有可能重復(fù)發(fā)送消息。

QoS=2:只有一次,確保消息只到達(dá)一次(用于比較嚴(yán)格的計(jì)費(fèi)系統(tǒng))。


Clean Session
如果為false(flag=0),Client斷開連接后,Server應(yīng)該保存Client的訂閱信息。
如果為true(flag=1),表示Server應(yīng)該立刻丟棄任何會(huì)話狀態(tài)信息。



Refshttp://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html


================================================================
http://baike.baidu.com/link?url=dDQ_3ey8tTgxKq8bDT55aNTvU8D102xr9HE27JH0HU7l81TiYmFIxV_CQwP-kV6yhBaYp_peebv57cdTKYg-u_








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1