Ubuntu 16.04安裝測試MQTT Mosquitto

 

 

 

環境:Ubuntu 16.04web

介紹MQTT

MQTT是一種機器到機器的消息傳遞協議,旨在爲「物聯網」設備提供輕量級的發佈/訂閱通訊。它一般用於地理跟蹤車隊,家庭自動化,環境傳感器網絡和公用事業規模數據收集。安全

Mosquitto是一種流行的MQTT服務器(或MQTT中的代理),具備出色的社區支持,易於安裝和配置的特色。服務器

在本教程中,咱們將安裝Mosquitto並設置咱們的代理以使用SSL來保護受密碼保護的MQTT通訊。websocket


MQTT 是一個輕量級即時通訊協議,使用基於 TCP/IP 協議的發佈/訂閱消息轉發模式, MQTT 協議的中心是 broker( 服務器/代理),客戶端經過訂閱消息和發佈消息進行數據交互。
若初次接觸MQTT協議,可先理解如下概念:
【MQTT協議特色】——相比於RESTful架構的物聯網系統,MQTT協議藉助消息推送功能,能夠更好地實現遠程控制。
【MQTT協議角色】——在RESTful架構的物聯網系統,包含兩個角色客戶端和服務器端,而在MQTT協議中包括髮布者,代理器(服務器)和訂閱者。
【MQTT協議消息】——MQTT中的消息可理解爲發佈者和訂閱者交換的內容(負載),這些消息包含具體的內容,能夠被訂閱者使用。
【MQTT協議主題】——MQTT中的主題可理解爲相同類型或類似類型的消息集合。網絡

Mosquitto是一款實現了 MQTT v3.1 協議的開源消息代理軟件,包括了服務器端和客戶端,能夠跨平臺部署,提供輕量級的,支持發佈/訂閱的的消息推送模式,使設備對設備之間的短消息通訊簡單易用。架構

一.安裝測試mosquitto

2.1安裝mosquittosocket

1.引入mosquitto倉庫並更新測試

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update

2.執行如下命令安裝mosquittoui

sudo apt-get install mosquitto

3.查看mosquitto服務狀態加密

sudo service mosquitto status 

4.開啓/中止mosquitto服務

sudo service mosquitto start
sudo service mosquitto stop

2.2簡單的測試

一個完整的MQTT示例包括代理器,發佈者和訂閱者。
測試分爲如下幾個步驟:
(1)啓動服務mosquitto
(2)訂閱者經過mosquitto_sub訂閱指定主題的消息。
(3)發佈者經過mosquitto_pub發佈指定主題的消息。
(4)代理服務器把該主題的消息推送到訂閱者。

本機測試: 
代理器,發佈者和訂閱者都在本機。

1.安裝mosquitto客戶端

sudo apt-get install mosquitto-clients

2.打開一個終端,訂閱主題

mosquitto_sub -h localhost -t "mqtt" -v

【-h】指定要鏈接的MQTT服務器 
【-t】訂閱主題,此處爲mqtt 
【-v】打印更多的調試信息

3.打開另外一個終端,發佈主題

mosquitto_pub -h localhost -t "mqtt" -m "Hello2 MQTT"

【-h】指定要鏈接的MQTT服務器 
【-t】向指定主題推送消息 
【-m】指定消息內容

 

 

網絡測試 
test.mosquitto.org是一個公開可用的Mosquitto MQTT服務器/代理。 
1.經過如下命令從test.mosquitto.org訂閱全部主題,任何人發佈的任何消息你均可以收到,你會看到大量有趣消息滾動在你的屏幕上。

mosquitto_sub -h test.mosquitto.org -t "#" -v

2.也能夠經過如下命令訂閱特定主題,用來接收本身的消息

mosquitto_sub -h test.mosquitto.org -t "msg_only_from_me" -v

 

mosquitto_pub -h test.mosquitto.org -t "msg_only_from_me" -m "My cat is Luna"

 

 

二 、配置MQTT密碼

咱們配置Mosquitto使用密碼。Mosquitto包含一個實用程序來生成一個名爲mosquitto_passwd的特殊密碼文件。此命令將提示您輸入指定用戶名的密碼,並將結果放入/etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

如今咱們將爲Mosquitto打開一個新配置文件,並告訴它使用此密碼文件來要求全部鏈接的登陸:

sudo nano /etc/mosquitto/conf.d/default.conf

這應該打開一個空文件。粘貼以下:

allow_anonymous false
password_file /etc/mosquitto/passwd

請務必在文件末尾留下尾隨換行符。

allow_anonymous false將禁用全部未通過身份驗證的鏈接,該password_file行告訴Mosquitto在哪裏查找用戶和密碼信息。保存並退出該文件。

如今咱們須要重啓Mosquitto並測試咱們的更改。

sudo systemctl restart mosquitto

嘗試發佈沒有密碼的郵件:

mosquitto_pub -h localhost -t "test" -m "hello world"

該郵件應被拒絕:

Connection Refused: not authorised.
Error: The connection was refused.

在咱們再次嘗試使用密碼以前,請再次切換到第二個終端窗口,並使用用戶名和密碼訂閱「test」主題:

mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

  

mosquitto_sub -h localhost -t test -u "sammy" -P "password"

它應該鏈接並等待消息。您能夠將本終端打開並鏈接到本教程的其他部分,由於咱們會按期發送測試消息。

如今再次使用用戶名和密碼與您的其餘終端發佈消息:

3、 配置MQTT SSL

要啓用SSL加密,咱們須要告訴Mosquitto存儲Let的加密證書的位置。打開咱們以前啓動的配置文件:

sudo nano /etc/mosquitto/conf.d/default.conf

在文件末尾粘貼如下內容,留下咱們已經添加的兩行:

. . .
listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

一樣,請務必在文件末尾留下尾隨換行符。

咱們在配置中添加了兩個單獨的listener塊。

第一個,listener 1883 localhost更新端口上的默認MQTT監聽器1883,這是咱們到目前爲止所鏈接的。1883是標準的未加密MQTT端口。該localhost行的部分指示Mosquitto僅將此端口綁定到localhost接口,所以沒法從外部訪問它。不管如何,咱們的防火牆都會阻止外部請求,但明確是好的。

listener 8883在端口上設置加密偵聽器8883。這是MQTT + SSL的標準端口,一般稱爲MQTTS。

接下來的三行: certfilecafile,和keyfile,都指向Mosquitto到適合咱們加密文件創建的加密鏈接。

保存並退出該文件,而後從新啓動Mosquitto以更新設置:

sudo systemctl restart mosquitto

更新防火牆以容許鏈接到端口8883

sudo ufw allow 8883

輸出以下所示:

Rule added
Rule added (v6)

如今咱們再次使用mosquitto_pub測試一些不一樣的SSL選項:

mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"

請注意,咱們使用的是完整的主機名而不是localhost。由於咱們發出了mqtt.example.comSSL證書,若是咱們嘗試localhost安全鏈接,咱們會收到一個錯誤,說主機名與證書主機名不匹配(即便它們都指向同一個Mosquitto服務器)。

--capath /etc/ssl/certs/啓用SSL mosquitto_pub,並告訴它在哪裏查找root證書。這些一般由您的操做系統安裝,由於Mac OS,Windows等的路徑不一樣。mosquitto_pub使用root證書驗證Mosquitto服務器的證書是否由Let的加密證書頒發機構正確簽名。須要很注意的是mosquitto_pub並且它沒有這個選項不會嘗試(或相似的SSL鏈接--cafile選項),即便你鏈接的標準安全端口8883

若是測試結果一切正常,咱們會再次看到hello出如今另外一個mosquitto_sub終端。這意味着您的服務器已徹底設置好!若是您想擴展MQTT協議以使用websockets,您能夠按照最後一步操做。

 

 

參考連接:

https://cloud.tencent.com/developer/article/1350337

相關文章
相關標籤/搜索