1. 程式人生 > >mosquitto原始碼分析(一)

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