消息队列遥测传输 (MQTT)是一种流行且轻量级的发布-订阅消息传递协议,非常适合通过互联网连接物联网 (IoT) 或机器对机器 (M2M) 设备和应用。 MQTT 旨在在低带宽或低功耗环境中高效运行,使其成为具有大量远程客户端的应用的理想选择。 它应用于各种行业,包括消费电子、汽车、运输、制造和医疗保健。

MQTT 如何工作?

通过 MQTT 连接的设备或应用称为客户端。 这些客户端发布和/或订阅有关特定主题或多个主题的消息。 订阅的客户端会接收发布到该主题的所有消息,从而实现许多设备和服务之间高效、容错的数据交换。

MQTT 架构的核心是代理。 代理是一个服务器,负责跟踪客户端(以及他们订阅的任何主题)、处理消息并将这些消息路由到适当的系统。

MQTT 协议版本

MQTT 协议的几个关键版本已被采纳为标准。 OASIS组织负责管理该协议的修订,并维护每个版本的完整规范。 MQTT 的每个修订版本都扩展了协议功能集,因此了解您的设备和代理遵循哪个版本的 MQTT 非常重要。

MQTT 消息类型和格式

MQTT 消息有多种类型,每种消息类型都包含符合要求的设备和应用必须遵循的特定格式。 MQTT 协议的修订在格式和消息类型上有所不同。 在 MQTT 协议的每个规范中都可以找到完整的消息类型列表

最常见的三种消息类型是 CONNECT、PUBLISH 和 SUBSCRIBE。 每个 MQTT 消息包含一个标头、有效负载和可选标志。 根据消息类型,有效负载的长度可以变化。 例如,在 PUBLISH 消息中,有效负载包含要发送给所有订阅设备的数据,数据字段的长度与消息的大小直接相关。  默认情况下,MQTT 设备以不安全的方式连接到端口 1883,或者在启用 SSL/TLS 加密时连接到端口 8883。

MQTT 实际运行的示例是什么?

智能汽车是 MQTT 实际应用的一个很好的例子。 随着汽车制造商添加新功能来支持从远程诊断和车队管理到燃油支付和娱乐等一切功能,MQTT 已成为联网汽车的通用标准。 与超文本传输协议 (HTTP) 不同,即使汽车进出盲区或其连接发生变化,MQTT 也可以维持持久会话。 MQTT 还支持双向通信,使汽车和云应用更容易发送和接收数据,而无需等待对方响应。

HTTP 和 MQTT 有什么区别?

HTTP 和 MQTT 都是用于通过互联网传输数据的网络协议。 让我们看看它们的区别。

HTTP

  • 请求-响应协议,其中客户端向服务器发送请求,服务器使用请求的数据进行响应。
  • 主要用于在网络服务器和浏览器之间传输网络内容(如 HTML 文档、图像和表单数据)。
  • 例子: 网络浏览器(客户端)向网络服务器发送请求,服务器以网页的形式返回数据。

消息队列传输协议

  • 发布-订阅,轻量级消息传递协议,其中客户端订阅主题并接收其他客户端发布到这些主题的消息。
  • 专为低带宽、连接稳定性和功耗是重要考虑因素的网络拓扑和设备而设计。
  • 例子: 上面的智能汽车场景。
为何在物联网 (IoT) 中使用 MQTT?

MQTT 的许多特性使其成为物联网设备(物联网中的“事物”)和后端系统之间消息传递的理想协议。 这里我们重点关注四个特点:

  • 轻量级——MQTT 的代码占用空间很小,可以在处理能力和内存有限的设备(例如传感器)中很好地运行。
  • 可靠——许多物联网设备通过蜂窝网络连接。 MQTT 是一种适用于低带宽网络的协议,该网络需要使用较少的数据来传输紧凑的消息。 即使在网络带宽有限或不稳定的情况下,这也使 MQTT 更加可靠。
  • 可扩展——发布-订阅模型可以通过添加设备和后端系统轻松扩展。 单个设备向两个独立的后端网络(订户)发布信息的一个例子是住宅智能电表,它将公用事业使用数据既发送到公用事业系统(用于计费),又发送到面向客户的应用,房主可以访问该应用程序来密切关注其住宅的能源使用情况。
  • 安全——MQTT 消息可以使用标准传输层安全性 (TLS) 加密,并支持可用于身份验证的凭据。 这使得 MQTT 成为物联网应用中的安全消息传递协议,可以处理敏感信息,例如来自各种医疗设备的健康监测读数。
MQTT 使用什么传输协议?

MQTT 支持传输控制协议/互联网协议(TCP/IP)作为其底层传输协议。 这种广泛使用的网络协议可确保客户端和代理之间可靠地发送消息。

TCP/IP 被认为可靠且高效的原因如下:

  • 错误检测和纠正——各种技术验证数据包的完整性和重传机制以恢复丢失的数据包。
  • 流量控制——数据以适合任何给定网络的最佳速率传输,防止传输延迟并促进高效通信。
  • 多路复用——可以通过单个连接发送多个数据流,因此多个应用可以同时使用同一个连接。
  • 兼容性——适用于各种设备和操作系统。
  • 可扩展性——设计用于大型复杂网络,即使处理大量流量也不会影响性能。

虽然最常见的是 TCP/IP,但它并不是传输 MQTT 消息的唯一选择。 MQTT 协议还可以通过用户数据报协议 (UDP) 和 WebSocket 运行。

其他资源

我们很荣幸能够提供以下免费资源,帮助您继续研究 NGINX 如何为基于 MQTT 的 IoT 系统提供保护、负载平衡和高可用性。

博客

文档