Message Queuing Telemetry Transport,消息队列遥测传输,是IBM于1998年设计和开发的一种即时通信协议。MQTT是轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。关于mqtt的具体内容我们将在文章中展开。
(一)什么是MQTT
Message Queuing Telemetry Transport,消息队列遥测传输,是IBM于1998年设计和开发的一种即时通信协议。
MQTT是轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。
在2014年,MQTT成为OASIS标准协议。
(二)为什么要用MQTT
(1)低协议开销
MQTT的每消息标题可以短至 2 个字节。对于 HTTP,为每个新请求消息重新建立 HTTP 连接,会导致重大的开销。 MQTT 所使用的永久连接显著减少了这一开销。
(2)对不稳定网络的容忍
MQTT 能够从断开等故障中恢复,而且没有进一步的代码需求。但是,HTTP 无法原生地实现此目的,需要客户端重试编码,这可能增加幂等性问题。
(3)低功耗
MQTT 是专门针对低功耗目标而设计的,HTTP 的设计没有考虑此因素。
(4)数百万个连接的客户端
在 HTTP 堆栈上,维护数百万个并发连接,需要做许多的工作来提供支持。IBM 提供了 IBM MessageSight,这是一个单机架装载服务器,经过测试能处理多达 100 万个通过 MQTT 并发连接的设备。
(5)推送通知
MQTT采用订阅/发布模式,为推送而生。HTTP 只允许使用一种称为COMET 的方法,使用持久的 HTTP 请求来执行推送。从客户端和服务器的角度讲,此方法都很昂贵。
当然,MQTT也不是完美的。
(1)不支持离线消息,需要弥补设备离线以后,MQTT服务器对设备的控制信息丢失的问题。
(2)不支持点对点通信。当设备B和设备C可发送同一主题的情况下,设备A无法知道是设备B还是设备C发送的消息,也有可能消息被设备D窃听。
(3)框架繁多。不同的框架提供了不同的SDK,不同的SDK所支持的功能范围也不尽相同。例如不少框架尚不支持android,SSL。
(三)MQTT如何工作
MQTT协议所传输的信息,都需要一个Topic(主题)。
MQTT服务器被称为broker,会根据Topic来分发所接收的信息。
MQTT客户端被称为client,可以发送任意Topic,也可以接收所注册的Topic。
发送Topic消息的一方,被称为publisher。
接收Topic消息的一方,被称为Subscriber.
MQTT客户端,既可以是Subscriber,也可以同时为publisher。
对于发送的消息,MQTT可以指定发送质量。
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。