天天看點

ubuntu下使用mosquitto與分析

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程式采用訂閱樹形式維護用戶端之間的訂閱與釋出消息,這種方式優點是邏輯清晰,便于開發和維護。缺點是其周遊過程效率較低。同時,程式中存在很多對訂閱樹的周遊過程:訂閱、釋出消息、取消訂閱等,在用戶端數量增加時,該功能對效率的影響将更為明顯。