学为所用

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  通过上一节我们对MQTT协议已经有了初步的印象,这一节我们开始深入的理解一下MQTT协议,介绍常用的MQTT 3.1.1版本,5.0版本后面指介绍新增部分即可。这一节我们先介绍MQTT里常用的术语(非官方文档直接复制)。

  网络连接(Network Connection):
  MQTT 是一种连接协议,底层使用 TCP/IP (传输层协议)提供网络连接,提供有序、可靠的、双向字节流传输。这个连接需要互联网通信的基础设施支撑,客户端使用它连接到服务端(MQTT代理服务的服务器或服务器集群)。

  会话(Session):
  客户端与服务端通过网络连接后的信息通道,服务端会有一个唯一的标志识别,也是状态交互的反映。通常一个会话就是一个网络连接,有些网络环境也可能将一个会话会扩展几个网络连接为之服务。

  应用消息(Application Message):
  使用MQTT协议通过网络连接传输的应用数据,也就是客户端与服务端之间交互的应用数据。应用消息通过MQTT传输时, 会有携带服务质量(QoS)和主题(Topic)等信息内容的。

  服务端(Server) / 代理(Broker):
  一个服务程序或设备,为消息发送方和消息订阅方提供中介服务,为发送方和订阅方提供中转分配处理,这个服务程序也称之为代理(Broker)。要处理来自客户端的网络连接、发布的应用消息,处理保存客户端的订阅和取消订阅,将应用消息转发给符合订阅条件的客户端,关闭客户端发出断开连接请求的网络连接等。

  客户端(Client):
  是与服务端对应的,使用MQTT为客户提供本地服务的程序或设备。客户端总是先发起连接请求通过网络连接到服务端。它可以:打开连接到服务端的网络连接、通过服务端发布应用消息给其他相关的客户端、订阅并接收相关的应用消息、取消订阅并不再接收相应消息、关闭与服务端的网络连接等。

  主题(Topic):
  标注应用程序消息的标签,订阅者用它来确定接收到所关心的消息,服务端代理服务会将消息转发给订阅者所匹配标签的每个客户端。主题名是一个分层的结构,可以有多个级别,级别之间用斜杠分隔。例:area-a/building-6/floor-8 代表A区6栋5层的设备发出的主题。
  订阅者的主题名支持通配符#和+,可以通过通配符进行匹配过滤:
  +为只匹配主题一个层级的通配符,例:area-a/+/floor-8 代表A区任何一个楼的8层的设备。
  #为匹配主题该层级向后任意级别的通配符,例:area-a/# 代表A区的所用设备。

  发布(Publish):
  从MQTT客户端向MQTT服务端主动发送主题消息,或MQTT服务端向MQTT客户端主动发送主题消息(这种情况很少)。主题消息中包含着服务质量(QoS)等级。

  订阅(Subscription):
  订阅的过程与我们生活中向邮局订阅杂志类似,只不过是客户端向服务端订阅,订阅的是主题消息而不是杂志。当服务端的代理服务发现有客户端发布了某客户端订阅的主题消息时,就会把该主题消息转发给订阅了该主题消息的那个客户端。订阅的主题会与某个单一会话(Session)关联,一个会话可以关联多个订阅。每个订阅都包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。

  主题过滤器(Topic Filter):
  是一个针对主题名过滤的筛选器,在订阅表达式中使用,表示订阅所匹配到的一个或多个主题。

  服务质量(QoS):
  表示发布者发布的主题到达代理和目标客户端的可靠性要求,MQTT服务质量分三个等级:
  QoS =0,至多一次,有可能会丢包,一般用在对实时性要求不高并且会有新的数据覆盖旧的数据的场景。例如,某个温度传感器的数据上报,间隔一定时间上报一次,每次都更新服务端数据库中的记录。这样对于是否丢失某次上报的数据并不太重要,因为稍候还会上报新的数据上来更新到最新。
  QoS =1,至少一次,确保到达目的地,但是有可能出现数据重复发送的现象,订阅者可能会收到重复的数据包。
  QoS =2, 刚好一次,确保到达目的地,并且不会出现数据重复发送的现象。

  遗嘱消息(Will Message):
  遗嘱消息一般是在客户端 发起连接的时候指定的。是客户端预先定义好的一个主题消息,代表在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱。在客户端连接出现异常的情况下,由服务端代理服务主动发布此消息,订阅此消息的其他客户端就收到了这个客户端离线的遗嘱消息了。也就是你希望一个客户端离线后,用什么信息内容通知关心这个客户端离线的其他客户端。

  控制报文 (MQTT Control Packet):
  在MQTT协议框架下通过网络连接发送的信息数据包。MQTT规范定义了十四种不同类型的控制报文,其中PUBLISH报文是用于传输发布应用消息的。控制报文中最多包含三部分,依次分别是固定报头、可变报头、有效载荷。

  固定报头(Fixed header):
  是控制报文的最开始部分,代表着这个报文的具体作用和其他一些控制配置信息等。固定报头长度固定为2个字节起,后面会有详解。

  可变报头(Variable header):
  一个控制报文需要携带的控制信息量较多,就在固定报头后面增加了可变报头,一般也是2个字节长度,后面会有详解。

  有效载荷(Payload):
  是控制报文的最后一部分,包含主题名和我们需要携带的自定义的应用消息。例如我们要通过MQTT协议发送一个字符串“hello”,那这个“hello”字符串就是在有效载荷部分。

  心跳(PINGREQ):
  是为了保证服务端知道客户端的连接还在正常保持着,在没有必要的应用消息发出的时候,会在一定时间间隔发出一个很短的特定数据包,用于通知服务端,这个客户端连接正常。在没有业务逻辑需要主动发布消息的时候,网络连接就是靠这个有着固定时间间隔规律的数据包发送来维持连接正常的,这就像心脏跳动一样,有心跳知道这个人还活着,因此而得名!

  本节完,待续......

posted on 2019-07-20 22:10  学为所用  阅读(1110)  评论(0编辑  收藏  举报