MQTT使用說(shuō)明及EMQ-X部署

一混槐、MQTT 簡(jiǎn)介

MQTT協(xié)議(Message Queuing Telemetry Transport),叫做遙信消息隊(duì)列傳輸。 是工作在TCP/IP協(xié)議族上的一種輕量級(jí)的發(fā)布/訂閱協(xié)議阁吝,需要最小的占用空間和帶寬來(lái)連接 IoT 設(shè)備。與 HTTP 的請(qǐng)求/響應(yīng)范式不同械拍,MQTT 是事件驅(qū)動(dòng)的突勇,可以將消息推送到客戶端。這種類型的架構(gòu)將客戶端彼此解耦坷虑,以實(shí)現(xiàn)高度可擴(kuò)展的解決方案甲馋,而數(shù)據(jù)生產(chǎn)者和數(shù)據(jù)消費(fèi)者之間沒(méi)有依賴關(guān)系。

1.MQTT 的主要優(yōu)點(diǎn)

  • 開(kāi)放消息協(xié)議迄损,簡(jiǎn)單易實(shí)現(xiàn)
  • 發(fā)布訂閱模式定躏,一對(duì)多消息發(fā)布
  • 基于TCP/IP網(wǎng)絡(luò)連接
  • 1字節(jié)固定報(bào)頭,2字節(jié)心跳報(bào)文,報(bào)文結(jié)構(gòu)緊湊
  • 消息QoS支持痊远,可靠傳輸保證

2.MQTT 的基本概念

MQTT 的核心是MQTT 代理MQTT 客戶端垮抗。代理負(fù)責(zé)在發(fā)送方和合法接收方之間分發(fā)消息。MQTT 客戶端向代理發(fā)布消息拗引,其他客戶端可以訂閱該代理以接收消息借宵。每個(gè) MQTT 消息都包含一個(gè)主題》鳎客戶端向特定主題發(fā)布消息壤玫,MQTT 客戶端訂閱他們想要接收的主題。MQTT 代理使用主題和訂閱者列表將消息分派到適當(dāng)?shù)目蛻舳恕?/p>

image

MQTT傳輸?shù)南⒎譃椋褐黝}(Topic)和負(fù)載(payload)兩部分:

  • Topic哼凯,可以理解為消息的類型欲间,訂閱者訂閱(Subscribe)后,就會(huì)收到該主題的消息內(nèi)容(payload)断部;

  • payload猎贴,可以理解為消息的內(nèi)容,是指訂閱者具體要使用的內(nèi)容蝴光,最大支持256MB她渴。

MQTT 代理能夠緩沖無(wú)法分派到未連接的 MQTT 客戶端的消息。這對(duì)于網(wǎng)絡(luò)連接不可靠的情況非常有用蔑祟。為了支持可靠的消息傳遞趁耗,該協(xié)議支持 3 種不同類型的服務(wù)質(zhì)量消息:0 - 最多一次,1 - 至少一次疆虚,2 - 恰好一次苛败。

  • Qos0消息發(fā)布訂閱

    image
  • Qos1消息發(fā)布訂閱

    image
  • Qos2消息發(fā)布訂閱

    image

1)MQTT 客戶端

一個(gè)使用MQTT協(xié)議的應(yīng)用程序或者設(shè)備,它總是建立到服務(wù)器的網(wǎng)絡(luò)連接径簿。

MQTT 客戶端生命周期

  • 建立連接
    • 指定 MQTT Broker 基本信息接入地址與端口
    • 指定傳輸類型是 TCP 還是 MQTT over WebSocket
    • 如果啟用 TLS 需要選擇協(xié)議版本并攜帶相應(yīng)的的證書(shū)
    • Broker 啟用了認(rèn)證鑒權(quán)則客戶端需要攜帶相應(yīng)的 MQTT Username Password 信息
    • 配置客戶端參數(shù)如 keepalive 時(shí)長(zhǎng)罢屈、clean session 回話保留標(biāo)志位、MQTT 協(xié)議版本篇亭、遺囑消息(LWT)等
  • 訂閱主題:連接建立成功后可以訂閱主題缠捌,需要指定主題信息
    • 指定主題過(guò)濾器 Topic,訂閱的時(shí)候支持主題通配符 +# 的使用
    • 指定 QoS暗赶,根據(jù)客戶端庫(kù)和 Broker 的實(shí)現(xiàn)可選 Qos 0 1 2
    • 訂閱主題可能因?yàn)榫W(wǎng)絡(luò)問(wèn)題鄙币、Broker 端 ACL 規(guī)則限制而失敗
  • 接收消息并處理
    • 一般是在連接時(shí)指定處理函數(shù),依據(jù)客戶端庫(kù)與平臺(tái)的網(wǎng)絡(luò)編程模型不同此部分處理方式略有不同
  • 發(fā)布消息:向指定主題發(fā)布消息
    • 指定目標(biāo)主題蹂随,注意該主題不能包含通配符 +#十嘿,若主題中包含通配符可能會(huì)導(dǎo)致消息發(fā)布失敗、客戶端斷開(kāi)等情況(視 Broker 與客戶端庫(kù)實(shí)現(xiàn)方式)
    • 指定消息 QoS 級(jí)別
    • 指定消息體內(nèi)容岳锁,消息體內(nèi)容大小不能超出 Broker 設(shè)置最大消息大小
    • 指定消息 Retain 保留消息標(biāo)志位
  • 取消訂閱
    • 指定目標(biāo)主題即可
  • 斷開(kāi)連接
    • 客戶端主動(dòng)斷開(kāi)連接绩衷,服務(wù)器端將發(fā)布遺囑消息(LWT)

Client libraries

C

  • Eclipse Paho C
  • Eclipse Paho Embedded C
  • libmosquitto
  • libemqtt - an embedded C client
  • MQTT-C - A portable MQTT C client for embedded systems and PCs alike.
  • wolfMQTT - Embedded C client
  • MQTT over lwIP - MQTT C client for embedded systems using FreeRTOS, lwIP and mbedtls
  • libsmartfactory - easy to use library for different Smart Factory/Industry 4.0 technologies including a MQTT client implementation
  • libumqtt - A Lightweight and fully asynchronous MQTT client C library based on libev

C++

  • Eclipse Paho C++
  • libmosquittopp
  • Eclipse Paho Embedded C++
  • mqtt_cpp - MQTT client and server library based on C++14 and Boost.Asio. It supports MQTT v3.1.1 and v5.

Go

  • Eclipse Paho Go
  • mqtt by jeffallen
  • MQTT

Python

  • Eclipse Paho Python - originally the mosquitto Python client
  • gmqtt
  • nyamuk
  • MQTT for twisted python
  • HBMQTT
  • mqttools

2)MQTT 代理

MQTT服務(wù)器以稱為"消息代理"(Broker),可以是一個(gè)應(yīng)用程序或一臺(tái)設(shè)備。它是位于消息發(fā)布者和訂閱者之間咳燕。

MQTT代理可以:

(1)接受來(lái)自客戶的網(wǎng)絡(luò)連接勿决;

(2)接受客戶發(fā)布的應(yīng)用信息;

(3)處理來(lái)自客戶端的訂閱和退訂請(qǐng)求招盲;

(4)向訂閱的客戶轉(zhuǎn)發(fā)應(yīng)用程序消息低缩。

如果需要下載MQTT服務(wù)器,可以直接去MQTT Software下載MQTT協(xié)議衍生出來(lái)的各個(gè)不同版本曹货。

常用Servers/ Brokers

  • EMQ X

    EMQ X Broker是一個(gè)完全開(kāi)源咆繁、高擴(kuò)展、高可用的分布式 MQTT 消息代理顶籽,適用于物聯(lián)網(wǎng)玩般、M2M 和移動(dòng)應(yīng)用程序,可處理數(shù)千萬(wàn)并發(fā)客戶端礼饱。

    從 3.0 版本開(kāi)始坏为,EMQ X broker 全面支持 MQTT V5.0 協(xié)議規(guī)范,向下兼容 MQTT V3.1 和 V3.1.1镊绪,以及其他通信協(xié)議匀伏,如 MQTT-SN、CoAP蝴韭、LwM2M帘撰、WebSocket 和 STOMP。EMQ X Broker 3.0 版本可以在一個(gè)集群上擴(kuò)展到 10+ 百萬(wàn)并發(fā) MQTT 連接万皿。

  • HIVEMQ

    HiveMQ 是一個(gè) MQTT 代理,它從頭開(kāi)始構(gòu)建核行,考慮了最大的可擴(kuò)展性和企業(yè)級(jí)安全性牢硅。它帶有原生 Web 套接字支持和開(kāi)源插件 SDK,以擴(kuò)展其功能或?qū)⑵渑c其他組件集成芝雪。

  • Mosquitto

    Mosquitto 是一個(gè)開(kāi)源 MQTT 服務(wù)器减余。還提供公共托管測(cè)試服務(wù)器。

  • RabbitMQ

    RabbitMQ 是一個(gè) AMQP 消息代理惩系,帶有一個(gè)MQTT 插件位岔,還提供公共測(cè)試服務(wù)器

3)MQTT協(xié)議中的訂閱、主題堡牡、會(huì)話

  • 訂閱(Subscription)

    訂閱包含主題篩選器(Topic Filter)和最大服務(wù)質(zhì)量(QoS)抒抬。訂閱會(huì)與一個(gè)會(huì)話(Session)關(guān)聯(lián)。一個(gè)會(huì)話可以包含多個(gè)訂閱晤柄。每一個(gè)會(huì)話中的每個(gè)訂閱都有一個(gè)不同的主題篩選器擦剑。

  • 會(huì)話(Session)

    每個(gè)客戶端與服務(wù)器建立連接后就是一個(gè)會(huì)話,客戶端和服務(wù)器之間有狀態(tài)交互。會(huì)話存在于一個(gè)網(wǎng)絡(luò)之間惠勒,也可能在客戶端和服務(wù)器之間跨越多個(gè)連續(xù)的網(wǎng)絡(luò)連接赚抡。

  • 主題名(Topic Name)

    連接到一個(gè)應(yīng)用程序消息的標(biāo)簽,該標(biāo)簽與服務(wù)器的訂閱相匹配纠屋。服務(wù)器會(huì)將消息發(fā)送給訂閱所匹配標(biāo)簽的每個(gè)客戶端涂臣。

  • 主題篩選器(Topic Filter)

    一個(gè)對(duì)主題名通配符篩選器,在訂閱表達(dá)式中使用售担,表示訂閱所匹配到的多個(gè)主題赁遗。

  • 負(fù)載(Payload)

    消息訂閱者所具體接收的內(nèi)容。

4)連接方式

MQTT客戶端與代理可以基于MQTT-TCP或MQTT-WebSocket協(xié)議建立連接灼舍。

  • WebSocket協(xié)議是基于TCP的一種應(yīng)用層網(wǎng)絡(luò)協(xié)議吼和。WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)骑素。在WebSocket API中炫乓,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接献丑,并進(jìn)行雙向數(shù)據(jù)傳輸末捣。
  • WebSocket協(xié)議支持Web瀏覽器(或其他客戶端應(yīng)用程序)與Web服務(wù)器之間的交互,具有較低的開(kāi)銷(xiāo)创橄,便于實(shí)現(xiàn)客戶端與服務(wù)器的實(shí)時(shí)數(shù)據(jù)傳輸箩做。通信通過(guò)TCP端口80或443完成,這在防火墻阻止非Web網(wǎng)絡(luò)連接的環(huán)境下是有益的妥畏。
image

二邦邦、EMQ X Broker使用

1.安裝EMQ X

# 1.Shell 腳本一鍵安裝 (Linux)
wget https://repos.emqx.io/install_emqx.sh 
sudo bash install_emqx.sh

# 2.或者手動(dòng)安裝
# 安裝所需要的依賴包
$ sudo apt update && sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# 添加 EMQ X 的官方 GPG 密鑰
$ curl -fsSL https://repos.emqx.io/gpg.pub | sudo apt-key add -
# 驗(yàn)證密鑰
$ sudo apt-key fingerprint 3E640D53
pub   rsa2048 2019-04-10 [SC]
    FC84 1BA6 3775 5CA8 487B  1E3C C0B4 0946 3E64 0D53
uid           [ unknown] emqx team <support@emqx.io>
# 添加存儲(chǔ)庫(kù)
$ sudo add-apt-repository \
    "deb [arch=amd64] https://repos.emqx.io/emqx-ce/deb/ubuntu/ \
    ./$(lsb_release -cs) \
    stable"
$ sudo apt update
$ sudo apt install emqx

安裝目錄說(shuō)明

$ tree /var/lib/emqx/
/var/lib/emqx/
├── configs
│   ├── app.2021.09.16.19.06.05.config
│   ├── app.2021.09.16.20.07.27.config
│   ├── vm.2021.09.16.19.06.05.args
│   └── vm.2021.09.16.20.07.27.args
├── emqx_erl_pipes
│   └── emqx@127.0.0.1
│       ├── erlang.pipe.1.r
│       └── erlang.pipe.1.w
├── loaded_modules
├── loaded_plugins
├── mnesia
│   └── emqx@127.0.0.1
│       ├── DECISION_TAB.LOG
│       ├── emqx_activated_alarm.DCD
│       ├── emqx_activated_alarm.DCL
│       ├── emqx_banned.DCD
│       ├── emqx_deactivated_alarm.DCD
│       ├── emqx_mod_delayed.DCD
│       ├── emqx_resource.DCD
│       ├── emqx_rule.DCD
│       ├── emqx_telemetry.DCD
│       ├── emqx_telemetry.DCL
│       ├── LATEST.LOG
│       ├── mqtt_admin.DCD
│       ├── mqtt_admin.DCL
│       ├── mqtt_app.DCD
│       ├── mqtt_app.DCL
│       └── schema.DAT
├── patches
└── scripts

$ tree /usr/lib/emqx/ -L 1
/usr/lib/emqx/
├── bin
├── erts-11.1.8
├── lib
└── releases

$ tree /etc/emqx/ -L 1
/etc/emqx/
├── acl.conf        # EMQ X 默認(rèn) ACL 規(guī)則配置文件
├── certs
├── emqx.conf    # EMQ X 配置文件
├── lwm2m_xml
├── plugins     # EMQ X 擴(kuò)展插件配置文件
├── psk.txt
├── ssl_dist.conf
└── vm.args

2.使用EMQ X Broker

1)啟用EMQ X

# 直接啟動(dòng)
$ sudo emqx start
EMQ X Broker 4.3.5 is started successfully!
# 或
$ sudo systemctl start emqx

# 查看 EMQ X 的狀態(tài)
$ sudo emqx_ctl status
Node 'emqx@127.0.0.1' 4.3.5 is started

# 停止 EMQ X Broker
$ emqx stop
ok

2)EMQ X TCP服務(wù)器

基于/etc/emqx/emqx.conf可以,emqx tcp服務(wù)默認(rèn)監(jiān)聽(tīng)0.0.0.0:1883醉蚁,WebSocket服務(wù)監(jiān)聽(tīng)8083燃辖。參考詳細(xì)配置說(shuō)明

##--------------------------------------------------------------------
## MQTT/TCP - External TCP Listener for MQTT Protocol

## listener.tcp.$name is the IP address and port that the MQTT/TCP
## listener will bind.
##
## Value: IP:Port | Port
##
## Examples: 1883, 127.0.0.1:1883, ::1:1883
listener.tcp.external = 0.0.0.0:1883

##--------------------------------------------------------------------
## External WebSocket listener for MQTT protocol

## listener.ws.$name is the IP address and port that the MQTT/WebSocket
## listener will bind.
##
## Value: IP:Port | Port
##
## Examples: 8083, 127.0.0.1:8083, ::1:8083
listener.ws.external = 8083

3)Dashboard

訪問(wèn) http://localhost:18083 网棍。默認(rèn)用戶名是 admin黔龟,密碼是 public。

導(dǎo)航項(xiàng)目 說(shuō)明
MONITORING 提供了服務(wù)端與客戶端監(jiān)控信息的展示頁(yè)面
RULE ENGINE 提供了規(guī)則引擎的可視化操作頁(yè)面
MANAGEMENT 提供了擴(kuò)展插件與應(yīng)用的管理頁(yè)面
TOOLS 提供了 WebSocket 客戶端工具以及 HTTP API 速查頁(yè)面
ADMIN 提供了 Dashboard 用戶管理和顯示設(shè)置等頁(yè)面

3.EMQ X 客戶端

不同語(yǔ)言可以使用各自的的libraries來(lái)實(shí)現(xiàn)滥玷。

1)MQTT Python 客戶端

sudo pip install paho-mqtt

基于TCP連接emqx broker氏身,發(fā)布emqtt,訂閱testtopic惑畴。

import paho.mqtt.client as mqtt

# 連接成功回調(diào)
def on_connect(client, userdata, flags, rc):
    print('Connected with result code '+str(rc))
    client.subscribe('testtopic/#')

# 消息接收回調(diào)
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()

# 指定回調(diào)函數(shù)
client.on_connect = on_connect
client.on_message = on_message

# 建立連接
client.connect('broker.emqx.io', 1883, 60)
# 發(fā)布消息
client.publish('emqtt',payload='Hello World',qos=0)

client.loop_forever()

執(zhí)行

python3 emqx-test.py
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛋欣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子如贷,更是在濱河造成了極大的恐慌豁状,老刑警劉巖捉偏,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泻红,居然都是意外死亡夭禽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)谊路,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讹躯,“玉大人,你說(shuō)我怎么就攤上這事缠劝〕碧荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惨恭,是天一觀的道長(zhǎng)秉馏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脱羡,這世上最難降的妖魔是什么萝究? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮锉罐,結(jié)果婚禮上帆竹,老公的妹妹穿的比我還像新娘。我一直安慰自己脓规,他們只是感情好栽连,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著侨舆,像睡著了一般秒紧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挨下,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天噩茄,我揣著相機(jī)與錄音,去河邊找鬼复颈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沥割,可吹牛的內(nèi)容都是我干的耗啦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼机杜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帜讲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椒拗,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤似将,失蹤者是張志新(化名)和其女友劉穎获黔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體在验,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玷氏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腋舌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盏触。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖块饺,靈堂內(nèi)的尸體忽然破棺而出赞辩,到底是詐尸還是另有隱情,我是刑警寧澤授艰,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布辨嗽,位于F島的核電站,受9級(jí)特大地震影響淮腾,放射性物質(zhì)發(fā)生泄漏糟需。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一来破、第九天 我趴在偏房一處隱蔽的房頂上張望篮灼。 院中可真熱鬧,春花似錦徘禁、人聲如沸诅诱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娘荡。三九已至,卻和暖如春驶沼,著一層夾襖步出監(jiān)牢的瞬間炮沐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工回怜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留大年,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓玉雾,卻偏偏與公主長(zhǎng)得像翔试,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子复旬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • —— [1.MQTT項(xiàng)目工程](https://github.com/LiamBindle/MQTT-C) [2....
    鄭行_aover閱讀 1,574評(píng)論 0 0
  • 一垦缅、簡(jiǎn)述 MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸協(xié)議)...
    叁分醒閱讀 1,081評(píng)論 0 0
  • MQTT(Message Queuing Telemetry Transport 消息隊(duì)列遙測(cè)傳輸協(xié)議):基于發(fā)...
    海的那一邊閱讀 496評(píng)論 0 2
  • 簡(jiǎn)介 MQTT 全稱為 Message Queuing Telemetry Transport(消息隊(duì)列遙測(cè)傳輸)...
    殖民_FE閱讀 4,433評(píng)論 1 6
  • 1.創(chuàng)建一個(gè)Hero類,使用了類的簡(jiǎn)寫(xiě)語(yǔ)法 創(chuàng)建了一個(gè)構(gòu)造函數(shù)參數(shù)及其類型 聲明了一個(gè)同名的公共屬性 當(dāng)創(chuàng)建安該類...
    4440e1453363閱讀 154評(píng)論 0 0