首页 > 其他分享 >详解MQTT(Message Queuing Telemetry Transport)通信机制

详解MQTT(Message Queuing Telemetry Transport)通信机制

时间:2024-03-31 09:29:50浏览次数:20  
标签:订阅 主题 Telemetry Broker Queuing MQTT Client 消息

目录

概述

1 认识MQTT

1.1 MQTT的定义

1.2 MQTT实现原理

1.3 MQTT架构的几个概念

1.3.1 MQTT Broker

1.3.2 MQTT Client

1.3.3 发布消息

1.3.4 订阅消息

2 认识MQTT报文结构

2.1 MQTT消息体结构

2.1.1 认识主题(Topic)

2.1.2 认识QoS(Quality of Service levels)

2.1.3 保留标志(retained)

2.2 MQTT心跳包

2.3 MQTT遗嘱机制

2.4 MQTT 用户认证

3 体验MQTT


概述

本文详细介绍了MQTT相关的概念,报文结构内容。还详细对MQTT Message的消息结构体的内容进行分析,介绍每一个参数的具体含义和用法。最后使用EMQX和MQTT.fx工具搭建了一个MQTT工作机制的测试平台,便于深入体验和理解MQTT的运行原理。

1 认识MQTT

MQTT详细协议文档,参看:

https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718061

1.1 MQTT的定义

MQTT(Message Queuing Telemetry Transport) 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。

下表总结一些MQTT协议的特点:

特点描述
实现方式客户端-服务器的消息发布/订阅传输协议,可实现一对多的消息发布
复杂程度MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。 在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)
版本信息MQTT3.1.1 和 MQTT5
QoS 服务质量等级根据消息的重要性不同设置不同的服务质量等级
资源消耗小型传输, 开销很小,协议交换最小化,以降低网络流量。

1.2 MQTT实现原理

MQTT 是一种基于Client------Server架构的消息传输协议,所以,在 MQTT 协议通信中,所有的Client必须经过Server才能进行通信。其基本架构如图一所示,对Broker而言,所有Client的地位都是平等的,其发布或者订阅消息,必须经过MQTT Broker处理,才能实现。

                                                               图一 MQTT通信架构图

1.3 MQTT架构的几个概念

1.3.1 MQTT Broker

MQTT Broker是一种消息传递代理服务器,它实现了MQTT协议并提供了消息传递的功能。

MQTT Broker主要有以下几个功能和特点:

  1. 发布/订阅模式:MQTT Broker支持发布者(publishers)将消息发布到特定的主题(topics),订阅者(subscribers)可以订阅特定的主题来接收消息。这种发布/订阅模式使得消息传递更加灵活和可扩展。

  2. 轻量级:MQTT Broker的协议设计非常轻量级,占用的带宽和资源较少。这使得MQTT Broker非常适合在资源受限的设备和网络条件下使用,如物联网设备和低带宽网络等。

  3. 可靠性:MQTT Broker提供了一些可靠性保证机制,如QoS(Quality of Service)等级。QoS级别分为0、1和2三个级别,提供了不同的消息传递保证和可靠性。

  4. 扩展性:MQTT Broker可以支持大量的发布者和订阅者,并且支持多种不同的消息传递场景。通过合理的架构设计和配置,可以实现高可扩展性和高并发性。

  5. 安全性:MQTT Broker支持基于用户名和密码的身份验证,以及TLS/SSL等加密通信方式,保证消息传递的安全性。

  6. 灵活性:MQTT Broker可以与其他系统和服务进行集成,如消息队列、数据库和Web应用等。这使得MQTT Broker在各种应用场景中都能灵活使用。

1.3.2 MQTT Client

MQTT Client是一种实现了MQTT协议的客户端库或软件,用于连接MQTT代理(也称为MQTT服务器)并进行发布和订阅消息的操作。MQTT Client可以是嵌入式设备上的软件库,也可以是计算机或移动设备上的独立应用程序。

MQTT Client提供了许多功能和接口,使开发人员可以轻松地使用MQTT协议进行通信。一般来说,MQTT Client具有以下主要功能:

  1. 连接管理:MQTT Client可以与MQTT代理建立稳定的网络连接并维持心跳保持活动状态。

  2. 认证和安全性:MQTT Client可以提供认证机制,确保只有经过授权的设备可以连接和发送消息。同时,它还可以支持加密传输,保护消息的机密性。

  3. 发布和订阅消息:MQTT Client可以发布消息到指定主题(Topic)或订阅特定主题来接收消息。它可以支持不同的消息质量等级,如最多一次、至少一次和只有一次。

  4. 消息保留:MQTT Client可以选择将消息保留在服务器上,以便新的订阅者能够获取最新的消息。

  5. 遗嘱消息:MQTT Client可以设置一个遗嘱消息,以便在连接异常断开时,代理可以将该消息发送给所有订阅者。

  6. QoS级别:MQTT Client可以选择消息的传输质量等级(Quality of Service),以确保可靠的消息传递。

  7. 异步通信:MQTT Client可以使用异步机制来处理消息,以避免阻塞主线程。

1.3.3 发布消息

MQTT采用发布-订阅模式,其中消息的发布方被称为发布者,而消息的接收方被称为订阅者。

要发布消息到MQTT中,首先需要连接到MQTT代理(broker)。连接时需要提供代理的地址和端口号,并且可以选择是否使用安全连接(例如使用TLS/SSL)。

连接成功后,发布者可以选择一个主题(topic)来发布消息。主题是消息的分类标签,订阅者可以根据主题来过滤接收到的消息。发布者可以将消息内容以及主题信息发送给MQTT代理,代理负责将消息传递给订阅了该主题的订阅者。

发布消息的具体步骤如下:

  1. 建立与MQTT代理的连接。

  2. 发布者选择一个主题。

  3. 发布者确定消息的质量等级。

  4. 发布者将消息内容和主题信息发送给MQTT代理。

  5. MQTT代理负责将消息传递给订阅了该主题的订阅者。

通过发布消息,可以实现设备之间的实时通信和数据传输,使得物联网设备的集成和交互更加灵活和可靠。

1.3.4 订阅消息

在MQTT中,设备可以通过订阅主题来接收消息。订阅主题类似于消息的分类,每个主题可以有多个订阅者。当有新的消息发布到主题时,所有订阅了该主题的设备都会收到相应的消息。

设备订阅消息的过程如下:

  1. 设备连接到MQTT代理服务器。

  2. 设备发送订阅请求,指定要订阅的主题。

  3. MQTT代理服务器确认订阅请求,并记录设备与主题之间的关系。

  4. 当有新消息发布到设备订阅的主题时,MQTT代理服务器将消息发送给所有订阅该主题的设备。

  5. 设备接收到消息,并进行相应的处理。

通过MQTT订阅消息,设备可以实时获取感兴趣的数据,并根据需要进行相应的操作。这种发布-订阅模式使得设备之间的通信更加灵活和高效,适用于各种物联网应用场景。

2 认识MQTT报文结构

2.1 MQTT消息体结构

MQTT发布一则消息,需要如下内容,如图二所示

功能内容注释
主题(Topic)switchMQTT发布Message必须指定一个“主题”
消息体(Payload){ "switch": false }主题(Topic)下的消息内容
服务质量等级(QoS)QoS0可选择QoS0、QoS1、QoS2
保留标志(retained)DisableBroker上是否保留消息

                                                                    图二 发布消息体内容

2.1.1 认识主题(Topic)

  • 主题的一般范例

Topic就是代表某种含义的一串字符,例如: "humidity", "lux_value","relay-1"。编写Topic必须注意如下规范:

1)主题是区分大小写的

2)主题可以使用空格

3)使用英文主题

  • 主题分级

MQTT协议为了更好的对主题进行管理和分类,支持主题分级,对主题进行分级处理,各个级别之间使用" / "符号 进行分隔。 举个例子:

"fac/tsb/rly/state"

在以上示例中一共有四级主题,分别是第 1 级 fac、第 2 级 tsb、第三级 rly、第 4 级 state。

  • 通配符

当客户端订阅主题时,可以使用通配符同时订阅多个主题。通配符只能在订阅主题时使用,下面我们将 介绍两种通配符:单级通配符和多级通配符。

通配符说明范例
+单级通配符可以匹配任意一个主题级别, 注意是一个主题级别fac/tsb/+/state 可以匹配: fac/tsb/rly-1/state fac/tsb/rly-2/state fac/tsb/rly-3/state
#多级通配符自然是可以匹配任意数量个主题级别, 而不再是单一主题级别fac/tsb/# 可以匹配: fac/tsb/rly-1/state fac/tsb/humidity/value fac/tsb/fun/state

2.1.2 认识QoS(Quality of Service levels)

MQTT 设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同级别的 QoS(Quality of Service) ,也就是 MQTT 协议有三种服务质量等级:

QoS值描述
0MQTT 服务端和客户端不会对消息传输是否成功进行确认和检查。消息能否成功 传输全看网络环境是否稳定。
1发送端在消息发送完成后,会检查接收端是否已经成功接收到了消息。发送端向接收端发送 PUBLISH 报文,当接收端收到 PUBLISH 报文后会向发送端回复一个 PUBACK 报 文, 如果发送端收到 PUBACK 报文,那么它就知道消息已经被接收端成功接收
2MQTT 协议可以确保接收端只接收一次消息

为了更好的理解 QoS,下面通过3张图来描述其工作流程:

1)QoS = 0

2)QoS = 1

3)QoS = 2

MQTT 服务质量最高级是 2 级,即 QoS=2。当 MQTT 服务质量为 2 级时, MQTT 协议可以确保接收端只接收一次消息。 为了确保接收端只接收到一次消息, PUBLISH 报文的收发过程相对更加复杂 ,其具体步骤如下:

执行Step完成的任务
1publiser向subscriber发送 报文
2subscriber接收到 PUBLISH 报文后,向publiser回复一个 PUBREC 报文
3publiser收到 PUBREC 报文后,会再次向subscriber发送 PUBREL 报文
4subscriber接收到 PUBREL 报文后,会再次向publiser回复一个 PUBCOMP 报文。 如果publiser接收到 PUBCOMP 报文表示消息传输成功,它确认subscriber已经成功接收到消息

2.1.3 保留标志(retained)

MQTT Broker对MQTT Client发布的消息进行保留,如果有其它MQTT Client订阅了该消息对应的主题时,MQTT Broker会立即将保留消息推送给subscriber, 而不必等到publiser向主题发布新消息时subscriber才会收到消息。

现在使用以MQTT.fx作为MQTT Client, 连接EMQX ( MQTT Broker )

使能Retained后,发布一个switch消息,在EMQX 上可以看见保留消息面板存在 topic为switch的消息

2.2 MQTT心跳包

MQTT Client在没有向MQTT Broker发送消息的空闲时间里,定时向MQTT Broker发送一个心跳包, 这个心跳包被称为心跳请求,其实质就是向MQTT Broker发送一个 PINGREQ 报文;当MQTT Broker收到PINGREQ 报文后就知道该MQTT Client依然在线,然后向MQTT Client回复一个 PINGRESP 报文,称为心跳响应。

登录到EMQX服务器上,可以看见每个Client 都有心跳时间。

2.3 MQTT遗嘱机制

客户端断开与服务端的连接通常是有两种方式的:

断开方式描述
主动断开连接Client主动向Broker发送 DISCONNECT 报文,请求断开连接,
异常断开连接Client意外掉线。被动与Broker断开了连接。

MQTT 协议允许Client在“Onlive”状态写好遗嘱,一旦Client意外断线,Broker就可以将Client的遗嘱消息广播出去。下面总结遗属Message被广播的步骤:

step - 1: Client在“Onlive”状态写好遗嘱messge

step - 2: Client意外原因断开与Broker连接

step - 3:Broker监测到Client断开连接,Broker广播遗嘱messge给subcriber

遗属Message的消息体如下:

内容说明
willTopic遗嘱主题
willMessage遗嘱消息
willRetain遗嘱消息的保留标志
willQoS遗嘱消息的 QoS

2.4 MQTT 用户认证

MQTT Client 的用户名和密码是连接MQTT Broker的重要参数,其主要用于Broker可以方便的管理每个Client。登录EMQX服务器,可以看见,使能 password_based 功能后,所有的Client连接该Broker必须输入正确的用户名和密码才能登录。

3 体验MQTT

现在使用EMQX搭建一个MQTT Broker,并创建3个user,使用MQTT.fx连接MQTT Broker实现数据数据发布和订阅功能。

Step-1: 登录EMQX创建3个Client

Step-2:使用MQTT.fx模拟3个Client登录该MQTT Broker

Step-3:

实现功能:

mqtt_user1发布消息:

{
    "switch": false
}

mqtt_user2和mqtt_ubuntu_user订阅这个消息

1) mqtt_user1发布消息

2)mqtt_user2和mqtt_ubuntu_user订阅这个消息

查看订阅消息的内容,其和mqtt_user1发送的消息一致

标签:订阅,主题,Telemetry,Broker,Queuing,MQTT,Client,消息
From: https://blog.csdn.net/mftang/article/details/136718381

相关文章

  • centos7 mosquitto (MQTT)安装/配置/自启动
    **************************************************************windows:>>一、安装及配置mosquitto1.下载并安装mosquitto(官网下载地址https://mosquitto.org/download/)>安装完成后进入安装目录1).编辑mosquitto.conf文件.注意系统防火墙得允许tcp1883端口#设......
  • TTN MQTT数据订阅与发布
    一、MQTT客户端设置mqtt客户端使用mqtt.fx,也可以使用其他的客户端。打开后的主页面如下:地址和端口配置mqtt.fx的具体操作可以参考MQTT.fx使用详解二、订阅、发布订阅发布topic的格式需要参照MQTTClients需要注意的是下发数据的格式是BASE64。可以使用在线工具......
  • MQTT.FX 连接AWS IoT Core 测试
    登录AWS->服务->物联网->IoTCore           登录IoTCore->所有设备物品->创建物品创建物品->下一步下载五个文件:2,3,4导导入MQTT.FX设置的SSL/TLS总对应的2,3,4位置.打开MQTT.FX设置连接成功,enjoy!!!!......
  • Linux环境下使用Eclipse Paho C 实现(MQTT Client)同步模式发布和订阅Message
    目录概述1同步模式和异步模式1.1同步模式1.2异步模式2下载和安装paho.mqtt.c3同步方式发布和订阅消息功能实现3.1MQTTClient参数配置3.2初始化MQTTClient3.3发布消息功能3.4订阅消息功能3.5解析订阅的信息4编译和测试4.1编译代码4.2运行5验证MQ......
  • MQTT概念篇
    MQTT(MessageQueuingTelemetryTransport)本篇文章是基于MQTT5.0版本编写,部分特性在3.1和3.1.1等版本中可能未启用。MQTT是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传......
  • pycharm中怎么使用不同版本的包,如(paho-mqtt)
    在PyCharm中使用低版本的paho-mqtt库与在其他Python环境中使用它的方式相同。首先,你需要知道你想要使用的paho-mqtt的具体版本号,然后通过pip安装该特定版本。以下是如何在PyCharm中安装和使用低版本paho-mqtt的步骤:打开PyCharm并打开你的项目。在PyCharm的底部,有一个名为"Te......
  • 020_若依框架集成MQTT
    目录什么是MQTT什么是EMQMQTTX下载使用下载使用若依集成MQTT拉取若依单应用版本pom.xml导入mqtt依赖yml文件配置mqtt拷贝mqtt相关代码MqttConfigPushCallbackMqttPushClient测试订阅接收消息测试发布消息订阅接收消息存入数据库什么是MQTTMQTT_百度百科什么是EMQEMQX_百度......
  • 2-使用Rabbit MQ配置mqtt服务
    安装RabbitMQ开放端口15672,5672,25672,61613,1883应该可以只开放15672,1883和5672#15672:web管理界面5672:消费者访问的端口61613、1883:内部通信5672:通信口#查看是否开放udolsof-i:XXX或者拉取并创建容器一起完成dockerrun-d--namerabbit-eRABBITMQ_DEFAU......
  • 使用MQTT.fx和自定义Client(Ubuntu上实现)测试MQTT服务器(EMQX )
    目录概述1配置EMQX做MQTT服务器1.1登录EMQX1.2配置EMQX1.2.1配置客户端认证1.2.2创建用户2测试MQTT服务器2.1配置MQTT.fx工具2.2连接MQTT服务器3使用MQTT.fx发布和订阅信息3.1在MQTT.fx上发布信息3.2在MQTT.fx上订阅信息4Ubuntu上实现MQTTClient4......
  • Observability:使用 Elastic AI Assistant 和 APM 分析 OpenTelemetry 应用程序
    作者:来自Elastic BahubaliShettiOpenTelemetry正在迅速成为云原生计算基金会(CNCF)内最广泛的项目,拥有与Kubernetes一样多的提交,并获得了客户的广泛支持。许多公司正在采用OpenTelemetry并将其集成到他们的应用程序中。Elastic®提供了有关为应用程序实施OpenT......