首页 - 关于研博 - 技术笔记 - MQTT协议及5.0版本特性
MQTT协议及5.0版本特性
2024.10.22

  什么是MQTT

  MQTT 是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用 而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于物联网、移动互 联网、智能硬件、车联网、智慧城市、远程医疗、电力、石油与能源等领域。

 

  MQTT特点

  1. 简单容易实现

  2. 支持 QoS(设备网络环境复杂)

  3. 轻量且省带宽(因为那时候带宽很贵)

  4. 数据无关(不关心 Payload 数据格式)

  5. 有持续地会话感知能力(时刻知道设备是否在线)

 

  为什么 MQTT 是适用于物联网

  据 IoT Analytics 最新发布的《2022 年春季物联网状况》研究报告显示,到 2022 年,物联网市场预计 将增长 18%,达到 144 亿活跃连接。在如此大规模的物联网需求下,海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带 来了巨大的挑战。对于物联网协议来说,必须针对性地解决物联网设备通信的几个关键问题:网络环境复 杂而不可靠、内存和闪存容量小、处理器能力有限。MQTT 协议正是为了应对以上问题而创建,经过多年的发展凭借其轻量高效、可靠的消息传递、海量连接 支持、安全的双向通信等优点已成为物联网行业的首选协议 。

 

  基本概念

  完整的MQTT交互由MQTT服务器、MQTT客户端组成。

 

  MQTT服务器

  MQTT 服务器负责接收客户端发起的连接,并将客户端发送的消息转发到另外一些符合条件的客户端。一 个成熟的 MQTT 服务器可支持海量的客户端连接及百万级的消息吞吐,帮助物联网业务提供商专注于业务 功能并快速创建一个可靠的 MQTT 应用。

 

  MQTT客户端

  MQTT 应用通常需要基于 MQTT 客户端库来实现 MQTT 通信。目前,基本所有的编程语言都有成熟的开源MQTT 客户端库。可以通过编程的方式使得各类应用作为MQTT客户端。

 

 MQTT 发布/订阅模式介绍

  发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,它将发送消息的客户端(发布者)与 接收消息的客户端(订阅者)解耦,使得两者不需要建立直接的联系也不需要知道对方的存在。

  MQTT 发布/订阅模式的精髓在于由一个被称为代理(Broker)的中间角色负责所有消息的路由和分发工 作,发布者将带有主题的消息发送给代理,订阅者则向代理订阅主题来接收感兴趣的消息。

  

MQTT 发布/订阅模式有 4 个主要组成部分:发布者、订阅者、代理和主题。

  发布者(Publisher)

  负责将消息发布到主题上,发布者一次只能向一个主题发送数据,发布者发布消息时也无需关心订阅 者是否在线。

  订阅者(Subscriber)

  订阅者通过订阅主题接收消息,且可一次订阅多个主题。MQTT 还支持通过共享订阅的方式在多个订 阅者之间实现订阅的负载均衡。

  代理(Broker)

  负责接收发布者的消息,并将消息转发至符合条件的订阅者。另外,代理也需要负责处理客户端发起 的连接、断开连接、订阅、取消订阅等请求。

  主题(Topic)

  主题是 MQTT 进行消息路由的基础,它类似 URL 路径,使用斜杠 / 进行分层,比如 sensor/1/temperature。一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有订阅者;一个 主题也可以有多个发布者,代理将按照消息到达的顺序转发。

  

创建MQTT连接

  建立一个 MQTT 连接是使用 MQTT 协议进行通信的第一步。为了保证高可扩展性,在建立连接时 MQTT 协议提供了丰富的连接参数,以方便开发者能创建满足不同业务需求的物联网应用。

  本文采用TCP/IP连接方式演示。

  连接参数

 

 

  连接地址

  MQTT 的连接地址通常包含 :服务器 IP 或者域名、服务器端口、连接协议。基于 TCP 的 MQTT 连接 mqtt 是普通的 TCP 连接,端口一般为 1883。mqtts 是基于 TLS/SSL 的安全连接,端口一般为 8883。比如 mqtt://broker.emqx.io:1883 是一个基于普通 TCP 的 MQTT 连接地址。

  客户端 ID(Client ID)

  MQTT 服务器使用 Client ID 识别客户端,连接到服务器的每个客户端都必须要有唯一的 Client ID。Client ID 的长度通常为 1 至 23 个字节的 UTF-8 字符串。如果客户端使用一个重复的 Client ID 连接至服务器,将会把已使用该 Client ID 连接成功的客户端踢下 线。

  用户名与密码(Username & Password)

  MQTT 协议可以通过用户名和密码来进行相关的认证和授权,但是如果此信息未加密,则用户名和密码将 以明文方式传输。如果设置了用户名与密码认证,那么最好要使用 mqtts 或 wss 协议。大多数 MQTT 服务器默认为匿名认证,匿名认证时用户名与密码设置为空字符串即可。

  连接超时(Connect Timeout)

  连接超时时长,收到服务器连接确认前的等待时间,等待时间内未收到连接确认则为连接失败。

  保活周期(Keep Alive)

  保活周期,是一个以秒为单位的时间间隔。客户端在无报文发送时,将按 Keep Alive 设定的值定时向服务 端发送心跳报文,确保连接不被服务端断开。在连接建立成功后,如果服务器没有在 Keep Alive 的 1.5 倍时间内收到来自客户端的任何包,则会认为 和客户端之间的连接出现了问题,此时服务器便会断开和客户端的连接。

  清除会话(Clean Session)

  为 false 时表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时 注销。为 true 时表示创建一个新的临时会话,在客户端断开时,会话自动销毁。持久会话避免了客户端掉线重连后消息的丢失,并且免去了客户端连接后重复的订阅开销。这一功能在带 宽小,网络不稳定的物联网场景中非常实用。注意:持久会话恢复的前提是客户端使用固定的 Client ID 再次连接,如果 Client ID 是动态的, 那么连接成功后将会创建一个新的持久会话。服务器为持久会话保存的消息数量取决于服务器的配置,比如 EMQ 提供的免费的公共 MQTT 服务器设 置的离线消息保存时间为 5 分钟,最大消息数为 1000 条,且不保存 QoS 0 消息。

  遗嘱消息(Last Will)

  遗嘱消息是 MQTT 为那些可能出现意外断线的设备提供的将遗嘱优雅地发送给其他客户端的能力。设置了 遗嘱消息消息的 MQTT 客户端异常下线时,MQTT 服务器会发布该客户端设置的遗嘱消息。意外断线包括:因网络故障,连接被服务端关闭;设备意外掉电;设备尝试进行不被允许的操作而被 服务端关闭连接等。遗嘱消息可以看作是一个简化版的 MQTT 消息,它也包含 Topic、Payload、QoS、Retain 等信息。

  · 当设备意外断线时,遗嘱消息将被发送至遗嘱 Topic;

  · 遗嘱 Payload 是待发送的消息内容;

  · 遗嘱 QoS 与普通 MQTT 消息的 QoS 一致 ;

  · 遗嘱 Retain 为 true 时表明遗嘱消息是保留消息。MQTT 服务器会为每个主题存储最新一条保留消 息,以方便消息发布后才上线的客户端在订阅主题时仍可以接收到该消息。

 

  MQTT 5.0

  随着物联网行业的发展,应用的需求也在不断变化。为了适应这些新的需求,在 2019 年发布了 MQTT 5.0,其中加入了一些新功能。MQTT 5.0 也因此能够更好地满足现代物联网应用的复杂需求。

 

 

  MQTT 5.0 的 7 个新功能

  1. 原因代码:了解断开连接或失败原因

  MQTT5.0能够为每个确认报文提供一个原因代码,帮助我们了解断开连接或发生故障的原因。可以通过 (http://985.so/kahfq)来迅速定位问题。

  2. 会话过期间隔:管理会话的生命周期

  这个功能允许客户端指定服务器在客户端断开连接后应将会话保持多长时间。在之前的 MQTT 版本中,会话要么在断开连接后立即结束,要么无限期地保持下去。使用 MQTT 5.0,您可以指定一个具体的时间段,在断开连接后,会话仍然有效。这样可以更灵活地管理会话的生命周期,并节省服务器的资源。

  3. 主题别名:减少消息头部的开销

  MQTT 5.0 引入了主题别名,以减少消息头部的开销。在之前的版本中,每个消息都需要包含主题名称,导致数据包过大。

  使用主题别名,可以为主题分配一个简短的数字别名。这个别名可以在后续的消息中替代完整的主题名称,大大减少了 MQTT 头部的大小,从而节省了网络带宽。

  4. 用户属性:MQTT 头部中的自定义元数据

  这个功能让用户可以在 MQTT 报文的头部添加自定义的元数据。这对于需要在 MQTT 消息中携带额外信息的应用非常有用,比如消息的时间戳、设备位置或其他应用相关的数据。用户属性增加了 MQTT 消息传输的灵活性和控制力。

  5. 订阅选项:细粒度的订阅控制

  MQTT 5.0 让客户端可以指定如何接收每个订阅主题的消息。比如,客户端可以指定他们是否接收某个订阅的保留消息,或者是否接收和订阅具有相同 QoS(服务质量)级别的消息。

  6. 请求/响应:允许客户端回复指定主题

  请求/响应功能让客户端可以指定一个主题,供服务器直接回复。

  在早期的 MQTT 版本中,如果客户端想要回复一条消息,它必须把回复发布到一个主题,而原始发送者必须订阅那个主题才能收到回复。使用 MQTT 5.0 的请求/响应功能,客户端和服务器之间的通信变得更高效和简洁。

  7. 共享订阅:订阅者负载均衡功能

  这个功能让多个客户端可以共享一个订阅。当一条消息发布到一个共享主题时,服务器会把消息分发给共享订阅中的某个客户端,从而实现消息的负载均衡。

  这个功能在有多个服务实例运行,并且想要平均分配工作量的场景中非常有用。

获取相关资料
下载地址将会发送至您填写的邮箱
相关新闻
skywalking快速入门
2024-10-22
MQTT协议介绍及Java教程
2024-10-22
SpringRetry 一种优雅的重试方式
2024-10-22
  • 在线客服
  • 电话咨询
  • 微信
  • 短视频