近接觸MQTT協議,MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議)協議是一種基于發布/訂閱(publish/subscribe)模式的“輕量級”通訊協議,該協議構建于TCP/IP協議上,由IBM在1999年發布。MQTT大優點在于,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。做為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
MQTT的特色
MQTT是一個基于客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易于實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。
MQTT協議當前版本為,2014年發布的MQTT v3.1.1。除標準版外,還有一個簡化版MQTT-SN,該協議主要針對嵌入式設備,這些設備一般工作于百TCP/IP網絡,如:ZigBee。
MQTT協議運行在TCP/IP或其他網絡協議,提供有序、無損、雙向連接。其特點包括:
1. 使用的發布/訂閱消息模式,它提供了一對多消息分發,以實現與應用程序的解耦。
2. 對負載內容屏蔽的消息傳輸機制。
3. 對傳輸消息有三種服務質量(QoS):
4. 數據傳輸和協議交換的小化(協議頭部只有2字節),以減少網絡流量
5. 通知機制,異常中斷時通知傳輸雙方
服務質量
接下來我們來了解一下MQTT的服務質量,為了滿足不同的場景,MQTT支持三種不同級別的服務質量(Quality of Service,QoS)為不同場景提供消息可靠性:
o 多一次,這一級別會發生消息丟失或重復,消息發布依賴于底層TCP/IP網絡。即:<=1
o 至多一次,這一級別會確保消息到達,但消息可能會重復。即:>=1
o 只有一次,確保消息只有一次到達。即:=1。在一些要求比較嚴格的計費系統中,可以使用此級別
MQTT實現原理
MQTT可以理解主要由兩端構成網絡,一端是服務器端,另一端就是客戶端。
而客戶端又分兩個角色,一個是訂閱者、另一個是發布者,服務器則是代理,流程如下:
訂閱者首先在代理那訂閱主題,發布者發布該主題內容時,訂閱者才會收到,否則不會接收任何信息。
MQTT本身的消息也分為令部分:主題(Topic)和負載(payload)。
o Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload)
o payload,可以理解為消息的內容,是指訂閱者具體要使用的內容
MQTT代理搭建(Linux下搭建)
我們在上面了解了一下MQTT,具體的協議可以去官網//mqtt.org查看,而這些知識只是協議的介紹,下面我們來了解一下如何搭建MQTT網絡,mosquitto是MQTT的開源代理,遵循的是MQTT v3.1.1協議。下面我們搭建代理。
2 # 下載源代碼包
wget //mosquitto.org/files/source/mosquitto-1.4.12.tar.gz
shell Code
2 # 解壓
tar zxfv mosquitto-1.3.4.tar.gz
shell Code
2 # 進入目錄
cd mosquitto-1.3.4
shell Code
2 # 編譯
make
shell Code
2 # 安裝
sudo make install
遇到下屬問題的解決辦法:
idea Code
【1】編譯找不到openssl/ssl.h
【解決方法】——安裝openssl
sudo apt-get install libssl-dev
【2】編譯過程找不到ares.h
【解決方法】——修改config.mk中的WITH_SRV:=yes,改為WITH_SRV:=no
【3】使用過程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1:
cannot open shared object file: No such file or directory
【解決方法】——修改libmosquitto.so位置
# 創建鏈接
sudo ln -s /usr/local/lib/libmosquitto.so.1/usr/lib/libmosquitto.so.1
# 更新動態鏈接庫
sudo ldconfig
【4】make: g++:命令未找到
【解決方法】
安裝g++編譯器
sudo apt-get install g++
MQTT代理的搭建(windows下搭建)
Mosquitto有兩個模式,一個是win32,一個是cygwin,下面是下載地址:
mosquitto-1.0.3-install-win32.exe(743 kB) (Native build, Windows Vista and up)
mosquitto-1.0.3-install-cygwin.exe(2,026kB)(Cygwin build, Windows XP and up)
安裝win2版本
win32直接下載到本地,安裝即可。
如果缺少libeay.dll 、 pthreadVC2.dll、ssleay.dll等庫文件,需要下載到本地同級目錄再進行安裝。
安裝cygwin版本
而安裝cywin是需要下載cygwin,下面是下載地址
mosquitto-1.0.3-install-cygwin.exe
Mosquitto依賴的lib有binutils、gcc4-core、gcc4-gcc、libwrap-devel、libwrap0、make、mercurial、wget。
后安裝mosquitto-cygwin軟件,可以在任務管理器中啟動mosquitto服務。
MQTT設置用戶密碼(windows和Linux相同,這里以;Linux為例)
在 /etc/mosquitto/mosquitto.conf 文件中需配置是否允許匿名用戶、用戶存儲的用戶名密碼的文件路徑、用戶訪問主題權限的文件路徑,配置文如下:
NormalText Code
allow_anonymous false # 不允許匿名
password_file /etc/mosquitto/passwd # 配置用戶密碼文件
acl_file /etc/mosquitto/acl #配置topic和用戶 (此文件是配置用戶訪問某主題,
如果不配置則使用password_file文件中的用戶密碼進行訪問)
添加用戶
NormalText Code
#mosquitto_passwd -c /etc/mosquitto/passwd pub_client
#mosquitto_passwd /etc/mosquitto/passwd sub_client
第一個命令,參數多一個-c,是創建/etc/mosquito/passwd文件,將用戶名和密碼寫到文件中,用戶名是明文,密碼是加密過的密文。
第二個命令,是在已有的用戶上添加新的用戶。
配置好后,代理會屏蔽匿名用戶。
為用戶添加可操作主題
NormalText Code
user pub_client
topic write mtopic/#
user sub_client
topic read mtopic/#
在給定mosquitto.conf中給定acl文件的路徑中 打開文件,user后面添加已有用戶名,topic 后面添加 可讀或者可寫的主題,read 是可讀,write是可寫。
华清图书馆
0元电子书,限时免费申领10本华清图书PDF版
扫码关注华清远见公众号