MQTT协议(Message Queuing Telemetry Transport消息队列遥测传输)

目录

一、基本概念

客户端(Client)

服务器(Broker)

主题(Topic)

主题过滤器(topic filter)

会话(Session)

订阅(Subscription)

二、连接建立

三、消息发布与订阅

发布消息:

订阅消息:

四、服务质量(QoS)级别

QoS 0 - 至多一次(At most once):

QoS 1 - 至少一次(At least once):

QoS 2 - 只有一次(Exactly once):

五、心跳机制


一、基本概念

客户端(Client)

  • 可以是移动设备、电脑、传感器等各种能够发送和接收网络数据的实体。
  • 既可以作为消息的发布者,将数据发布到特定的主题;也可以作为订阅者,订阅感兴趣的主题以接收相关消息。

服务器(Broker)

  • 通常是一个运行在云端或本地的服务器程序。
  • 其主要职责是接收来自客户端的连接请求,处理客户端的登录认证,存储客户端的订阅信息,以及根据订阅信息转发发布者发布的消息。

主题(Topic)

  • 是一个用于标识消息类型的字符串。
  • 采用分层结构,通过斜杠“/”分隔不同的层级,例如“sensor/temperature/room1”,这样的结构方便对不同类型和来源的消息进行分类和管理。

主题过滤器(topic filter)

  • 是对主题名的通配符筛选器,在订阅表达式中使用,表示可以订阅匹配到的多个主题。
  • 例如,“+/temperature”可以匹配“sensor/1/temperature”、“sensor/2/temperature”等主题。
  • 通配符包括单层通配符“+”(用于单个主题层级匹配)和多层通配符“#”(用于匹配主题中任意层级),但通配符只能用于订阅,不能用于发布。

会话(Session

  • 每个客户端与服务器建立连接后就形成一个会话,客户端和服务器之间存在状态交互。
  • 会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。即使客户端离线后重新连接,会话的相关信息仍可被服务器保留,以便继续之前的通信状态,例如 QoS 级别、未收到的消息等。

订阅(Subscription

  • 订阅包含主题筛选器(topic filter)和最大服务质量(QoS)。
  • 订阅会与一个会话(session)关联,一个会话可以包含多个订阅,且每一个会话中的每个订阅都有一个不同的主题筛选器。
  • 客户端通过订阅特定的主题来接收感兴趣的消息。

在 MQTT 中,消息的发布者和订阅者通过主题进行解耦,发布者无需知道具体的订阅者是谁,只需将消息发布到相应的主题上;而订阅者通过订阅感兴趣的主题来接收消息。这种模式提供了一对多的消息发布方式,使得消息的传递更加灵活和高效。同时,通过设置不同的服务质量等级,可以满足不同场景对消息可靠性和传输效率的要求。

二、连接建立

1. 客户端首先与服务器建立 TCP 连接。这是 MQTT 协议进行通信的基础,确保数据传输的可靠性。
2. 成功建立 TCP 连接后,客户端向服务器发送 CONNECT 数据包。这个数据包包含了以下重要信息:

  • 客户端标识符(Client Identifier):用于在服务器端唯一标识一个客户端。
  • 用户名(Username)和密码(Password)(可选):用于服务器对客户端的认证。
  • 遗嘱消息(Will Message)(可选):当客户端异常断开连接时,服务器会按照预先设置的遗嘱消息进行处理,例如通知其他客户端该客户端已离线。
  • 保持连接时间(Keep Alive):指定客户端与服务器之间发送心跳包的间隔时间,以维持连接的活性。

3. 服务端接收与处理:服务端接收到 CONNECT 报文后,会进行身份认证和权限验证,确认客户端的身份和权限信息。
4. 发送 CONNACK 报文:如果验证通过,服务端会回复 CONNACK 报文给客户端。CONNACK 报文携带了服务端的回应代码,指示了 CONNECT 请求的处理结果,同时表明是否可继续后续的通信过程。若客户端在合理的时间内没有收到服务端的 CONNACK 报文,通常应该关闭网络连接。合理的时间取决于应用的类型和通信基础设施。
5. 心跳机制(可选):连接建立后,为了维持连接的活跃状态,MQTT 协议通常使用心跳机制。客户端会定期发送 PINGREQ 报文,服务端回复 PINGRESP 报文。心跳间隔通常由客户端在 CONNECT 报文中指定。
 
一旦连接建立成功,客户端和服务端之间就可以进行主题的订阅、消息的发布等后续操作了。
 
在连接过程中,客户端发送的第一个报文必须是 CONNECT 报文,且在一个网络连接上只能发送一次。如果服务端收到第二个 CONNECT 报文,会将其当作协议违规处理并断开客户端的连接。
 
另外,若 MQTT 环境配置了安全机制,如要求认证,客户端需要提供正确的用户名和密码才能通过认证。还可以使用 TLS/SSL 协议为连接通道加密,保障数据传输的安全性。
 
连接建立后,客户端可以发布其他客户端可能会订阅的信息、订阅其他客户端发布的消息、退订或删除应用程序的消息,以及在需要时断开与服务器的连接。如果网络连接中断,MQTT 协议通常支持断线重连的处理机制,客户端能够在连接中断后自动重新尝试建立连接。

三、消息发布与订阅

发布消息:

  • 当客户端想要发布一条消息时,它会向服务器发送 PUBLISH 数据包。
  • PUBLISH 数据包包含主题、消息内容以及服务质量(QoS)级别等信息。
  • 服务器接收到发布的消息后,根据之前存储的订阅信息,将消息转发给所有订阅了该主题的

订阅消息:

  • 客户端如果想要接收特定主题的消息,需要向服务器发送 SUBSCRIBE 数据包。
  • SUBSCRIBE 数据包中包含了客户端想要订阅的一个或多个主题列表,以及对应的期望的服务质量级别。
  • 服务器接收到 SUBSCRIBE 数据包后,会返回 SUBACK 数据包,确认订阅的结果(成功或失败)。

四、服务质量(QoS)级别

QoS 0 - 至多一次(At most once):

  • 这是最低的服务质量级别。
  • 发布者发送消息后,不会关心消息是否成功到达服务器,服务器也不会进行确认。
  • 这种级别适用于对消息丢失不太敏感的场景,例如实时性要求高但偶尔丢失一两条消息不影响整体的情况,比如环境监测中的一些非关键数据。

QoS 1 - 至少一次(At least once):

  • 发布者发送消息后,服务器接收到消息会进行确认。
  • 如果发布者没有收到确认,会重新发送消息,直到收到确认为止。
  • 这可能会导致消息的重复,但能保证消息至少被送达一次。
  • 适用于对消息送达有一定要求,但能容忍少量重复的场景,比如设备控制指令。

QoS 2 - 只有一次(Exactly once):

  • 这是最高的服务质量级别,保证消息既不丢失也不重复。
  • 实现过程相对复杂,需要更多的交互和确认步骤。
  • 适用于对消息准确性要求极高的场景,比如金融交易数据。

五、心跳机制

为了保持客户端与服务器之间的连接处于活跃状态,避免因为网络异常等原因导致连接被误判为断开,客户端会按照在 CONNECT 数据包中指定的保持连接时间间隔,向服务器发送 PINGREQ 数据包。服务器接收到 PINGREQ 数据包后,会返回 PINGRESP 数据包。如果客户端在超过保持连接时间的两倍时间内没有收到服务器的任何响应,就会认为连接已经断开,并尝试重新连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值