mosquitto原始碼分析(一)
關於mqtt、mosquito的技術交流,可入群:221779856
本文由逍遙子撰寫,轉發請標註原址:
http://blog.csdn.net/houjixin/article/details/21461225
一、 Mosquitto簡介
mosquitto是一款實現了訊息推送協議MQTT v3.1 的開源訊息代理軟體,提供輕量級的,支援可釋出/可訂閱的的訊息推送模式,使裝置對裝置之間的短訊息通訊變得簡單,例如現在應用廣泛的低功耗感測器,手機、嵌入式計算機、微型控制器等移動裝置。
Mosquitto採用出版/訂閱的模式實現MQTT協議,這種設計模式將通訊終端之間的關係統一到服務程式中進行管理,可極大減輕客戶端的開發和維護工作。
1.1、 mqtt協議簡介
MQTT(MessageQueuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。在某些應用場合中,可通過該協議維持與客戶端的長連線。關於mqtt協議更詳細的介紹,請參考其官方網站:http://mqtt.org/
其他版本原始碼下載位置:http://mosquitto.org/files/source/
1.2、 出版/訂閱模式簡介
出版/訂閱模式定義瞭如何向一個節點發布和訂閱訊息,這些節點被稱作主題(topic)。主題可以被認為是訊息的傳輸中介,釋出者(publisher)釋出訊息到主題,訂閱者(subscriber) 從主題訂閱訊息。這種模式使得訊息訂閱者和訊息釋出者保持互相獨立,不需要接觸即可保證訊息的傳送。
Tcp協議中,tcp連線只提供一對一的可靠傳輸,例如:主機A與B進行通訊,則發起tcp連線的一端只需要知道對方的ip地址和埠號即可,如下圖1-1所示:
圖1-1 一對一通訊
每一個tcp連線都是由下面的五個元素確定:
<源ip地址,源埠號,目的ip地址,目的埠號,通訊協議>
在實際程式的開發過程中 一條連線建立之後,它可能需要在一段時間內一直被通訊雙方所保持,以備下次資料傳輸使用。另外,通訊的終端數目可能是多個,這就需要每個終端都要維持它所有的通訊關係,如下圖1-2所示
圖1-2 多對多通訊
此時,每個參與通訊的客戶端所需維持的連線數量將非常龐大,這非常不利於程式的開發和實現。出版/訂閱模式即是一種解決這種問題的方法,它通過增加一箇中間層的方式,讓中間層來維護這種多對多的關係,這個中間層通常稱之為伺服器,如下圖1-3所示:
圖1-3 增加中間層的多對多通訊
通過增加中間層伺服器,每個客戶端都只需要維護自己同伺服器之間的連線即可,而客戶端之間的關係則交由中間伺服器來維護,這種設計模式將複雜的通訊關係維護工作從客戶端剝離出來,非常方便客戶端的開發和維護。
Mosquito程式即是通過這種方式進行工作,在mosquitto程式內部,將客戶端之間的關係通過一棵訂閱樹來維持。
1.3、 Mosquito
Mosquito原始碼目錄結構介紹。
|---- mosquitto-1.2
|---- client
|---- examples
|----mysql_log
|----temperature_conversion
|---- installer
|---- lib
|---- cpp
|---- jsws
|----python
|---- logo
|---- man
|---- po
|----libmosquitto
|----mosquitto
|----mosquitto.conf
|----mosquitto_pub
|----mosquitto_sub
|----mosquitto-tls
|----mqtt
|---- misc
|----currentcost
|----gnome-panel
|---- security
|---- service
|---- monit
|----svscan
|----upstart
|---- src
|----db_dump
|---- test
|----broker
|---- c
|---- lib
|---- c
|----cpp
|----python
|----python3
|---- ssl
|----demoCA
|----rootCA
|----signingCA
所需關注的目錄有/ mosquitto-1.2/src、/ mosquitto-1.2/lib、/ mosquitto-1.2/client三個目錄,其中src和lib目錄下主要放置mosquitto的實現程式碼以及部分底層與網路相關的操作,client目錄主要為兩個客戶端程式的實現原始碼。
Mosquito的原始碼及其相關文件可從其官方網站獲取,其官方網站為:http://mosquitto.org/
mosquitto客戶端和伺服器執行命令
[1] 釋出者客戶端執行命令示例:
./mosquitto_pub -h 192.168.6.243 -p 1883 -t "111" -m "this is jason.hou" -u 111 -P 111
[2] 訂閱者客戶端執行命令示例:
./mosquitto_sub -h 192.168.6.243 -i 111 -p 1883 -t 111 -k 60 -d -c -u hjx -P hjx
[3] mosquitto伺服器端執行命令示例:
./mosquitto