0%

【计算机网络】mqtt 通信协议入门(〇)概述

和 http、smtp 等协议一样,mqtt 也是一种应用层协议,也是基于 TCP 和 IP 协议进行网络通信的,主要应用在物联网领域。最近开发的项目使用到了 mqtt 协议,而且笔者打算在 Linux 下开发一个简陋的 mqtt 通信库,后续甚至可以写一个 mqtt 服务器,借此来复习下 Linux 中的应用层开发。这篇文章先来简单的介绍一下 mqtt 中的关键术语以及客户端-服务器的通信过程。

重复造轮子?

大多数开发人员已经熟悉 HTTP Web 服务。那么为什么不让 IoT 设备连接到 Web 服务?设备可采用 HTTP 请求的形式发送其数据,并采用 HTTP 响应的形式从系统接收更新。这种请求和响应模式存在一些严重的局限性:

  • HTTP 是一种同步协议客户端需要等待服务器响应,大量设备同时请求并等待会导致服务器压力巨大,。Web 浏览器具有这样的要求,但它的代价是牺牲了可伸缩性。在 IoT 领域,大量设备以及很可能不可靠或高延迟的网络使得同步通信成为问题。异步消息协议更适合 IoT 应用程序。 传感器发送读数,让网络确定将其传送到目标设备和服务的最佳路线和时间。

  • HTTP 是单向的。客户端必须发起连接,而无法直接接收网络命令。在 IoT 应用程序中,设备或传感器通常是客户端,如果使用 http 协议,这意味着它们无法被动地接收来自网络的命令。

  • HTTP 是一种 1对1 协议,将消息传送到网络上所有设备很困难。客户端发出请求,服务器进行响应。将消息传送到网络上的所有设备上,不但很困难,而且成本很高,而这是 IoT 应用程序中的一种常见使用情况。

  • HTTP 是一种有许多报头和规则的重量级协议。它不适合受限的网络。

那么,MQTT 为什么如此轻量且灵活?

因为MQTT 协议的一个关键特性是发布和订阅模型。与所有消息协议一样,它将数据的发布者与使用者分离。

下面是一个典型的 mqtt 协议网络拓扑:

image-20240713160650737

角色

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者

客户端 Client

使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以

  • 1)建立连接(connect )到服务器端。

  • 2) 发布(publish)主题应用消息给其它相关的客户端。

  • 3) 订阅(subscribe)主题以请求接受相关的应用消息

  • 4) 取消订阅(unsubscribe)以移除接受应用消息的请求。

  • 5) 从服务端断开连接(disconnect)。

服务端 Server

一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端可以

  • 1) 接受来自客户端的网络连接
  • 2) 接受客户端发布的应用消息
  • 3) 处理客户端的订阅和取消订阅请求。
  • 4) 转发应用消息给符合条件的客户端订阅。

通信流程

  • 1) 启动服务器代理。
  • 2) 订阅者向服务器代理订阅相关主题。
  • 3) 发布者向服务器代理发布主题信息。
  • 4) 服务器代理像所有订阅该主题的订阅者推送消息。

术语

应用消息 Application Message

MQTT 协议通过网络传输应用数据。应用消息通过 MQTT 传输时,它们关联服务质量(QoS)和主题(Topic)

主题 Topic

附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。

会话(Session)

客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。

服务质量等级 (QoS)

MQTT 按照服务质量 (QoS) 等级分发应用消息,客户端和服务端既可以是发送者也可以是接收者,而且分发规则只关注从单个发送者到单个接收者的应用消息。

  • QoS0:最多分发一次,接收者不会发送响应,发送者也不会重试。消息可能送达一次也可能根本没送达。

  • QoS1:服务质量确保消息至少送达一次,接收者会发送响应 ACK,发送者会重试未确认的报文

  • QoS2:消息丢失和重复都是不可接受的。使用这个服务质量等级会有额外的开销。

后续学习中我们会再继续深入学习服务质量等级

主题过滤器(Topic Filter)

订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符

订阅(Subscription)

订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话

(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器。

控制报文(MQTT Control Packet)

通过网络连接发送的信息数据包。MQTT 规范定义了十四种不同类型的控制报文,其中一个(PUBLISH 报

文)用于传输应用消息。

参考资料: