【物聯網】基于樹莓派的物聯網開發【17】——物聯網通信協議MQTT基礎知識

使用背景

MQTT最初是為了解決物聯網(IoT)領域設備之間的低帶寬、高延遲、不穩定網絡連接等問題而設計的。

場景介紹

廣泛應用物聯網領域,數據實時傳輸,連接各種智能設備和應用的關鍵橋梁

MQTT簡介和概述

MQTT(Message Queuing Telemetry Transport)是一種輕量級的消息傳輸協議,它是一種基于發布(Publish)/訂閱(Subscribe )模式的消息傳輸協議(物聯網通信協議),它工作在TCP/IP協議族上,并為低帶寬、高延遲或不穩定的網絡環境提供了可靠的消息傳輸服務。MQTT協議是基于TCP/IP協議棧構建的,可以在不同的設備和平臺之間進行通信。憑借簡單易實現、支持 QoS、報文小等特點,占據了物聯網協議的半壁江山. MQTT在物聯網方向的開發出現的頻率非常高, 因此從事該行業方向開發有必要對其進行下系統的學習。

在這里插入圖片描述

MQTT的主要特點是什么?

MQTT協議的主要特點是輕量級、簡單、靈活和可擴展。它使用了發布/訂閱的消息傳遞模式,這意味著消息的發送者(發布者)和接收者(訂閱者)不需要直接進行連接,而是通過代理(Broker)進行消息的轉發。這種設計使得MQTT非常適合于物聯網場景,因為物聯網中的設備通常具有不同的通信能力和需求。
● 開放消息協議,簡單易實現
● 發布訂閱模式,一對多消息發布
● 基于TCP/IP網絡連接,提供有序,無損,雙向連接。
● 1字節固定報頭,2字節心跳報文,最小化傳輸開銷和協議交換,有效減少網絡流量。
● 消息QoS支持,可靠傳輸保證

注意:
1、 主流的MQTT是基于TCP連接進行數據推送的,但是同樣有基于UDP的版本,叫做MQTT-SN。
2、 關于Qos,需要指出的是三種消息發布質量。

QoS消息發布質量介紹
QoS0:“至多一次”,消息發布完全依賴底層TCP/IP網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。這一種方式主要用于普通APP的推送,倘若你的智能設備在消息推送時未聯網,推送過去沒收到,即使再次聯網也收不到了。

QoS1:“至少一次”,確保消息到達,但消息重復可能會發生

QoS2:“只有一次”,確保消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級別。在計費系統中,消息重復或丟失會導致不正確的結果。這種最高質量的消息發布服務還可以用于即時通訊類的APP的推送,確保用戶收到且只會收到一次。

MQTT的基本原理是什么?

MQTT的基本原理是發布/訂閱模式。在MQTT中,消息發布者(Publisher)將消息發布到一個主題(Topic)上,而消息訂閱者(Subscriber)則訂閱這個主題,當有新的消息發布到這個主題上時,訂閱者將會收到這個消息。MQTT的消息傳遞過程如下:

● 發布者將消息發送到MQTT Broker(代理服務器)上,并指定消息發布的主題。
● 訂閱者通過訂閱相應的主題,向MQTT Broker注冊對該主題的訂閱。
● 當有新的消息發布到該主題時,MQTT Broker會將消息發送給所有訂閱了該主題的訂閱者。

MQTT協議使用TCP/IP協議棧進行通信,因此在使用MQTT協議時需要建立TCP連接。MQTT協議支持三種不同的服務質量級別(QoS級別),可以根據需求選擇適當的級別。當消息發布者發布消息時,可以指定消息的QoS級別,用于保證消息的可靠性和傳遞的順序。

MQTT協議還支持保留消息(Retained Messages)和遺囑消息(Last Will and Testament)。保留消息是指最新的消息將一直保存在服務器上,新的訂閱者可以獲取最新的消息。遺囑消息是指在客戶端異常斷開連接時自動發送一條消息,用于通知其他訂閱者該客戶端已經離線。

實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分:
● Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload);
● payload,可以理解為消息的內容,是指訂閱者具體要使用的內容。
在這里插入圖片描述

網絡鏈接

由底層傳輸協議提供給MQTT使用的架構

● 底層傳輸協議能夠連通客戶端和服務端
● 底層傳輸協議提供有序的,可靠的,雙向字節流

應用消息

指通過MQTT在網絡中傳輸的應用程序數據。 當應用消息通過MQTT傳輸的時候會附加上質量服務(QoS)和話題名稱。

客戶端

一個使用MQTT協議的應用程序或者設備,它總是建立到服務器的網絡連接。客戶端可以

● 發布, 訂閱消息
● 退訂和刪除應用程序消息
● 斷開和服務器連接

服務端

MQTT服務器被稱為"消息代理"(Broker),它可以是一個應用程序或一臺設備。是位于消息發布者和訂閱者之間,它可以:

● 接收客戶端消息
● 處理客戶端訂閱和退訂請求
● 向訂閱的客戶端轉發消息

主題名

指附著于應用消息的標簽,服務端用它來匹配訂閱。服務端給每個匹配到的客戶端發送一份應用信息的拷貝。

主題過濾器

是包含在訂閱里的一個表達式,用來表示一個或多個感興趣的話題。話題過濾器可以包含通配符。

MQTT控制包

通過網絡連接發送的包含一定信息的數據包。MQTT規范定義了14個不同類型的控制包,其中一個(PUBLISH包)用來傳輸應用信息。

發布/訂閱、主題、會話

mqtt工作流程

● 客戶端發送連接請求到服務器, 在服務器確認(認證)后則建立連接.
● 之后客戶端則可以將消息以主題的形式 發布 到服務器 broker
● 然后其他客戶端則可以 訂閱 相關主題, 接收對應主題的信息(依照訂閱發布模型)
● 同時消息服務器broker 會接收客戶端的心跳請求并返回心跳響應, 用于監測客戶端,服務器健康狀況.

MQTT有什么優點?

1、輕量級
MQTT協議非常輕量級,傳輸的數據包頭很小,通信的負載也很小,適用于各種網絡環境。
2、發布/訂閱模式
MQTT協議采用發布/訂閱模式,可以實現多個客戶端之間的消息傳遞。
3、QoS級別
MQTT協議支持三種不同的服務質量級別(QoS級別),可以根據需求選擇適當的級別。
4、保留消息
MQTT協議支持保留消息,可以將最新的消息保留在服務器上,新的訂閱者可以獲取最新的消息。
5、遺囑消息
MQTT協議支持遺囑消息,可以在客戶端異常斷開連接時自動發送一條消息。
6、安全性
MQTT協議支持TLS/SSL加密,可以保證通信的安全性。
7、易于實現和部署
MQTT協議的實現和部署都非常容易,可以適用于各種物聯網應用場景。
8、開放性
MQTT協議是一個開放的標準,可以與其他協議和系統進行集成。

MQTT有什么缺點?

1、可擴展性有限
MQTT協議的可擴展性有限,不適合大規模的物聯網應用。
2、不支持請求/響應模式
MQTT協議不支持請求/響應模式,限制了一些應用場景。
3、不支持消息隊列
MQTT協議不支持消息隊列,限制了一些應用場景。
4、消息傳遞的延遲
由于MQTT協議的發布/訂閱模式,消息傳遞的延遲可能會比較大,不適合實時性要求較高的應用場景。

MQTT應用領域有哪些?

傳感器數據的采集和傳輸
許多傳感器需要將采集的數據傳輸到服務器或其他設備中進行處理,MQTT協議可以實現數據的實時傳輸和管理。
智能家居
MQTT協議可以用于智能家居中各種設備之間的通信和控制,例如智能燈光、智能家電、智能安防等。
智能交通
MQTT協議可以用于智能交通系統中各個設備之間的通信和協作,例如智能導航、智能停車、智能交通燈等。
智能制造
MQTT協議可以用于智能制造中各種設備之間的通信和控制,例如智能生產線、智能倉儲等。
物流和供應鏈
MQTT協議可以用于物流和供應鏈中各個環節之間的通信和協作,例如智能倉儲、智能物流等。
能源管理
MQTT協議可以用于能源管理中各種設備之間的通信和控制,例如智能電網、智能能源監測等。
智慧城市
MQTT協議可以用于智慧城市的建設和管理中,例如智能路燈、智能公交、智能城市管理等。

MQTT的安全認證機制是什么?

用戶名和密碼認證
MQTT協議可以通過用戶名和密碼認證機制來確保客戶端的身份。在連接MQTT Broker之前,客戶端需要提供用戶名和密碼以進行身份驗證。
SSL/TLS加密
MQTT協議可以通過SSL/TLS加密來保證通信的安全性。客戶端和MQTT Broker之間的數據傳輸會被加密,確保數據的機密性和完整性。
X.509證書認證
MQTT協議可以通過X.509證書認證機制來確保客戶端和MQTT Broker之間的身份認證和通信安全。
IP過濾
MQTT Broker可以通過IP過濾來限制客戶端的訪問,確保安全性和可控性。
ACL(訪問控制列表)
MQTT Broker可以通過ACL機制來限制客戶端的訪問權限,確保數據的安全性和保密性。
防火墻
MQTT Broker可以通過防火墻來限制客戶端的訪問,確保網絡的安全性和穩定性。

MQTT的會話和持久化機制是什么?

MQTT協議支持兩種類型的會話:非持久化會話和持久化會話
非持久化會話:當客戶端連接到MQTT代理時,會創建一個非持久化會話。這種會話會在客戶端斷開連接時自動結束,會話中的QoS0消息也會被丟棄。
持久化會話:當客戶端連接到MQTT代理時,可以選擇創建一個持久化會話。這種會話會在客戶端斷開連接后繼續存在,會話中的QoS1和QoS2消息也會被保存。客戶端可以重新連接并恢復未接收的消息。
MQTT代理可以使用持久化機制來保存持久化會話的狀態信息,以便在客戶端重新連接時恢復會話。這通常是通過將會話狀態信息保存在磁盤或數據庫中實現的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90400.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【qml-3】qml與c++交互第二次嘗試(類型方式)

背景: 【qml-1】qml與c交互第一次嘗試(實例方式) 【qml-2】嘗試一個有模式的qml彈窗-CSDN博客 【qml-3】qml與c交互第二次嘗試(類型方式) 還是qml學習筆記。 這次擱置太久了。其實不太會,還是以教程為主…

輸電線路觀冰精靈在線監測裝置:科技賦能電網安全的新利器

一、技術架構與工作原理輸電線路觀冰精靈在線監測裝置(簡稱“觀冰精靈”)是一款集成多源感知、智能分析、遠程通信于一體的專業化覆冰監測設備。其核心功能通過以下技術路徑實現:1. 數據采集模塊視覺識別系統:搭載工業級夜視攝像機…

Ubuntu22 上,用C++ gSoap 創建一個簡單的webservice

創建calc.h// calc.h // gSOAP 服務定義 int ns__add(double a, double b, double &result); int ns__subtract(double a, double b, double &result);創建my_server.cpp#include "soapService.h" #include "ns.nsmap" class MyService : public S…

Java(LinkedList和ArrayList底層分析)

LinkedList全面說明:LinkedList底層操作機制:LinkedList的方法:add():增加節點對象remove():刪除一個節點對象(默認刪除第一個節點對象)set():修改一個節點對象get():得到一個節點對象LinkedList的遍歷:增強for循環迭代器普通for循化LinkedList的源碼解讀:增加源碼:1. LinkedLi…

開源項目XBuilder的user邏輯

stores \ userquery-keys.ts 統一管理Vue Query(TanStack Query的Vue適配版本)緩存鍵,在下面的文件中復用index.ts 入口文件,統一用戶信息查詢signed-in.ts 登錄狀態管理、認證邏輯在用戶登錄后,系統頒發一個令牌&…

第十五章 SEO的簡單免費工具

SEO的基礎工具和檢測 前文中主要是講一些SEO的網站基本功,而在這一章那,會講到一些非常基本的工具,主要是關于:網站的流量、停留時長、關鍵詞密度、內容、以及Google的站長工具。 Google Search Console Google Search Console這是…

SSL 證書與 HTTPS 的關系:一文理清核心關聯

HTTPS(Hypertext Transfer Protocol Secure)和 SSL 證書(Secure Sockets Layer Certificate)是網絡安全的兩大基石,它們共同保障了互聯網通信的安全性和可信度。以下從定義、功能、關系及實際應用層面進行解析&#xf…

使用Jmeter參數化實現接口自動化測試

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 本文記錄如何使用Jmeter參數化(csv)實現接口自動化——測試Token不同入參情況下,接口請求能夠返回正確的結果1. 首先需要使用Jmeter獲取一個…

X-plore File Manager v4.34.02 修改版:安卓設備上的全能文件管理器

在使用安卓設備時,文件管理是日常操作中不可或缺的一部分。X-plore File Manager 作為一款功能強大的文件管理器,憑借其豐富的功能和便捷的操作,成為安卓用戶管理文件的首選工具之一。最新版 v4.34.02 修改版更是解鎖了更多高級功能&#xff…

React+threejs兩種3D多場景渲染方案

在現代 Web 開發中,3D 可視化需求日益增長,特別是在 React 生態系統中實現多 3D 場景的展示與交互。本文通過對比兩種實現方案,探討 React 中構建多 3D 場景的最佳實踐,分析它們的技術特點、性能表現和適用場景。方案一&#xff1…

React性能優化終極指南:memo、useCallback、useMemo全解析

掌握 React.memo、useCallback、useMemo 的正確使用姿勢,讓你的 React 應用性能飛起來! 🎯 React.memo 作用 React.memo 是一個高階組件,用于函數組件,通過淺比較 props 的變化來決定是否重新渲染。如果 props 沒有變…

借助 VR 消防技術開展應急演練,檢驗完善應急預案?

應急演練是企業應對火災事故的重要手段,而 VR 消防技術的應用,為應急演練帶來了全新的體驗和更高的效率。VR 消防技術通過虛擬現實技術模擬逼真的火災場景,讓參與者能夠身臨其境地感受火災發生時的緊張氛圍。某知名物流企業,倉庫眾…

【電賽學習筆記】MaxiCAM 項目實踐——二維云臺追蹤指定目標

前言 本文是對視覺模塊MaixCam實現二維云臺人臉跟蹤_嗶哩嗶哩_bilibili大佬的項目實踐整理與拓展,侵權即刪。 單路舵機基本控制 #導入必要模塊 from maix import pwm, time , pinmap#定義全局變量,設初值 SERVO_FREQ 50 #主頻 SERVO_MIN_DUT…

深入解析 ArkUI 觸摸事件機制:從點擊到滑動的開發全流程

摘要 隨著 HarmonyOS NEXT 的不斷發展,ArkUI 逐漸成為主流的 UI 構建方式。而用戶交互在任何應用中都是基礎而又關鍵的一環,如何利用 ArkUI 提供的觸摸事件機制,如 onTouch、onClick、onSwipe 等,來實現自然、順滑、用戶友好的交互…

Tailwind CSS 自定義工具類與主題配置指南

一、自定義工具類配置在 src/tailwind.css 文件中,我們可以通過 layer utilities 指令添加自定義工具類:tailwind base; tailwind components; tailwind utilities;layer utilities {/* 自定義工具 上下浮動效果 */.animate-floatY {animation: floatY 3…

【代碼隨想錄二刷|704.二分查找、27.移除元素、977.有序數組的平方】

704.二分查找 題目鏈接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int search(vector<int>& nums, int target) {//不用二分查找&#xff0c;直接求// for(int i0;i<nums.size();i){// if(nums[i]target)…

基于Vue的工業設備大屏可視化模板(含設備地圖分布+宣傳模塊+報表展示+三維模型加載預覽)

場景 為實現工業設備可視化大屏需求&#xff0c;可實現基于地圖的設備數據管理&#xff0c;點擊具體設備可進行詳細介紹和三維模型展示。 可播放宣傳視頻&#xff0c;可展示PM數據報表等數據&#xff0c;可接受報警數據提醒、統計等數據。 基于現有開源平臺框架進行二次改造…

堆(Heap)優先級隊列(Priority Queue)

一、堆的概念堆&#xff08;Heap&#xff09;是一種特殊的基于樹的數據結構&#xff0c;通常分為最大堆和最小堆兩種類型。它滿足堆屬性&#xff1a;對于最大堆&#xff0c;父節點的值總是大于或等于其子節點的值&#xff1b;而對于最小堆&#xff0c;父節點的值總是小于或等于…

踩坑記錄:因版本不匹配導致 Boost 1.85 編譯失敗的完整解決過程

踩坑記錄&#xff1a;因版本不匹配導致 Boost 1.85 編譯失敗的完整解決過程 轉載請注明出處&#xff0c;歡迎評論區交流。 背景 最近在 Windows 11 VS2022 環境下嘗試用 b2 編譯 Boost 1.85.0&#xff0c;結果一路踩坑&#xff0c;最后發現罪魁禍首是 Boost.Build 自帶的 msv…

InfluxDB Line Protocol 協議深度剖析(二)

四、Line Protocol 寫入操作與實踐&#xff08;一&#xff09;HTTP API 寫入使用 HTTP API 是通過 Line Protocol 寫入數據到 InfluxDB 的常用方式。InfluxDB 1.x&#xff1a;請求方式為 POST&#xff0c;URL 格式為 “http://host:port/write?dbdatabase_name”。其中&#x…