MQTT 协定简介
概览
MQTT 是一种基于公布 / 订阅模式的轻量级音讯传输协定,专门针对低带宽和不稳固网络环境的物联网利用而设计,能够用极少的代码为联网设施提供实时牢靠的音讯服务。MQTT 协定广泛应用于物联网、挪动互联网、智能硬件、车联网、智慧城市、近程医疗、电力、石油与能源等畛域。
MQTT 协定由 Andy Stanford-Clark(IBM)和 Arlen Nipper(Arcom,现为 Cirrus Link)于 1999 年公布。依照 Nipper 的介绍,MQTT 必须具备以下几点:
- 简略容易实现
- 反对 QoS(设施网络环境简单)
- 轻量且省带宽(因为那时候带宽很贵)
- 数据无关(不关怀 Payload 数据格式)
- 有继续地会话感知能力(时刻晓得设施是否在线)
据 Arlen Nipper 在 IBM Podcast 上的自述,MQTT 原名是 MQ TT
,留神 MQ
与 TT
之间的空格,其全称为: MQ Telemetry Transport,是九十年代晚期他在参加 Conoco Phillips 公司的一个原油管道数据采集监控零碎(pipeline SCADA system)时开发的一个实时数据传输协定。它的目标在于让传感器通过带宽无限的 VSAT,与 IBM 的 MQ Integrator 通信。因为 Nipper 是遥感和数据采集监控业余出身,所以按业内常规取了 MQ TT
这个名字。
MQTT 与其余协定比照
MQTT vs HTTP
- MQTT 的最小报文仅为 2 个字节,比 HTTP 占用更少的网络开销。
- MQTT 与 HTTP 都能应用 TCP 连贯,并实现稳固、牢靠的网络连接。
- MQTT 基于公布订阅模型,HTTP 基于申请响应,因而 MQTT 反对双工通信。
- MQTT 可实时推送音讯,但 HTTP 须要通过轮询获取数据更新。
- MQTT 是有状态的,然而 HTTP 是无状态的。
- MQTT 可从连贯异样断开中复原,HTTP 无奈实现此指标。
MQTT vs XMPP
MQTT 协定设计简略轻量、路由灵便,将在挪动互联网、物联网音讯畛域,全面取代 PC 时代的 XMPP 协定。
- MQTT 报文体积小且编解码容易,XMPP 基于沉重的 XML,报文体积大且交互繁琐。
- MQTT 基于公布订阅模式,相比 XMPP 基于 JID 的点对点音讯路由更为灵便。
- MQTT 反对 JSON、二进制等不同类型报文。XMPP 采纳 XML 承载报文,二进制必须 Base64 编码等解决。
- MQTT 通过 QoS 保障音讯牢靠传输,XMPP 主协定并未定义相似机制。
为什么 MQTT 是实用于物联网的最佳协定?
据 IoT Analytics 最新公布的《2022 年秋季物联网情况》钻研报告显示,到 2022 年,物联网市场预计将增长 18%,达到 144 亿沉闷连贯。
在如此大规模的物联网需要下,海量的设施接入和设施治理对网络带宽、通信协议以及平台服务架构都带来了微小的挑战。对于 物联网协定 来说,必须针对性地解决物联网设施通信的几个关键问题:网络环境简单而不牢靠、内存和闪存容量小、处理器能力无限。
MQTT 协定正是为了应答以上问题而创立,通过多年的倒退凭借其轻量高效、牢靠的消息传递、海量连贯反对、平安的双向通信等长处已成为物联网行业的首选协定。
轻量高效,节俭带宽
MQTT 将协定自身占用的额定耗费最小化,音讯头部最小只须要占用 2 个字节,可稳固运行在带宽受限的网络环境下。同时,MQTT 客户端只需占用十分小的硬件资源,能运行在各种资源受限的边缘端设施上。
牢靠的消息传递
MQTT 协定提供了 3 种音讯服务质量等级(Quality of Service),保障了在不同的网络环境下消息传递的可靠性。
-
QoS 0:音讯最多传递一次。
如果过后客户端不可用,则会失落该音讯。发布者发送一条音讯之后,就不再关怀它有没有发送到对方,也不设置任何重发机制。
-
QoS 1:消息传递至多 1 次。
蕴含了简略的重发机制,发布者发送音讯之后期待接收者的 ACK,如果没收到 ACK 则从新发送音讯。这种模式能保障音讯至多能达到一次,但无奈保障音讯反复。
-
QoS 2:音讯仅传送一次。
设计了重发和反复音讯发现机制,保障音讯达到对方并且严格只达到一次。
更多对于 MQTT QoS 的介绍可查看博客:MQTT QoS 服务质量介绍。
除了 QoS 之外,MQTT 还提供了革除会话机制。对于那些想要在从新连贯后,收到离线期间错过的音讯的客户端,可在连贯时设置敞开革除会话,此时服务端将会为客户端存储订阅关系及离线音讯,并在客户端再次上线后发送给客户端。
海量连贯反对
MQTT 协定从诞生之时便思考到了日益增长的海量物联网设施,得益于其优良的设计,基于 MQTT 的物联网利用及服务可轻松具备高并发、高吞吐、高可扩大能力。
连贯海量的物联网设施,离不开 MQTT 服务器的反对。目前,MQTT 服务器中反对并发连贯数最多的是 EMQX。最近公布的 EMQX 5.0 通过一个 23 节点的集群达成了 1 亿 MQTT 连贯 + 每秒 100 万音讯吞吐,这使得 EMQX 5.0 成为目前为止寰球最具扩展性的 MQTT 服务器。
平安的双向通信
依赖于公布订阅模式,MQTT 容许在设施和云之间进行双向音讯通信。公布订阅模式的长处在于:发布者与订阅者不须要建设间接连贯,也不须要同时在线,而是由音讯服务器负责所有音讯的路由和散发工作。
安全性是所有物联网利用的基石,MQTT 反对通过 TLS/SSL 确保安全的双向通信,同时 MQTT 协定中提供的客户端 ID、用户名和明码容许咱们实现应用层的身份验证和受权。
在线状态感知
为了应答网络不稳固的状况,MQTT 提供了心跳保活(Keep Alive)机制。在客户端与服务端长时间无音讯交互的状况下,Keep Alive 放弃连贯不被断开,若一旦断开,客户端可即时感知并立刻重连。
同时,MQTT 设计了遗愿(Last Will)音讯,让服务端在发现客户端异样下线的状况下,帮忙客户端公布一条遗愿音讯到指定的主题。
另外,局部 MQTT 服务器如 EMQX 也提供了高低线事件告诉性能,当后端服务订阅了特定主题后,即可收到所有客户端的高低线事件,这样有助于后端服务对立解决客户端的高低线事件。
MQTT 5.0 与 3.1.1
在 MQTT 3.1.1 公布并成为 OASIS 规范的四年后,MQTT 5.0 正式公布。这是一次重大的改良和降级,它的目标不仅仅是满足现阶段的行业需要,更是为行业将来的倒退变动做了短缺的筹备。
MQTT 5.0 在 3.1.1 版本根底上减少了会话 / 音讯延时、起因码、主题别名、用户属性、共享订阅等更加合乎古代物联网利用需要的个性,进步了大型零碎的性能、稳定性与可扩展性。目前,MQTT 5.0 已成为绝大多数物联网企业的首选协定,咱们倡议首次接触 MQTT 的开发者间接应用该版本。
如果您曾经对 MQTT 5.0 产生了一些趣味,想理解更多,您能够尝试浏览 MQTT 5.0 摸索系列文章,该系列文章将以通俗易懂的形式为您介绍 MQTT 5.0 的重要个性。
MQTT 服务器
MQTT 服务器负责接管客户端发动的连贯,并将客户端发送的音讯转发到另外一些符合条件的客户端。一个成熟的 MQTT 服务器可反对海量的客户端连贯及百万级的音讯吞吐,帮忙物联网业务提供商专一于业务性能并疾速创立一个牢靠的 MQTT 利用。
EMQX 是一款利用宽泛的大规模分布式物联网 MQTT 服务器。自 2013 年在 GitHub 公布开源版本以来,目前寰球下载量已超千万,累计连贯物联网关键设备超过 1 亿台。
感兴趣的读者可通过如下 Docker 命令装置 EMQX 5.0 开源版进行体验。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
也可间接在 EMQX Cloud 上创立齐全托管的 MQTT 服务。
MQTT 客户端
MQTT 利用通常须要基于 MQTT 客户端库来实现 MQTT 通信。目前,根本所有的编程语言都有成熟的开源 MQTT 客户端库,读者可参考 EMQ 整顿的 MQTT 客户端库大全抉择一个适合的客户端库来构建满足本身业务需要的 MQTT 客户端。也可间接拜访 EMQ 提供的 MQTT 客户端编程系列博客,学习如何在 Java、Python、PHP、Node.js 等编程语言中应用 MQTT。
MQTT 利用开发还离不开 MQTT 测试工具的反对,一款易用且功能强大的 MQTT 测试工具可帮忙开发者缩短开发周期,创立一个稳固的物联网利用。
MQTT X 是一款开源的跨平台桌面客户端,它简略易用且提供全面的 MQTT 5.0 性能、个性测试,可运行在 macOS, Linux 和 Windows 上。同时,它还提供了命令行及浏览器版本,满足不同场景下的 MQTT 测试需要。感兴趣的读者可拜访 MQTT X 官网进行下载试用:https://mqttx.app/zh。
疾速体验 MQTT
至此,置信读者已对 MQTT 协定有了初步理解。接下来,读者可拜访博客 MQTT 协定疾速体验理解如何开始应用 MQTT,或查看 EMQ 提供的 MQTT 入门与进阶系列文章理解 MQTT 协定相干个性,摸索 MQTT 的更多高级利用,开启 MQTT 利用及服务开发。
版权申明:本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/what-is-the-mqtt-protocol