天天看點

Mqtt開發筆記:Mqtt伺服器搭建

紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)

前話

  使用到mqtt伺服器(中間件)。

MQTT協定

  MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協定),是一種基于釋出/訂閱(publish/subscribe)模式的"輕量級"通訊協定,該協定建構于TCP/IP協定上,由IBM在1999年釋出。MQTT最大優點在于,可以以極少的代碼和有限的帶寬,為連接配接遠端裝置提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協定,使其在物聯網、小型裝置、移動應用等方面有較廣泛的應用。

精簡,不添加可有可無的功能;

釋出/訂閱(Pub/Sub)模式,友善消息在傳感器之間傳遞;

允許使用者動态建立主題,零運維成本;

把傳輸量降到最低以提高傳輸效率;

把低帶寬、高延遲、不穩定的網絡等因素考慮在内;

支援連續的會話控制;

了解用戶端計算能力可能很低;

提供服務品質管理;

假設資料不可知,不強求傳輸資料的類型與格式,保持靈活性。

使用釋出/訂閱消息模式,提供一對多的消息釋出,解除應用程式耦合

  這一點很類似于XMPP,但是MQTT的資訊備援遠小于XMPP,,因為XMPP使用XML格式文本來傳遞資料。

對負載内容屏蔽的消息傳輸

使用TCP/IP提供網絡連接配接

  主流的MQTT是基于TCP連接配接進行資料推送的,但是同樣有基于UDP的版本,叫做MQTT-SN。這兩種版本由于基于不同的連接配接方式,優缺點自然也就各有不同了。

有三種消息釋出服務品質

"至多一次",消息釋出完全依賴底層TCP/IP網絡。會發生消息丢失或重複。這一級别可用于如下情況,環境傳感器資料,丢失一次讀記錄無所謂,因為不久後還會有第二次發送。這一種方式主要普通APP的推送,倘若你的智能裝置在消息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。

"至少一次",確定消息到達,但消息重複可能會發生。

"隻有一次",確定消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級别。在計費系統中,消息重複或丢失會導緻不正确的結果。這種最高品質的消息釋出服務還可以用于即時通訊類的APP的推送,確定使用者收到且隻會收到一次。

小型傳輸,開銷小

  (固定長度的頭部是2位元組),協定交換最小化,以降低網絡流量。非常适合"在物聯網領域,傳感器與伺服器的通信,資訊的收集",嵌入式裝置的運算能力和帶寬都相對薄弱,使用這種協定來傳遞消息再适合不過了。

用戶端異常中斷的機制。

Last Will:即遺言機制,用于通知同一主題下的其他裝置發送遺言的裝置已經斷開了連接配接。

Testament:遺囑機制,功能類似于Last Will。

  MQTT是一個基于用戶端-伺服器的消息釋出/訂閱傳輸協定。MQTT協定是輕量、簡單、開放和易于實作的,這些特點使它适用範圍非常廣泛。 在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鍊路通信傳感器、偶爾撥号的醫療裝置、智能家居、及一些小型化裝置中已廣泛使用。

  

Mqtt開發筆記:Mqtt伺服器搭建

  從圖上MQTT有三種角色的存在:

Broker代理:很多人了解為中間件,當然可以這樣子認為。他就是一個中間件。用于處理資訊并發送到相應的訂閱者。

釋出者:用于釋出資訊到代理上面。注意:釋出者也可以是訂閱者。

訂閱者:就是用于接受資訊的用戶端。

  MQTT伺服器以稱為"消息代理"(Broker),可以是一個應用程式或一台裝置。它是位于消息釋出者和訂閱者之間,它可以:

接受來自客戶的網絡連接配接;

接受客戶釋出的應用資訊;

處理來自用戶端的訂閱和退訂請求;

向訂閱的客戶轉發應用程式消息。

  MQTT協定中定義了一些方法(也被稱為動作),來于表示對确定資源所進行操作。這個資源可以代表預先存在的資料或動态生成資料,這取決于伺服器的實作。通常來說,資源指伺服器上的檔案或輸出。主要方法有:

Connect:等待與伺服器建立連接配接

Disconnect:等待MQTT用戶端完成所作的工作,并于伺服器斷開TCP/IP會話

Subscribe:等待完成訂閱

UnSubscribe:等待伺服器取消用戶端的一個活多個和topics訂閱

Publish:MQTT用戶端發送消息請求,發送完成後傳回應用程式線程

Windows上Apache Apoll環境搭建(mqtt)

  官方下載下傳位址:https://activemq.apache.org/

  CSDN下載下傳位址:javascript:void(0)

  官方下載下傳位址:https://www.oracle.com/technetwork/java/javase/downloads/index.html

  下載下傳系統對應的版本,windows x64位

Mqtt開發筆記:Mqtt伺服器搭建

  添加java路徑到系統Path變量

  JAVA_HOME

  PATH(最後面加上)

  加粗樣式CLASSPATH

  使用cmd運作java命名,jdk環境配置成功,如下圖:

Mqtt開發筆記:Mqtt伺服器搭建

  将Apache Apoll解壓到C槽下(自定義),如下圖:

Mqtt開發筆記:Mqtt伺服器搭建

\

  使用cmd進入該檔案夾建立執行個體:

Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建

  進入mybroker/conf,檢視users.properties,可以看到使用者名

Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建

  檢視tcp監聽端口(可自行修改,筆者不修改)

Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建

  檢視web管理頁面端口(可自行修改,筆者不修改)

Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建
Mqtt開發筆記:Mqtt伺服器搭建

  至此windows server2008 r2系統上的apache apoll中間件環境以及服務成功搭建完成。

常見錯誤處理

  用戶端遇到協定違規,是以關閉了連接配接。

錯誤

  檢查伺服器報錯

Mqtt開發筆記:Mqtt伺服器搭建

原因

  ActiveMQ有時會報類似Frame size of 257 MB larger than max allowed 100 MB的錯誤,意思是單條消息超過了預設的最大值,在配置檔案中

  我們可以配置這個值,但是有時會突然出現很大的單條消息,比如1G。

分析

  QtMqtt與服務連接配接,傳過去的屬性最大值可能是258MB,是以直接修改伺服器配置。

解決方法

  重新開機服務