mosquitto是一款實作了消息推送協定MQTT v3.1 的開源消息代理軟體,提供輕量級的,支援可釋出/可訂閱的的消息推送模式,使裝置對裝置之間的短消息通信變得簡單。 Mosquitto采用出版/訂閱的模式實作MQTT協定,這種設計模式将通信終端之間的關系統一到服務程式中進行管理,可極大減輕用戶端的開發和維護工作。
一.mosquitto安裝
# 下載下傳源代碼包
wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz
# 解壓
tar zxfv mosquitto-.tar.gz
# 進入目錄
cd mosquitto-
# 編譯
make
# 安裝
sudo make install
----------
//1.1 安裝可能遇見的錯誤
【】編譯找不到openssl/ssl.h
//安裝openssl
sudo apt-get install libssl-dev
【】編譯過程找不到ares.h
//修改config.mk檔案
修改config.mk中的WITH_SRV:=yes,改為WITH_SRV:=no
如果編輯config.mk檔案失敗,賦予權限
輸入指令:chmod -Rf *
【】使用過程中找不到libmosquitto.so
//修改libmosquitto.so位置, 建立連結
sudo ln -s /usr/local/lib/libmosquitto.so /usr/lib/libmosquitto.so
// 更新動态連結庫
sudo ldconfig
【】make: g++:指令未找到
// 安裝g++編譯器
sudo apt-get install g++
----------
//1.2 配置檔案
# =================================================================
# 用戶端心跳的間隔時間
#retry_interval 20
# 系統狀态的重新整理時間
#sys_interval 10
# 系統資源的回收時間,0表示盡快處理
#store_clean_interval 10
# 服務程序的PID
#pid_file /var/run/mosquitto.pid
# 服務程序的系統使用者
#user mosquitto
# 用戶端心跳消息的最大并發數
#max_inflight_messages 10
# 用戶端心跳消息緩存隊列
#max_queued_messages 100
# 用于設定用戶端長連接配接的過期時間,預設永不過期
#persistent_client_expiration
# =================================================================
# Default listener
# =================================================================
# 服務綁定的IP位址
#bind_address
# 服務綁定的端口号
#port 1883
# 允許的最大連接配接數,-1表示沒有限制
#max_connections -1
# cafile:CA憑證檔案
# capath:CA憑證目錄
# certfile:PEM證書檔案
# keyfile:PEM密鑰檔案
#cafile
#capath
#certfile
#keyfile
# 必須提供證書以保證資料安全性
#require_certificate false
# 若require_certificate值為true,use_identity_as_username也必須為true
#use_identity_as_username false
# 啟用PSK(Pre-shared-key)支援
#psk_hint
# SSL/TSL加密算法,可以使用“openssl ciphers”指令擷取
# as the output of that command.
#ciphers
# =================================================================
# Persistence
# =================================================================
# 消息自動儲存的間隔時間
#autosave_interval 1800
# 消息自動儲存功能的開關
#autosave_on_changes false
# 持久化功能的開關
persistence true
# 持久化DB檔案
#persistence_file mosquitto.db
# 持久化DB檔案目錄
#persistence_location /var/lib/mosquitto/
# =================================================================
# Logging
# =================================================================
# 4種日志模式:stdout、stderr、syslog、topic
# none 則表示不記日志,此配置可以提升些許性能
log_dest none
# 選擇日志的級别(可設定多項)
#log_type error
#log_type warning
#log_type notice
#log_type information
# 是否記錄用戶端連接配接資訊
#connection_messages true
# 是否記錄日志時間
#log_timestamp true
# =================================================================
# Security
# =================================================================
# 用戶端ID的字首限制,可用于保證安全性
#clientid_prefixes
# 允許匿名使用者
#allow_anonymous true
# 使用者/密碼檔案,預設格式:username:password
#password_file
# PSK格式密碼檔案,預設格式:identity:key
#psk_file
# pattern write sensor/%u/data
# ACL權限配置,常用文法如下:
# 使用者限制:user <username>
# 話題限制:topic [read|write] <topic>
# 正則限制:pattern write sensor/%u/data
#acl_file
# =================================================================
# Bridges
# =================================================================
# 允許服務之間使用“橋接”模式(可用于分布式部署)
#connection <name>
#address <host>[:<port>]
#topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]
# 設定橋接的用戶端ID
#clientid
# 橋接斷開時,是否清除遠端伺服器中的消息
#cleansession false
# 是否釋出橋接的狀态資訊
#notifications true
# 設定橋接模式下,消息将會釋出到的話題位址
# $SYS/broker/connection/<clientid>/state
#notification_topic
# 設定橋接的keepalive數值
#keepalive_interval 60
# 橋接模式,目前有三種:automatic、lazy、once
#start_type automatic
# 橋接模式automatic的逾時時間
#restart_timeout 30
# 橋接模式lazy的逾時時間
#idle_timeout 60
# 橋接用戶端的使用者名
#username
# 橋接用戶端的密碼
#password
# bridge_cafile:橋接用戶端的CA憑證檔案
# bridge_capath:橋接用戶端的CA憑證目錄
# bridge_certfile:橋接用戶端的PEM證書檔案
# bridge_keyfile:橋接用戶端的PEM密鑰檔案
#bridge_cafile
#bridge_capath
#bridge_certfile
#bridge_keyfile
二.mosquitto安裝完成後,啟動服務端 輸入指令:mosquitto
接着再開個終端當做用戶端訂閱消息,例子:進入mosquitto-
輸入指令:mosquitto_sub -t test -h
// mosquitto_sub 是訂閱消息,-t 是要訂閱的主題,-h 服務端的ip位址
然後要開個用戶端推送消息,安裝虛拟機,安裝ubuntu,例子:進入mosquitto-
輸入指令:mosquitto_pub -t test -m "123456" -h
// mosquitto_pub 是釋出消息,-t 是要釋出的主題,-h 服務端的ip位址
----------
----------
三.**mosquitto_pub參數說明:**
-d, // 開啟debug選項
-f, --file // 把一個檔案的内容做為消息的内容發送。經測試,支援txt檔案,不 支援doc等其他形式檔案。
-h, --host //說明所連接配接到的域名,預設是localhost
-i, --id //用戶端的ID号,如果沒有指定,預設是mosquitto_pub_加上用戶端的程序id,不能和--id_prefix同時使用。
-I, --id-prefix //指定用戶端ID的字首,與用戶端的程序ID連接配接組成用戶端的ID,不能喝--id同時使用。
-l, --stdin-line //從總段讀取輸入發送消息,一行為一條消息,空白行不會被發送。
-m, --message // 從指令行發送一條消息,-m後面跟發送的消息内容。
-n, --null-message //發送一條空消息。
-p, --port // 連接配接的端口号,預設是1883.
-P, --pw (大寫P) // 指定密碼用于代理認證,使用此選項時必須有有效的使用者名。
-q, --qos // 指定消息的服務品質,可以為0,1,2,預設是0.
--quiet // 如果指定該選項,則不會有任何錯誤被列印,當然,這排除了無效的使用者輸入所引起的錯誤消息。
-r, --retain // 如果指定該選項,該條消息将被保留做為最後一條收到的消息。下一個訂閱消息者将能至少收到該條消息。
-s, --stdin-file //從标準輸入接收傳輸的消息内容,所有輸入做為一條消息發送。
-t, --topic // 指定消息所釋出到哪個主題。
-u, --username // 指定使用者名用于代理認證。
--will-payload // 如果指定該選項,則萬一用戶端意外和代理伺服器斷開,則該消息将被保留在服務端并發送出去,該選項必須同時用--will
-topic // 指定主題。
--will-qos // 指定Will的服務品質,預設是0.必須和選項 --will-topic同時使用.
--will-retain // 如果指定該選項,則萬一用戶端意外斷開,已被發送的消息将被當做retained消息。必須和選項 --will-topic同時使用.
--will-topic // 指定用戶端意外斷開時,Will消息發送到的主題。
----------
----------
**mosquitto_pub參數說明(跟mosquitto_sub不同的)**
-c, --disable- // clean-session 禁止'clean session'選項,即如果用戶端斷開連接配接,這個訂閱仍然保留來接收随後到的QoS為1和2的消息,當改用戶端重新連接配接之後,它将接收到已排在隊列中的消息。建議使用此選項時,用戶端id選項設為--id
-k, --keepalive // 給代理發送PING指令(目的在于告知代理該用戶端連接配接保持且在正常工作)的間隔時間,預設是60s
-v, --verbose // 冗長地列印收到的消息。若指定該選項,列印消息時前面會列印主題名——“主題 消息内容”,否則,隻列印消息内容
----------
----------
四.mosquitto分析
【】程式檔案說明
mosquitto – 代理器主程式
mosquitto.conf – 配置檔案
mosquitto_passwd – 使用者密碼管理工具
mosquitto_tls – SSL和TLS
mosquitto_pub – 用于釋出消息的指令行用戶端
mosquitto_sub – 用于訂閱消息的指令行用戶端
mqtt – MQTT的背景程序
libmosquitto – 用戶端編譯的庫檔案
【】使用訂閱樹釋出消息
在Mosquito程式中,消息發送過程主要通過周遊訂閱樹來完成,具體為:遞歸周遊訂閱樹找到指定的訂閱清單,并将消息挂到訂閱清單中的每個contextg的消息隊列中,如果消息的retain字段被設定為,則mosquitto還需要儲存此消息,以備新訂閱的用戶端可以立即收到上次發送的消息;另外,發往系統topic的消息也會被mosquitto儲存起來。上述消息發送過程主要通過函數mqtt3_db_messages_queue來完成。
【】從訂閱樹中删除訂閱用戶端
在Mosquitto程式中,用戶端可以向mosquitto伺服器發送取消對某個topic的訂閱請求,伺服器收到請求之後,将從訂閱樹中删除該用戶端,該過程需要周遊訂閱樹以找該topic在訂閱樹中的位置,進而獲得到訂閱該topic的訂閱清單,進而将其從訂閱樹中删掉。該過程與發送消息類似,首先将topic進行分片,然後根據topic片段周遊訂閱樹找到該topic的訂閱清單;然後周遊訂閱清單,将該用戶端從訂閱清單中删除。
【】訂閱樹機制的優缺點
Mosquito程式采用訂閱樹形式維護用戶端之間的訂閱與釋出消息,這種方式優點是邏輯清晰,便于開發和維護。缺點是其周遊過程效率較低。同時,程式中存在很多對訂閱樹的周遊過程:訂閱、釋出消息、取消訂閱等,在用戶端數量增加時,該功能對效率的影響将更為明顯。