使用背景
MQTT最初是为了解决物联网(IoT)领域设备之间的低带宽、高延迟、不稳定网络连接等问题而设计的。
场景介绍
广泛应用物联网领域,数据实时传输,连接各种智能设备和应用的关键桥梁
MQTT简介和概述
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它是一种基于发布(Publish)/订阅(Subscribe )模式的消息传输协议(物联网通信协议),它工作在TCP/IP协议族上,并为低带宽、高延迟或不稳定的网络环境提供了可靠的消息传输服务。MQTT协议是基于TCP/IP协议栈构建的,可以在不同的设备和平台之间进行通信。凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山. MQTT在物联网方向的开发出现的频率非常高, 因此从事该行业方向开发有必要对其进行下系统的学习。
MQTT的主要特点是什么?
MQTT协议的主要特点是轻量级、简单、灵活和可扩展。它使用了发布/订阅的消息传递模式,这意味着消息的发送者(发布者)和接收者(订阅者)不需要直接进行连接,而是通过代理(Broker)进行消息的转发。这种设计使得MQTT非常适合于物联网场景,因为物联网中的设备通常具有不同的通信能力和需求。
● 开放消息协议,简单易实现
● 发布订阅模式,一对多消息发布
● 基于TCP/IP网络连接,提供有序,无损,双向连接。
● 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
● 消息QoS支持,可靠传输保证
注意:
1、 主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。
2、 关于Qos,需要指出的是三种消息发布质量。
QoS消息发布质量介绍
● QoS0:“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要用于普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,即使再次联网也收不到了。
● QoS1:“至少一次”,确保消息到达,但消息重复可能会发生。
● QoS2:“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
MQTT的基本原理是什么?
MQTT的基本原理是发布/订阅模式。在MQTT中,消息发布者(Publisher)将消息发布到一个主题(Topic)上,而消息订阅者(Subscriber)则订阅这个主题,当有新的消息发布到这个主题上时,订阅者将会收到这个消息。MQTT的消息传递过程如下:
● 发布者将消息发送到MQTT Broker(代理服务器)上,并指定消息发布的主题。
● 订阅者通过订阅相应的主题,向MQTT Broker注册对该主题的订阅。
● 当有新的消息发布到该主题时,MQTT Broker会将消息发送给所有订阅了该主题的订阅者。
MQTT协议使用TCP/IP协议栈进行通信,因此在使用MQTT协议时需要建立TCP连接。MQTT协议支持三种不同的服务质量级别(QoS级别),可以根据需求选择适当的级别。当消息发布者发布消息时,可以指定消息的QoS级别,用于保证消息的可靠性和传递的顺序。
MQTT协议还支持保留消息(Retained Messages)和遗嘱消息(Last Will and Testament)。保留消息是指最新的消息将一直保存在服务器上,新的订阅者可以获取最新的消息。遗嘱消息是指在客户端异常断开连接时自动发送一条消息,用于通知其他订阅者该客户端已经离线。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
● Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
● payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
网络链接
由底层传输协议提供给MQTT使用的架构
● 底层传输协议能够连通客户端和服务端
● 底层传输协议提供有序的,可靠的,双向字节流
应用消息
指通过MQTT在网络中传输的应用程序数据。 当应用消息通过MQTT传输的时候会附加上质量服务(QoS)和话题名称。
客户端
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以
● 发布, 订阅消息
● 退订和删除应用程序消息
● 断开和服务器连接
服务端
MQTT服务器被称为"消息代理"(Broker),它可以是一个应用程序或一台设备。是位于消息发布者和订阅者之间,它可以:
● 接收客户端消息
● 处理客户端订阅和退订请求
● 向订阅的客户端转发消息
主题名
指附着于应用消息的标签,服务端用它来匹配订阅。服务端给每个匹配到的客户端发送一份应用信息的拷贝。
主题过滤器
是包含在订阅里的一个表达式,用来表示一个或多个感兴趣的话题。话题过滤器可以包含通配符。
MQTT控制包
通过网络连接发送的包含一定信息的数据包。MQTT规范定义了14个不同类型的控制包,其中一个(PUBLISH包)用来传输应用信息。
发布/订阅、主题、会话
mqtt工作流程
● 客户端发送连接请求到服务器, 在服务器确认(认证)后则建立连接.
● 之后客户端则可以将消息以主题的形式 发布 到服务器 broker
● 然后其他客户端则可以 订阅 相关主题, 接收对应主题的信息(依照订阅发布模型)
● 同时消息服务器broker 会接收客户端的心跳请求并返回心跳响应, 用于监测客户端,服务器健康状况.
MQTT有什么优点?
1、轻量级
MQTT协议非常轻量级,传输的数据包头很小,通信的负载也很小,适用于各种网络环境。
2、发布/订阅模式
MQTT协议采用发布/订阅模式,可以实现多个客户端之间的消息传递。
3、QoS级别
MQTT协议支持三种不同的服务质量级别(QoS级别),可以根据需求选择适当的级别。
4、保留消息
MQTT协议支持保留消息,可以将最新的消息保留在服务器上,新的订阅者可以获取最新的消息。
5、遗嘱消息
MQTT协议支持遗嘱消息,可以在客户端异常断开连接时自动发送一条消息。
6、安全性
MQTT协议支持TLS/SSL加密,可以保证通信的安全性。
7、易于实现和部署
MQTT协议的实现和部署都非常容易,可以适用于各种物联网应用场景。
8、开放性
MQTT协议是一个开放的标准,可以与其他协议和系统进行集成。
MQTT有什么缺点?
1、可扩展性有限
MQTT协议的可扩展性有限,不适合大规模的物联网应用。
2、不支持请求/响应模式
MQTT协议不支持请求/响应模式,限制了一些应用场景。
3、不支持消息队列
MQTT协议不支持消息队列,限制了一些应用场景。
4、消息传递的延迟
由于MQTT协议的发布/订阅模式,消息传递的延迟可能会比较大,不适合实时性要求较高的应用场景。
MQTT应用领域有哪些?
传感器数据的采集和传输
许多传感器需要将采集的数据传输到服务器或其他设备中进行处理,MQTT协议可以实现数据的实时传输和管理。
智能家居
MQTT协议可以用于智能家居中各种设备之间的通信和控制,例如智能灯光、智能家电、智能安防等。
智能交通
MQTT协议可以用于智能交通系统中各个设备之间的通信和协作,例如智能导航、智能停车、智能交通灯等。
智能制造
MQTT协议可以用于智能制造中各种设备之间的通信和控制,例如智能生产线、智能仓储等。
物流和供应链
MQTT协议可以用于物流和供应链中各个环节之间的通信和协作,例如智能仓储、智能物流等。
能源管理
MQTT协议可以用于能源管理中各种设备之间的通信和控制,例如智能电网、智能能源监测等。
智慧城市
MQTT协议可以用于智慧城市的建设和管理中,例如智能路灯、智能公交、智能城市管理等。
MQTT的安全认证机制是什么?
用户名和密码认证
MQTT协议可以通过用户名和密码认证机制来确保客户端的身份。在连接MQTT Broker之前,客户端需要提供用户名和密码以进行身份验证。
SSL/TLS加密
MQTT协议可以通过SSL/TLS加密来保证通信的安全性。客户端和MQTT Broker之间的数据传输会被加密,确保数据的机密性和完整性。
X.509证书认证
MQTT协议可以通过X.509证书认证机制来确保客户端和MQTT Broker之间的身份认证和通信安全。
IP过滤
MQTT Broker可以通过IP过滤来限制客户端的访问,确保安全性和可控性。
ACL(访问控制列表)
MQTT Broker可以通过ACL机制来限制客户端的访问权限,确保数据的安全性和保密性。
防火墙
MQTT Broker可以通过防火墙来限制客户端的访问,确保网络的安全性和稳定性。
MQTT的会话和持久化机制是什么?
MQTT协议支持两种类型的会话:非持久化会话和持久化会话。
非持久化会话:当客户端连接到MQTT代理时,会创建一个非持久化会话。这种会话会在客户端断开连接时自动结束,会话中的QoS0消息也会被丢弃。
持久化会话:当客户端连接到MQTT代理时,可以选择创建一个持久化会话。这种会话会在客户端断开连接后继续存在,会话中的QoS1和QoS2消息也会被保存。客户端可以重新连接并恢复未接收的消息。
MQTT代理可以使用持久化机制来保存持久化会话的状态信息,以便在客户端重新连接时恢复会话。这通常是通过将会话状态信息保存在磁盘或数据库中实现的。