主頁 >  其他 > 物聯網網路協議-MQTT協議的使用

物聯網網路協議-MQTT協議的使用

2021-02-16 17:04:57 其他

物聯網網路協議-MQTT協議的使用

非加密訊息傳輸

物聯網系統中網路協議是物聯網設備之間溝通的“語言”,使用同一種語言,雙方才能通信成功,MQTT 協議是最流行的一種,它甚至已經成為物聯網系統事實上的網路協議標準,

第一步是安裝 hbmqtt,它是一個開源的基于 Python 語言的 MQTT Broker 軟體,正好包括我們需要使用一些工具,hbmqtt通過打開終端輸入 pip 命令就可以安裝,這也是選擇使用它的主要原因,
不過要注意的是,hbmqtt 是基于 Python3 實作的,因此這里使用的是 pip3 工具,

pip3 install hbmqtt

安裝完成后,我們就可以使用 hbmqtt 中提供的 hbmqtt_sub 和 hbmqtt_pub 這兩個命令列工具了,通過名字,你應該也可以看出 hbmqtt_sub 可以充當訂閱者的角色;hbmqtt_pub 可以作為訊息的發布者,
至于訂閱者和發布者之間的經紀人,也就是 MQTT Broker,我們使用 Eclipse 免費開放的在線 Broker 服務,
鏈接: link.
打開鏈接,你可以看到關于埠的介紹資訊,加密和非加密方式都支持,而且還有基于 Websocket 的實作,這對基于前端網頁的應用來說是非常有利的,
我們先使用 1883 埠的非加密方式,然后為訊息傳輸確定一個主題(Topic),主題確定了訊息的類別,用于訊息過濾,我們可以把主題可以設為“/geektime/iot”,

/geektime/iot

接著,我們在電腦的終端界面輸入下面的命令,就可以訂閱這個主題訊息:

hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot

如果你想了解一些命令的執行細節,可以在上面的命令中加上 “-d” 引數,
現在,我們啟動另外一個終端界面,通過 hbmqtt_pub 發布一個 “/geektime/iot” 主題的訊息:

hbmqtt_pub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot -m Hello,World!

通過 Eclipse 的開放 Broker 作為“經紀人”,訊息被傳輸到了我們通過 hbmqtt_sub 運行的訂閱者那里,下圖是終端界面上運行的結果,一個完整的訊息傳輸程序就這樣完成了,

MQTT 在物聯網領域的優勢

MQTT 的生態很完善

在使用 MQTT 的時候會覺得很方便,可供挑選的方案有很多,可以支持多種語言,類似的 MQTT Broker 軟體,你還可以選擇基于 C 語言的Mosquitto,基于 Erlang 語言的VerneMQ等,
至于 MQTT 的客戶端(Client)實作,也有成熟的 Python、C、Java 和 JavaScript 等各種編程語言的開源實作,
而且,還有很多商業公司在持續運營功能更豐富、支持更完備的商業版 Broker 實作,比如提供高并發能力的集群特性、方便拓展的插件機制等,這些會大大提高我們技術開發者的作業效率,

MQTT 自身的“基因”很強大

阿里云、華為云、騰訊云和微軟 Azure 這些大廠,之所以不約而同地選擇 MQTT 協議作為物聯網設備的“第一語言”,不僅是因為 MQTT 的生態完善,MQTT 協議本身的優秀設計也是重要的因素,
它在設計上的優點體現在主要有五個方面:
1.契合物聯網大部分應用場景的發布 - 訂閱模式,
2.能夠滿足物聯網中資源受限設備需要的輕量級特性,
3.時刻關注物聯網設備低功耗需求的優化設計,
4.針對物聯網中多變的網路環境提供的多種服務質量等級,
5.支持在物聯網應用中越來越被重視的資料安全,

發布 - 訂閱模式

剛才通信程序,是一個發布者和一個訂閱者的情況,在這之后,你可以再打開一個終端界面,重復和之前一樣的命令,再啟動一個訂閱者,

hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot

現在,這兩個訂閱者都訂閱了“/geektime/iot” 主題的訊息,
然后,你再次使用 hbmqtt_pub 發送訊息,就可以看到兩個訂閱者都收到了同樣的訊息,這是發布 - 訂閱模式的典型特征,

因為采用了發布 - 訂閱模式,MQTT 協議具有很多優點,
比如能讓一個傳感器資料觸發一系列動作;
網路不穩定造成的臨時離線不會影響作業;
方便根據需求動態調整系統規模等,
這使得它能滿足絕大部分物聯網場景的需求,

輕量級協議:減少傳輸資料量

MQTT 是一個輕量級的網路協議,這一點也是它在物聯網系統中流行的重要原因,畢竟物聯網中大量的都是計算資源有限、網路帶寬低的設備,
這種“輕量級”體現在兩個方面,
一方面,MQTT 訊息采用二進制的編碼格式,而不是 HTTP 協議那樣的文本的表述方式,
這樣子做的好處就是可以充分利用位元組位,協議頭可以很緊湊,從而盡量減少需要通過網路傳輸的資料量,
比如,分析 HTTP 的一個請求抓包,它的訊息內容是下面這樣的(注意:空格和回車、換行符都是訊息的組成部分):

GET /account HTTP/1.1    <--注釋:HTTP請求行
Host: time.geekbang.com  <--注釋:以下為HTTP請求頭部
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
     <--注釋:這個空行是必須的,即使下面的請求體是空的

在 HTTP 協議傳輸的這段文本中,每個字符都要占用 1 個位元組,而如果使用 MQTT 協議,一個位元組就可以表示很多內容,下面的圖片展示了 MQTT 的固定頭的格式,這個固定頭只有 2 個位元組:

第一個位元組分成了高 4 位(4~7)和低 4 位(0~3);低 4 位是資料包標識位,其中的每一位元位又可以表示不同的含義;高 4 位是不同資料包型別的標識位,
第二個位元組表示資料包頭部和訊息體的位元組共個數,其中最高位表示有沒有第三位元組存在,來和第二個位元組一起表示位元組共個數,
如果有第三個位元組,那它的最高位表示是否有第四個位元組,來和第二個位元組、第三個位元組一起表示位元組總個數,依此類推,還可能有第四個位元組、第五個位元組,不過這個表示可變頭部和訊息體的位元組個數的部分,最多也只能到第五個位元組,所以可以表示的最大資料包長度有 256MB,
比如,一個請求建立連接的 CONNECT 型別資料包,頭部需要 14 個位元組;發布訊息的 PUBLISH 型別資料包頭部只有 2~4 個位元組,
輕量級的另一方面,體現在訊息的具體互動流程設計非常簡單,所以 MQTT 的互動訊息型別也非常少,為了方便后面的講解,我在這里整理了一個表格,總結了 MQTT 不同的資料包型別的功能和發訊息的流向,
從表格可以看出,MQTT 3.1.1 版本一共定義了 14 種資料包的型別,在第一個位元組的高 4 位中分別對應從 1 到 14 的數值,

功耗優化:節約電量和網路資源

除了讓協議足夠輕量,MQTT 協議還很注重低功耗的優化設計,這主要體現在對能耗和通信次數的優化,
比如,MQTT 協議有一個 Keepalive 機制,它的作用是,在 Client 和 Broker 的連接中斷時,讓雙方能及時發現,并重新建立 MQTT 連接,保證主題訊息的可靠傳輸,
這個機制作業的原理是:Client 和 Broker 都基于 Keepalive 確定的時間長度,來判斷一段時間內是否有訊息在雙方之間傳輸,這個 Keepalive 時間長度是在 Client 建立連接時設定的,如果超出這個時間長度,雙方沒有收到新的資料包,那么就判定連接斷開,

除了 Keepalive 機制,MQTT 5.0 中的重復主題特性也能幫助我們節省網路資源,
Client 在重復發送一個主題的訊息時,可以從第二次開始,將主題名長度設定為 0,這樣 Broker 會自動按照上次的主題來處理訊息,這種情況對傳感器設備來說十分常見,所以這個特性在作業中很有實際意義,

3 種 QoS 級別:可靠通信
除了計算資源有限、網路帶寬低,物聯網設備還經常遇到網路環境不穩定的問題,尤其是在移動通信、衛星通信這樣的場景下,比如共享單車,如果用戶已經鎖車的這個訊息,不能可靠地上傳到服務器,那么計費就會出現錯誤,結果引起用戶的抱怨,這樣怎么應對呢?
這個問題產生的背景就是不穩定的通信條件,所以 MQTT 協議設計了 3 種不同的 QoS (Quality of Service,服務質量)級別,你可以根據場景靈活選擇,在不同環境下保證通信是可靠的,
這 3 種級別分別是:
QoS 0,表示訊息最多收到一次,即訊息可能丟失,但是不會重復,
QoS 1,表示訊息至少收到一次,即訊息保證送達,但是可能重復,
QoS 2,表示訊息只會收到一次,即訊息有且只有一次,

我用一張圖展示了它們各自的特點,可以看到,QoS 0 和 QoS 1 的流程相對比較簡單;而 QoS 2 為了保證有且只有一次的可靠傳輸,流程相對復雜些,
正常情況下,QoS 2 有 PUBLISH、PUBREC、PUBREL 和 PUBCOMP 4 次互動,
至于“不正常的情況”,發送方就需要重復發送訊息,比如一段時間內沒有收到 PUBREC 訊息,就需要再次發送 PUBLISH 訊息,不過要注意,這時要把訊息中的 “重復”標識設定為 1,以便接收方能正確處理,同樣地,如果沒有收到 PUBCOMP 訊息,發送方就需要再次發送 PUBREL 訊息,

安全傳輸

說到安全傳輸,首先我們需要驗證 Client 是否有權限接入 MQTT Broker,為了控制 Client 的接入,MQTT 提供了用戶名 / 密碼的機制,在建立連接程序中,它可以通過判斷用戶名和密碼的正確性,來篩選有效連接請求,但是光靠這個機制,還不能保證網路通信程序中的資料安全,因為在明文傳輸的方式下,不止設備資料,甚至用戶名和密碼都可能被其他人從網路上截獲而導致泄漏,于是其他人就可以偽裝成合法的設備發送資料,
所以還需要通信加密技術的支持,
MQTT 協議支持 SSL/TLS 加密通信方式,采用 SSL/TLS 加密之后,MQTT 將轉換為 MQTTS,這有點類似于 HTTP 和 HTTPS 的關系,
我們只要將前面測驗的命令修改一下,將 “mqtt://” 改為 “mqtts://”,埠改為 8883,就可以用 SSL/TLS 加密通信方式連接到 Eclipse 提供的開放 Broker,
如果這個的 SSL 證書已經過期了,連接會失敗,
這里再提供另一個方式,供測驗使用)
輸入“mqtts://test.mosquitto.org:8883”,把開放 Broker 切換到這個鏈接,
鏈接: link.
從鏈接中下載一個客戶端證書,然后通過下面的命令訂閱主題訊息:

hbmqtt_sub --url mqtts://test.mosquitto.org:8883 -t /geektime/iot --ca-file ~/Downloads/mosquitto.org.crt

接著,我們再通過下面的命令測驗發布訊息:

hbmqtt_pub --url mqtts://test.mosquitto.org:8883 -t /geektime/iot -m Hello,World! --ca-file ~/Downloads/mosquitto.org.crt

最后在運行 hbmqtt_sub 命令的終端,就可以看到 Hello,World! 的訊息:

學習筆記總結自‘物聯網開發實戰’–郭朝斌
–筆記只用于學習交流,請不要用于商業用途,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260132.html

標籤:其他

上一篇:基于51單片機制作的藍牙小車

下一篇:云計算專業防火墻混合模式應用實驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more