MQTT协议入门介绍

前言

物联网曾被认为是继计算机、互联网之后,信息技术行业的第三次浪潮。随着基础通讯设施的不断完善,尤其是 5G 的出现,进一步降低了万物互联的门槛和成本。物联网本身也是 AI 和区块链应用很好的落地场景之一,各大云服务商也在纷纷上架物联网平台和服务。

物联网通讯是物联网的一个核心内容,目前物联网的通讯协议并没有一个统一的标准,比较常见的有MQTT、CoAP、DDS、XMPP 等,在这其中,MQTT(消息队列遥测传输协议)应该是应用最广泛的标准之一。目前,MQTT 已逐渐成为 IoT 领域最热门的协议,也是国内外各大物联网平台最主流的传输协议,阿里云 IoT 物联网平台很多设备都是通过 MQTT 接入。

MQTT协议介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

MQTT 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、

简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。----MQTT

协议中文版

以上这段话很好的描述了 MQTT 的全部含义,它是一种轻巧、开放、简单、规范的网络通信协议。与 HTTP 协议一样,MQTT 协议也是应用层协议,工作在 TCP/IP 四层模型中的最上层(应用层),构建于 TCP/IP协议上。MQTT 最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

如今,MQTT 成为了最受欢迎的物联网协议,已广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。目前通过 MQTT 协议连接的设备已经过亿,这些都得益于 MQTT 协议为设备提供了稳定、可靠、易用的通信基础。

MQTT 协议是为工作在低带宽、不可靠网络的远程传感器和控制设备之间的通讯而设计的协议,它具 有以下主要的几项特性:

①、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

②、基于 TCP/IP 提供网络连接。主流的 MQTT 是基于 TCP 连接进行数据推送的,但是同样也有基于 UDP 的版本,叫做 MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。

③、支持 QoS 服务质量等级。根据消息的重要性不同设置不同的服务质量等级。

④、小型传输,开销很小,协议交换最小化,以降低网络流量。这就是为什么在介绍里说它非常适合"在物联网领域,传感器与服务器的通信,信息的收集",要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了,在手机移动应用方面,MQTT 是一种不错的 Android 消息推送方案。

⑤、使用 will 遗嘱机制来通知客户端异常断线。

⑥、基于主题发布/订阅消息,对负载内容屏蔽的消息传输。

⑦、支持心跳机制。

MQTT QOS

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)中设计了保证消息稳定传输的机制,包括消息应答、存储和重传。在此机制下,提供了三种不同层次的服务质量(Quality of Service,QoS)等级:

  • QoS0,即至多一次(At most once)。这种等级下,发送方(Sender)会尽力向接收方(Receiver)发送消息,但消息的传递流程只包括一次。如果发送失败,则不会重试。这种QoS等级适用于对消息传递可靠性要求不高,但对响应速度要求较高的场景。
  • QoS1,即至少一次(At least once)。这种等级下,发送方会确保消息至少被传递一次到接收方。在某些情况下,消息可能会被多次传递。接收方可以通过消息ID或其他标识符来判断是否已经接收过某个消息,从而处理重复接收的情况。这种QoS等级适用于需要确保消息被至少传递一次的场景,但允许消息的重复传递。
  • QoS2,即确保只有一次(Exactly once)。这种等级下,发送方会确保每个消息只被传递一次到接收方。在某些情况下,消息可能会被延迟传递。接收方可以依赖某种机制(如数据库事务)来确保某个消息的处理不会重复。这种QoS等级适用于需要确保每个消息只被传递一次的场景,并且对消息的延迟传递有一定的容忍度。

不同的QoS等级为MQTT的应用提供了不同的选择和灵活性,可以根据实际需求和网络环境来选择最合适的QoS等级。需要注意的是,QoS是Sender和Receiver之间的协议,而不是Publisher和Subscriber之间的协议。

搭建MQTT服务端

使用EMQX搭建服务端,https://www.emqx.io/zh/downloads?os=Docker

github: https://github.com/emqx/emqx 12k star

搭建步骤:

  1. docker pull emqx/emqx:5.3.0
  2. 启动:docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.3.0
  3. 在晚上上述操作之后,既可以访问EMQX管理端:
    http://[ip]:18083/#/dashboard/overview
创建客户端
python 复制代码
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('ip', 1883, 600) # 600为keepalive的时间间隔
client.publish('fifa', payload='amazing', qos=0)
创建服务端
python 复制代码
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('ip', 1883, 600) # 600为keepalive的时间间隔
client.subscribe('fifa', qos=0)
client.loop_forever() # 保持连接
报文


相关推荐
橘色的喵4 天前
工业通信协议对比:OPC-UA、Modbus、MQTT、HTTP
mqtt·网络协议·http·modbus·opc-ua·工业协议
氦客7 天前
MQTT协议解析 : 物联网领域的最佳选择
物联网·mqtt·协议·解析·发布订阅模式·iot·broker
极客小张9 天前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
IT界的奇葩12 天前
MQTT+Disruptor 提高物联网高并发
java·物联网·mqtt·springboot·disruptor
香菜+14 天前
unity 中使用zeroMq和Mqtt 进行通讯
mqtt·unity·emqx·zeromq
linmoo198615 天前
java脚手架系列13-IoT
java·mqtt·iot·emqx·脚手架
青山师18 天前
Mqtt协议快速入门Demo
物联网·mqtt
昵称p22 天前
lvgl
mcu·mqtt·操作系统·lvgl·任务创建
迷途的少年1 个月前
JMeter之mqtt-jmeter 插件介绍
mqtt·jmeter
serene941 个月前
第二章:信息建模:对象和变量的类型2
物联网·mqtt·modbus·opc·opc ua·iec 104