物联网首选协议,关于MQTT你需要了解这些
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与连接,并实现稳定、可靠的网络连接。
MQTT基于发布订阅模型,支持双工通信。
MQTT可实时推送消息,但HTTP需要通过轮询获取数据更新。
MQTT是有状态的,但是HTTP是无状态的。
MQTT可从连接反常断开中恢复,HTTP无法实现此目的。
MQTT vs XMPP
MQTT协议设计简单轻量、路由灵巧,将在移动互联网、物联网消息领域,全面取代PC时代的XMPP协议。
MQTT报文体积小且编解码轻易,XMPP基于繁忙的XML,报文体积大且交互繁琐。
MQTT基于发布订阅模式,相比XMPP基于JID的点对点消息路由更为灵巧。
MQTT支持JSON、二进制等不同类型报文。XMPP摘用XML承载报文,二进制必须编码等处理。
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:消息仅传送一次。
设计了重发和重复消息发现机制,保证消息到达对方并且严厉只到达一次。
除了QoS之外,MQTT还提供了清除会话(Clean Session)机制。对于那些想要在重新连接后,收到离线期间错过的消息的客户端,可在连接时设置关闭清除会话,此时服务端将会为客户端存储订阅关系及离线消息,并在客户端再次上线后发送给客户端。
海量连接支持
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主题。
另外,部分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服务器
MQTT服务器负责接收客户端发起的连接,并将客户端发送的消息转发到另外一些符合条件的客户端。一个成熟的MQTT服务器可支持海量的客户端连接及百万级的消息吞吐,扶助物联网业务提供商专注于业务功能并快速创建一个可靠的MQTT使用。
EMQX 是一款使用广泛的大规模分布式物联网MQTT服务器。自2013年在GitHub发布开源版本以来,目前全球下载量已超千万,累计连接物联网要害设备超过1亿台。
感兴致的读者可通过如下Docker命令安装EMQX 5.0开源版进行体验。
也可直接在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协议有了初步了解。接下来,读者可探索MQTT的更多高级使用,开启MQTT使用及服务开发。