前几篇文章讲述的是TCP/IP 模型中的网络接口层、网络层、传输层、应用层部分协议,这里到了第四层应用层的 MQTT协议。都是物联网常用的应用层协议。CoAP 协议 OPC 放到之后写。

MQTT 协议

消息队列遥测传输,Message Queuing Telemetry Transport,MQTT 是ISO 标准下基于发布/订阅(Publish/Subscribe)范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。

MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。为什么,因为协议简单,开销就小;发布订阅模式,解耦了发布者和订阅者,他们不需要直接传递消息,有个中介帮忙,同样的数据,我就上传一份,再传出去一份,就想导游只说一遍,大家都带着蓝牙耳机,都能听到;持久会话,不会经常断开重连,这都耗电。

作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT 的消息发布和订阅模式,像微博一样,有一个消息发布者,有一批订阅着,有个服务器。消息发布者把消息发送到服务器,订阅者订阅消息,就能收到消息。

HTTP 基于请求响应,像微信聊天,我和你加好友,建立连接,我发消息,你接受消息。必须要建立稳定可靠的连接。

工作原理

发布者将消息发布到代理服务器,代理服务器根据订阅者的订阅情况将消息分发给相应的订阅者。

组成部分

主要包括发布者(Publisher)、订阅者(Subscriber)、代理服务器(Broker)。

发布者 Publisher:

使用MQTT的程序或设备。客户端通过网络连接到服务端。它可以发布应用消息给服务端。

服务端 Server:

一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端接受来自客户端的网络连接、接受客户端发布的应用消息、处理客户端的订阅和取消订阅请求、转发应用消息给符合条件的已订阅客户端。

订阅者 Subscriber:

订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器。

Topic(主题):

Topic具有两层含义:其一,在发布消息时,主题会与消息相关联,以此向 服务端 表明这条消息要发送至哪个主题;其二,在订阅消息时,客户端需向 服务端 表明自己对哪个主题感兴趣,一旦有消息发送给这个主题,服务端 便会将该消息发给此主题的订阅者。主题支持通配符,而对于使用通配符的主题,我们将其称作 Topic Filter。

MQTT 控制报文

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:

  • 消息类型:4位的无符号值。表示服务器到客户端的单向还是双向通信,发送消息还是订阅消息还是取消订阅消息。
  • 标识位 / DUP:Duplicate Flag,用于指示该 Publish 报文是否为重发报文。如果 DUP 标志被设置为 0,表示第一次请求发送这个 Publish 报文;如果 DUP 标志被设置为 1,表示这可能是一个早前报文请求的重发。客户端或服务器请求重发一个 Publish 报文时,必须将 DUP 标志设置为 1。
  • Qos:Quality of Service(服务质量)。它是用于消息可靠性传递的一个参数,具有 3 个取值,具体为:0:表示消息仅发送一次,不确保发送成功。1:意味着消息最少发送一次,保证发送成功,但由于可能会发送多次,所以接收方可能会收到重复消息。2:表明消息仅发送一次且保证成功,接收方不会接到重复消息。在发送消息时,可以对 QoS 进行指定,如果 QoS 大于 0,那么消息必然会被发送至 Broker。而在订阅主题时,同样也可以指定 QoS,如果 QoS 大于 0,那么 Broker 一定会将消息发送给订阅者,不会出现消息丢失的情况。
  • RET:Publish Retain Flag,发布保留标识。指示服务器是否要保留发布的消息。当RET标志位设置为1时,表示服务器要保留这次推送的信息。如果有新的订阅者出现,服务器会将保留的消息推送给它。如果没有新的订阅者,服务器会在推送至当前订阅者后释放该消息。如果RET标志位设置为0,则服务器不会保留发布的消息。
  • 剩余长度:Remaining Length,表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。
  • 可变头:位于固定头和负载之间。可变头的内容因数据包类型而异,通常包含与特定数据包类型相关的信息,例如数据包标识、主题名等。
  • 消息体:Payload,也叫有效载荷。CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体: CONNECT,消息体内容主要是,客户端的ClientID、订阅的Topic、Message以及用户名和密码。 SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。 SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。 UNSUBSCRIBE,消息体内容是要取消订阅的主题。

太枯燥了,举个例子:

特点
  • 轻量级:占用资源少,适合资源受限的设备。
  • 可靠性高:提供不同等级的服务质量保证。MQTT 协议提供了 3 种消息服务质量等级,保证了在不同的网络环境下消息传递的可靠性。
  • 低带宽需求:MQTT 的最小报文仅为 2 个字节,比 HTTP 占用更少的网络开销。
  • 稳定连接:MQTT 与 HTTP 都能使用 TCP 连接,并实现稳定、可靠的网络连接。
  • 安全双工通信:MQTT 基于发布订阅模型,HTTP 基于请求响应,因此 MQTT 支持双工通信。依赖于发布订阅模式,MQTT 允许在设备和云之间进行双向消息通信。发布订阅模式的优点在于:发布者与订阅者不需要建立直接连接,也不需要同时在线,而是由消息服务器负责所有消息的路由和分发工作。

MQTT 可实时推送消息,但 HTTP 需要通过轮询获取数据更新。

MQTT 是有状态的,但是 HTTP 是无状态的。为了应对网络不稳定的情况,MQTT 提供了心跳保活(Keep Alive)机制。在客户端与服务端长时间无消息交互的情况下,Keep Alive 保持连接不被断开,若一旦断开,客户端可即时感知并立即重连。同时,MQTT 设计了遗愿消息,让服务端在发现客户端异常下线的情况下,帮助客户端发布一条遗愿消息到指定的 MQTT 主题。

MQTT 可从连接异常断开中恢复,HTTP 无法实现此目标。

灵活性:基于服务订阅模式,消息路由更为灵活。

MQTT 协议和 HTTP 的对比:

应用

物联网:各类物联网设备之间的通信。

移动应用消息推送。

远程监控系统。

智能家居。

工业自动化等领域。

后记

这个系列,物联网协议进行到了尾声,这篇写 MQTT,下面会写 CoAP、OPC,都是重头戏。

参考文献

本文由 @跃曰 原创发布于人人都是产品经理。未经作者许可,禁止转载。

题图来自Unsplash,基于CC0协议。

该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。

友情提示

本站部分转载文章,皆来自互联网,仅供参考及分享,并不用于任何商业用途;版权归原作者所有,如涉及作品内容、版权和其他问题,请与本网联系,我们将在第一时间删除内容!

联系邮箱:1042463605@qq.com