MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一个基于C/S架构的发布/订阅模式的消息传输协议

目的是在带宽和连接有限的不可靠网络的环境下发送少量数据,设计思想是轻量、开放、简单并且易于实现。

这些特性使得MQTT非常适合在受限的环境的环境中使用,比如机器对机器(M2M)通信和物联网(IoT)。

MQTT简介

MQTT发展历史如下图:

MQTT通信原理如下图:

与HTTP、SMTP等协议相比,MQTT使用二进制消息格式在客户端和代理之间进行通信。

通过使用二进制格式,MQTT可以最小化需要传输的数据量,并减少解释消息所需的处理能力。这使得MQTT非常适合在低带宽或低功耗环境中使用,例如资源(处理能力、内存和电池寿命)有限的物联网设备。

该协议的另一个重要方面是,MQTT在客户端非常容易实现。易用性是MQTT开发中的一个关键问题,这使得它非常适合资源有限的受限设备。

主要特性

消息模型

MQTT消息传递模型是基于主题(Topic)和订阅的(Subscription),客户端发布消息到指定主题或从指定主题订阅消息。

主题是分层的,由“/”分隔为多个层级,例如:toplevel/level1/level2

订阅则指的是客户端从哪些主题中接收消息。

原理是:当客户端订阅某主题时,实际上是告诉broker该客户端对发布到该主题上的消息感兴趣,然后broker监控该主题,并将发布到该主题上的任何消息转发给订阅的客户端。

客户端和主题之间是多对多的关系,即一个客户端可以订阅多个主题,一个主题可以由多个客户端订阅。

在主题和订阅之外,MQTT支持以通配符来匹配主题。通配符有两种,分别是+#

  1. +是单级通配符,只能匹配主题中的一个级别;
  2. #是多级通配符,可以匹配指定级别之后的所有级别。

服务质量QoS

MQTT支持三个服务质量(QoS)级别: QoS0、 QoS1和 QoS2。

发送方可以是客户端也可以是代理,接收方亦之

QoS0

发送方最多传递一次消息,不会等待确认,因此消息可能会丢失。通常用于可以接受消息丢失或消息不重要的情况。

QoS0适用于发送传感器数据,因为偶尔的数据丢失不会显著影响总体结果。

QoS1

发送方至少传递一次消息,会等待接收方确认,并在必要时重新发送。通常用于消息丢失是不可接受的,但消息复制是可以容忍的情况。

对于QoS1,发送方将消息发送给接收方,并等待确认。如果接收方没有在设定的时间内响应,发送方将重新发送消息。

当接收方发送确认消息失败,就会导致发送方重复发送消息,由此产生消息重复。

QoS2

  1. 发送方准确传递一次消息,会等待接收方确认(保证消息到达);
  2. 发送方通知接收方开始传递新消息,接收方回应发送方(用于确保消息不重复);
  3. 开始新消息传递。

当发送方与接收方之间确认进行下一次新消息发布之前,在此之间发送的消息都是被认为是重复消息,可以被覆盖。

通常用于消息丢失或重复完全不可接受的情况。

QoS2中,发送方和接收方参与一个两步确认过程。可用于关键消息,如金融事务或紧急警报。

QoS等级越高,消耗的资源越多,并且可能会导致延迟和网络流量增加。

持久会话和消息持久性

消息持久性可以确保在发生网络故障时消息不会丢失。

当重新建立连接后,接收方未确认的QoS1、QoS2的消息仍旧存在,并且需要被确认。

安全

MQTT支持TLS加密,用于客户端和服务器之间的安全通信。

应用场景

智能家居

MQTT可以用于连接智能家居中的各种设备,包括智能恒温器、灯泡、安全摄像头和其他设备。

这将允许用户使用移动应用程序远程控制他们的家庭设备。

工业自动化

MQTT可以用于连接工厂中的机器和传感器。

这将允许对加工过程进行实时监视和控制,从而提高效率并减少停机时间。

农业

MQTT可以用于精准监测土壤湿度水平、天气状况和作物生长。

这将有助于农民优化灌溉和其他作物的管理做法。

医疗健康

MQTT可以用于将医疗设备和传感器(如血糖仪和心率监测器)连接到医疗保健提供者。

这将允许远程监测患者,可以实时了解患者的状况并降低医疗保健成本。

交通

MQTT可以用于连接的汽车和其他交通系统,以实现对车辆的实时跟踪和监控。

这可以提高安全性,有助于优化交通流量。