'MQTT協議的深入瞭解及多語言代碼實例'

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js是MQTT協議的JS語言客戶端庫,用於node.js和瀏覽器。下面是一個使用MQTT.js發送消息的示例:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js是MQTT協議的JS語言客戶端庫,用於node.js和瀏覽器。下面是一個使用MQTT.js發送消息的示例:

MQTT協議的深入瞭解及多語言代碼實例

MQTTnet

MQTTnet是一個用於基於MQTT的通信的高性能.NET庫。它提供MQTT客戶端和MQTT服務器(代理)。

設置MQTT客戶端:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js是MQTT協議的JS語言客戶端庫,用於node.js和瀏覽器。下面是一個使用MQTT.js發送消息的示例:

MQTT協議的深入瞭解及多語言代碼實例

MQTTnet

MQTTnet是一個用於基於MQTT的通信的高性能.NET庫。它提供MQTT客戶端和MQTT服務器(代理)。

設置MQTT客戶端:

MQTT協議的深入瞭解及多語言代碼實例

設置MQTT客戶端選項後,可以建立連接。以下代碼顯示如何連接服務器:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js是MQTT協議的JS語言客戶端庫,用於node.js和瀏覽器。下面是一個使用MQTT.js發送消息的示例:

MQTT協議的深入瞭解及多語言代碼實例

MQTTnet

MQTTnet是一個用於基於MQTT的通信的高性能.NET庫。它提供MQTT客戶端和MQTT服務器(代理)。

設置MQTT客戶端:

MQTT協議的深入瞭解及多語言代碼實例

設置MQTT客戶端選項後,可以建立連接。以下代碼顯示如何連接服務器:

MQTT協議的深入瞭解及多語言代碼實例

顯示收到的消息:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js是MQTT協議的JS語言客戶端庫,用於node.js和瀏覽器。下面是一個使用MQTT.js發送消息的示例:

MQTT協議的深入瞭解及多語言代碼實例

MQTTnet

MQTTnet是一個用於基於MQTT的通信的高性能.NET庫。它提供MQTT客戶端和MQTT服務器(代理)。

設置MQTT客戶端:

MQTT協議的深入瞭解及多語言代碼實例

設置MQTT客戶端選項後,可以建立連接。以下代碼顯示如何連接服務器:

MQTT協議的深入瞭解及多語言代碼實例

顯示收到的消息:

MQTT協議的深入瞭解及多語言代碼實例

發佈消息:

"

可以預測,隨著通訊技術日益發展,追隨著互聯網,移動互聯網之後的互聯網將是人類科技史上又一次重大變革,科技改變生活,物聯網將全方位改變我們的生活。那麼什麼是物聯網,萬物如可聯網呢?今天蟲蟲就給大家介紹萬物聯網基礎協議MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),一種輕量級,開源和可訪問的協議。

MQTT協議的深入瞭解及多語言代碼實例

概述

MQTT是一種發佈/訂閱(publish/subscribe)式消息傳遞協議,其歷史可追溯到上世紀末年1999,由Andy Stanford-Clark(IBM)和Arlen Nipper(Cirrus Link)的開發,用於在帶寬有限、連接不可預測的網絡上維持機器間通信的方法。最初用於保持石油管道的各個部分之間互相通迅,並通過使用衛星和管理中心通訊。

由於極其惡劣的通訊條件,使得協議非常輕量、代碼佔用空間極低,是低功耗設備和電池壽命有限的設備的理想選擇,MQTT已成為有限CPU功率和電池容量有限設備之間流式傳輸數據的首選協議,適用於價格昂貴或低帶寬,穩定性不可預測或高延遲的網絡。所以MQTT天生適用物聯網的通訊。

MQTT是構建在TCP/IP協議之上的,也有一個名為MQTT-SN的分支,用於藍牙,UDP,ZigBee和其他非TCP/IP物聯網鏈接。

MQTT協議的深入瞭解及多語言代碼實例

MQTT不是同類中唯一的發佈/訂閱(publish/subscribe)實時消息傳遞協議,但它已經在各種依賴於機器到機器通信的環境中得到廣泛採用。同時代消息傳輸西醫還有WAMP (Web Application Messaging Protocol ,Web應用程序消息傳輸協議),STOMP(Streaming Text-Oriented Messaging Protocol,流式文本定向消息傳輸協議)和AMQP(Alternative Message Queueing Protocol,可選消息隊列協議)。

MQTT工作原理

基於MQTT構建的通信系統由發佈者,代理(MQTT服務器)和一個或多個客戶端(訂閱者、消費者)三部分組成。發佈者不需要關心接收消息的訂戶的數量或位置等等配置。同樣,消費者不需要特定的發佈服務器的配置。系統上可以有多個代理分發消息。

MQTT協議的深入瞭解及多語言代碼實例

MQTT提供了一種創建通信通道層次結構的方法。該方法有點像帶有樹狀葉子的分支。每當發佈者將新數據分發給客戶時,消息中都附加發送控制備註。較高級別的客戶端可以接收所有的消息,而較低級別的客戶端只能接收與傳遞層次結構底部的一個或兩個基本信道葉子的消息。這樣可以傳輸小至2B大到256MB的信息。

一個MQTT客戶端通過MQTT代理連接的示例:

MQTT協議的深入瞭解及多語言代碼實例

由MQTT代理髮布或接收的數據都將以二進制編碼, MQTT是二進制協議:

MQTT協議的深入瞭解及多語言代碼實例

MQTT代理有時可能會累積一些當前訂戶的通道無關的消息。這時會根據控制消息中的指令丟棄或保留消息。這樣有新訂戶就可以直接獲取最新記錄的數據點,不需要等到下一次發送,這很有用。

需要說的是MQTT使用純文本來傳輸用戶憑據,也不提供對身份驗證或安全功能的支持。所以需要用SSL來加密保護傳輸的信息不被攔截或篡改。

MQTT功能

MQTT具有以下的功能:

基於於消息內容的不可知;

適用於一對多通信分配和解耦應用;

具備"遺囑"功能,通知各方客戶異常斷線;

出於基本連接目的,取決於TCP/IP;

至多一次,至少一次,和只發送一次三種消息質量QoS(消息傳遞次數)發佈模式;

可以同時為發佈者,消費者兩種的角色。

MQTT還有一個顯著特徵是它對通道的利用。在MQTT中將每個通道都視為文件路徑:

channel = "user/path/channel"

通道確保每個監聽接收其訂閱的消息。MQTT通過將通道視為文件路徑來實現各種有用的通信功能,包括允許基於監聽所在文件路徑上訂閱的位置或位置分支進行消息過濾。

MQTT消息傳遞格式

下面是使用MQTT協議消息都由兩部分組成組成:

MQTT協議的深入瞭解及多語言代碼實例

字節1:包含消息類型(客戶端連接請求,訂閱確認,ping請求等),複製標記,保留消息指令和有關服務質量等級(QoS)的信息。

字節2:包含有關消息剩餘長度的信息,包括有效載荷和可選變量頭中的任何數據。

QoS級別

字節1中的QoS標誌值是MQTT支持的可變功能的核心。 QoS標誌包含基於消息的意圖和緊急程度三種值:

0, 最多一次,服務器觸發和忘記,消息可能丟失或重複。

MQTT協議的深入瞭解及多語言代碼實例

1, 至少一次,收件人確認傳遞,消息可能重複,但確保傳遞到位。

MQTT協議的深入瞭解及多語言代碼實例

2, 只發送一次,服務器確保交付,消息準確到達一次而不會丟失或重複

MQTT協議的深入瞭解及多語言代碼實例

MQTT現狀

今年年4月7日,OASIS正式發佈了MQTT v5.0官方開源標準。OASIS組織是一個由600個成員組織和5000多人蔘與者組成的非營利性聯盟。

MQTT協議的深入瞭解及多語言代碼實例

5.0版引入了一些實時開發新功能。這些新功能向後兼容已部署的版本的MQTT。

這些新功能包括:

改進了錯誤報告:新版中無論出於何種原因,返回代碼都可以在數據未成功傳輸時通知用戶。支持可選的Reason字符串,有助於改進診斷和故障排除工作。

訂閱共享:為了幫助平衡負載,可以在接收端的多個客戶端之間共享訂閱。

消息屬性:5.0版引入了元數據作為消息頭的一部分。它可以向最終用戶傳達附加信息,或者它可以促進下面包括的一些其他功能。

通道別名:發佈者可以使用數字標識符替換通道,以減少需要傳輸的字節數。

消息到期:如果系統無法在預設的時間內提供消息,則可以將消息標記為自動刪除。MQTT 5.0的新功能完整列表可以在官方標準的附錄C中找到。

MQTT的使用

隨著物聯網應用程序不斷髮展完善,MQTT通過一種開放,直接和可擴展的方式將分佈式計算和物聯網功能推廣到更廣泛的用戶群,包括在消費者和工業市場。

MQTT是一種輕量級消息傳遞協議,設計用於網絡質量不確定和物理限制設備:電源和CPU。但是MQTT的使用並不僅限於此,可以廣泛用於從重複數據採樣到工業機器控制,可為許多物聯網基礎設施類型提供不同級別的服務。

除了當今市場上的消費級設備和服務外,MQTT還在各種大小規模的企業基礎設施被應用,包括智能手機和平板電腦,能源監控系統,醫療設備,石油鑽井平臺和鑽井現場,汽車和航空航天工業,以及材料處理,建築,供應鏈,零售等中使用的傳感器和機器視覺系統。

使用場景

環境傳感器數據: MQTT支持"最多一次"消息傳遞模型。在覆蓋範圍不穩定或高延遲的網絡上,信息可能會丟失或重複。遠程傳感器以設定的間隔記錄和傳輸數據的領域新的讀數定期擦劑,數據可丟失但是不能錯誤。遠程環境中的傳感器通常是低功耗設備,MQTT非常適合具有較低優先級數據傳輸需求的物聯網傳感器網絡。

機器健康和告警數據:為了快速響應新出現的問題並避免停機,風力渦輪機可能需要向本地團隊提供有保證的機​​器運行狀況數據,甚至在信息到達數據中心之前。對於這樣的需要,"至少一次"消息傳遞確保在正確的時間看到維護標誌以防止問題,即使這些標誌可以重複出現。適用於更高優先級的機器對機器通信系統。

計費系統:在更高優先級和更準確度的消息需求,比如涉及計費的地方,只發送一次QoS標籤就派上用場了。這樣可以消除計費或發票系統中重複或丟失的消息包,並減少異常情況,減少與客戶的不必要衝突。

不適用場合

開發人員可以選擇用於設計和部署雙向物聯網功能的協議,包括MQTT,HTTP,CoAP,WebSockets等。 MQTT是否是最佳選擇取決於你希望應用程序執行的操作以及硬件的性質。

MQTT專為極低帶寬環境而設計,在保存每個字節的過程中可能很不靈活。例如,規範定義了五個錯誤響應,服務器可以使用這些錯誤響應拒絕連接(例如,錯誤的用戶名或密碼,或不可接受的協議版本);如果服務器擴展一些不屬於這五個錯誤的錯誤,那就不行了。更糟糕的是,如果在連接運行後發生錯誤,則根本沒有用於錯誤協議消息的機制,服務器不會發出任何迴應,客戶端不知道為什麼被丟棄(沒有方法可以區分故意斷開與瞬態網絡問題)。對於習慣於更靈活、更容易調試(儘管帶寬節省更少)協議的人來說,這種對帶寬的錯誤處理方式可能有點原始。

MQTT通常會和HTTP對比,谷歌組織開展了一項研究,比較兩者的響應時間,數據傳輸大小和其他對開發人員重要的屬性。MQT只有在連接可以重用以發送多個有效負荷時在測試中才獲得比較好的效果。

HTTP和MQTT都是物聯網應用的理想選擇,因為它們具有相當緊湊的傳輸大小以及對設備電池壽命和內存的低要求。

CoAP是物聯網開發常用的另一種協議。與MQTT相似,但有明顯的差異。MQTT是一種多對多協議,而CoAP主要是用於服務器和客戶端之間通信的一對一協議。 CoAP還提供MQTT沒有的元數據,發現和內容協商功能。

如果客戶端只需要接收數據,那麼SSE(Server-Sent Events)也是一個有效的選擇。

MQTT快速構建

MQTT GitHub存儲庫(github/mqtt)包含各種語言的開源MQTT庫的廣泛列表。次數我們選擇基於PHP,Python,JS,c#語言實例進行簡單代碼演示實現。

Eclipse Mosquitto

Eclipse Mosquitto是一個開源(EPL/EDL許可)消息代理,它實現了MQTT協議版本5.0,3.1.1和3.1。Mosquitto輕量級,有多種語言基於此的開發庫,適用於從低功率單片機到服務器的所有設備。下面是一個php語言的Moquitto庫是示例:

MQTT協議的深入瞭解及多語言代碼實例

一個Moquitto Python語言庫(Eclipse Paho Python)實例:

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js

MQTT協議的深入瞭解及多語言代碼實例

MQTT.js是MQTT協議的JS語言客戶端庫,用於node.js和瀏覽器。下面是一個使用MQTT.js發送消息的示例:

MQTT協議的深入瞭解及多語言代碼實例

MQTTnet

MQTTnet是一個用於基於MQTT的通信的高性能.NET庫。它提供MQTT客戶端和MQTT服務器(代理)。

設置MQTT客戶端:

MQTT協議的深入瞭解及多語言代碼實例

設置MQTT客戶端選項後,可以建立連接。以下代碼顯示如何連接服務器:

MQTT協議的深入瞭解及多語言代碼實例

顯示收到的消息:

MQTT協議的深入瞭解及多語言代碼實例

發佈消息:

MQTT協議的深入瞭解及多語言代碼實例

部署

在規模部署方面需要注意首先MQTT是一種網絡協議,無論如何選擇,都需要基礎設施和網絡功能來處理通過MQTT增加的設備到設備流。

輕量級機器對機器(LWM2M)是另一種在企業級別與MQTT一起使用協議。與MQTT相比,LWM2M有時更適合長期物聯網的部署。當企業希望在沒有大量購買的情況下參與物聯網功能試運行時,MQTT是理想的選擇,而LWM2M則為企業構建具有多功能性長期基礎設施提供了功能。LWM2M具有卓越的設備管理工具,例如連接監控,固件更新和遠程設備操控。對於擁有大量非託管設備向中央物聯網平臺發送大量數據的企業而言,LWM2M是更好的選擇。

在服務器負載方面,服務器可以處理的併發連接數很少成為瓶頸。大多數的MQTT服務器/代理可以支持數千個併發連接,但是一旦MQTT服務器進程處理了實際數據的接收,處理和響應消息所需的工作量是多少?通常會出現各種潛在問題,例如讀取和寫入數據庫,與服務器集成,為每個客戶端分配和管理資源等等。一旦一臺機器無法應對工作負載就需要增加服務器,這就需要負載平衡和集群設計,連接到不同服務器的客戶端之間的消息同步等。

"

相關推薦

推薦中...