介绍MQTT协议的消息模型,消息传输过程,消息发布和订阅。
一、介绍MQTT协议的消息模型
MQTT协议的消息模型被称为“主题”模型。在这种模型中,服务器接收到的消息将通过主题进行分类。客户端可以通过订阅一个或多个主题来接收所需的消息。
1.MQTT协议中的消息主题
当发布MQTT消息时,消息被分为一个主题和一个消息负载。主题用于标识消息的类别,可以是任何字符串,但是通常使用斜杠分隔的层次结构。例如,一个名为"home/bedroom/temperature"的主题表示一个温度值,而"home/kitchen/lights"则表示一个灯的状态。通过使用主题,订阅者可以选择接收它们感兴趣的主题。
MQTT的主题模型是一个灵活且强大的机制,可以适应各种应用场景。主题的数量可以非常多,每个主题可以有多个订阅者。订阅者可以使用通配符订阅多个主题,以便接收更广泛的消息。例如,使用通配符“home/+/temperature”,订阅者可以接收来自所有房间的温度值。
在MQTT中,主题是由客户端指定的,没有强制规定的命名规则。因此,在设计主题时,应该选择一个易于理解和管理的结构,避免使用复杂或模糊的命名。同时,主题名称的长度也需要适当考虑,过长的主题名称可能会导致性能问题。
2.MQTT协议中的消息内容格式
在MQTT协议中,消息内容由两部分组成:消息头和消息体。消息头包含了一些控制信息,用于指定消息的类型、服务质量等,而消息体则包含了实际的消息内容。
消息头中最重要的是服务质量(QoS)等级,它用来指定消息的可靠性和传输质量。MQTT协议支持三种不同的QoS等级:QoS 0,QoS 1和QoS 2。在QoS 0级别下,消息被发送一次,如果发送失败则会被丢弃,不会重试发送。在QoS 1级别下,消息会被至少发送一次,确保消息被接收方接收。如果发送失败,则会进行重试,直到接收方接收到消息。在QoS 2级别下,消息被确保只被发送一次,保证消息不会重复发送。
此外,消息头还包括了一些其他的控制信息,例如消息标识符(Message Identifier)等。消息标识符是一个16位的整数,用于唯一标识发送的消息。当消息的服务质量等级为1或2时,消息标识符非常重要,用于跟踪消息的状态。
消息体部分则是实际的消息内容。消息体的格式可以是任意的,但必须按照应用程序的要求进行编码和解码。在实际的应用中,消息体通常是一段JSON、XML或二进制数据等格式的数据。
3.MQTT协议中的消息发布和订阅机制
在MQTT协议中,消息的发布和订阅是基于主题模型的。客户端通过订阅一个或多个主题来接收所需的消息,而发布者则通过发布消息到特定的主题来发送消息。
在发布和订阅消息的过程中,客户端和服务器之间会建立一个可持续的连接。客户端可以向服务器发送订阅请求,服务器会根据请求将客户端添加到订阅列表中。一旦有新消息发布到订阅的主题中,服务器会将消息推送给所有订阅该主题的客户端。
在MQTT协议中,还有一些特殊的主题,例如$SYS开头的主题,这些主题通常用于获取有关服务器状态的信息。此外,还有通配符可用于订阅特定主题的子主题。
总之,MQTT协议中的发布和订阅机制使得客户端可以方便地获取他们感兴趣的消息,同时也降低了网络带宽和资源的消耗。
二、MQTT协议的消息传输过程
在MQTT协议中,客户端需要与服务器进行连接。一旦连接建立,客户端可以向服务器发送消息或订阅主题。服务器接收到消息后,会根据消息主题进行分类,并通过与之对应的主题通知已订阅该主题的客户端。
2.1 建立连接
-
客户端向服务器发送CONNECT报文,包括协议版本号、客户端标识符、清理会话标志、遗嘱标志、遗嘱主题、遗嘱消息、用户名和密码等信息。
-
服务器向客户端发送CONNACK报文,包括连接确认标志、会话标志等信息。如果连接失败,服务器会向客户端发送连接拒绝原因。
-
建立连接后,客户端可以向服务器发送订阅报文,订阅一个或多个主题。服务器接收到订阅报文后,将相应的主题添加到订阅列表中,并向客户端发送SUBACK报文。
-
服务器接收到发布的消息后,会根据消息主题将消息发送给订阅该主题的客户端。如果某个客户端订阅了多个主题,服务器可以通过一个PUBLISH报文将所有主题的消息一次性发送给该客户端。
-
客户端可以发送PINGREQ报文用于保持连接,服务器接收到PINGREQ报文后会返回PINGRESP报文表示仍然存活。
-
客户端可以发送DISCONNECT报文主动断开连接,也可以等待服务器超时关闭连接。
2.2 发布消息
MQTT协议中,发布消息的客户端称为“发布者”(Publisher),而接收消息的客户端称为“订阅者”(Subscriber)。发布者可以向一个或多个主题发布消息,服务器会将这些消息发送给所有已订阅相应主题的订阅者。MQTT协议的消息发布过程如下:
- 发布者向服务器发送PUBLISH消息,该消息包含主题和消息内容。
- 服务器根据主题将消息存储在消息队列中。
- 服务器向所有已订阅该主题的订阅者发送消息。
- 订阅者接收到消息后,可以进行相应的处理操作。
需要注意的是,MQTT协议中的消息发布是异步的,也就是说,发布者无需等待服务器向所有订阅者发送消息的过程,而是可以立即返回并执行后续操作。
此外,MQTT协议中还提供了一些特殊的消息发布方式,比如“保留消息”(Retained Messages)和“遗嘱消息”(Last Will and Testament)。保留消息指的是,服务器会存储最新的消息,当有新的客户端订阅该主题时,服务器会将最新的消息发送给该客户端。遗嘱消息则是在客户端断开连接时发送的消息,用于告知其他客户端该客户端已经离线。
2.3 接收消息
当客户端订阅一个主题时,它会收到任何针对该主题的消息。当客户端接收到消息时,它可以选择采取适当的操作。例如,客户端可以将消息存储在本地,将其显示在用户界面上,或者将其传输到另一个设备。
在MQTT协议中,接收消息的客户端必须使用一个回调函数来处理消息。当消息到达时,MQTT客户端会调用该回调函数,并将消息传递给它。应用程序可以自行实现这个回调函数,以执行所需的操作。
客户端也可以通过QoS机制来控制消息传递的可靠性。具体来说,QoS分为0、1和2三个级别,其中0级别的传递最快,但可靠性最低,而2级别的传递最慢,但可靠性最高。在订阅主题时,客户端可以指定所需的QoS级别。如果发布者发布的消息级别低于订阅者所需的级别,则订阅者将不会收到消息。
2.4 断开连接
在MQTT协议中,断开连接是一个重要的操作,它可以释放服务器和客户端的资源,并且可以让其他客户端连接到服务器。以下是MQTT协议中断开连接的步骤:
- 客户端发送DISCONNECT消息给服务器
- 服务器收到消息后,断开与该客户端的连接,并释放资源
- 客户端收到服务器的断开连接消息后,断开本地的网络连接
在MQTT协议中,由于客户端和服务器之间的连接是通过TCP/IP连接实现的,因此客户端和服务器可以随时断开连接。一般情况下,客户端会在它完成任务后主动断开连接,而服务器会根据自己的策略来管理连接。
三、MQTT协议中的消息发布和订阅
消息发布和订阅是MQTT协议的核心概念之一。在MQTT中,消息发布者称为“发布者”,而消息接收者称为“订阅者”。
在MQTT中,消息传输是异步的,这意味着发布者发布消息后,不需要等待订阅者接收消息。当订阅者上线时,MQTT服务器会将所有未接收的消息推送给订阅者。
通过这种发布-订阅模型,MQTT协议可以有效地实现物联网设备之间的通信,使设备间的通信更加灵活和可靠。
3.1 消息发布
发布者将消息发布到一个特定的主题(Topic),而订阅者可以订阅一个或多个主题,以接收与该主题相关的消息。当有新消息发布到一个订阅者已订阅的主题时,该订阅者会收到该消息。
在MQTT中,主题是通过用“/”分隔的一个或多个层次结构来组织的。例如,“/home/bedroom/light”就是一个主题,其中“home”是一个层次结构,它下面有一个“bedroom”层次,再下面有一个“light”层次。
3.2 消息订阅
订阅者可以使用通配符来订阅多个主题。MQTT支持两种通配符:单层通配符“+”和多层通配符“#”。使用单层通配符“+”可以订阅一个层级的所有主题,而使用多层通配符“#”可以订阅一个层级以及该层级下所有子层级的所有主题。
发布者发布消息时,必须指定一个主题。消息传递到MQTT服务器后,服务器将消息转发给所有订阅了与该主题相同或匹配的主题的订阅者。
3.3 订阅过滤器
当客户端订阅主题时,可以使用通配符来订阅一个或多个主题。MQTT定义了两种通配符:“+”和“#”。
“+”通配符表示匹配一个层级的任意字符。例如,订阅“home/+/temperature”将匹配“home/livingroom/temperature”、“home/kitchen/temperature”等主题。
“#”通配符表示匹配一个或多个层级的任意字符。例如,订阅“home/#”将匹配“home/temperature”、“home/livingroom/temperature”、“home/kitchen/lights”等所有以“home/”开头的主题。
注意,在实际使用中,订阅过滤器的使用应该尽可能地减少,以避免订阅的主题过多导致网络带宽和处理能力的压力。
四、MQTT消息传输中的几个特性
1.MQTT协议中的三种QoS等级
MQTT协议支持三种服务质量等级(Quality of Service, QoS),用于控制消息传递时的可靠性。这三种QoS等级分别为:
- QoS 0:最多传输一次,不保证消息到达接收端。
- QoS 1:至少传输一次,保证消息到达接收端,但可能会有重复消息。
- QoS 2:确保消息到达接收端且仅到达一次,但需要更多的网络资源和时间。
在MQTT协议中,发布者可以设置消息的QoS等级,而订阅者可以选择订阅的主题的QoS等级。
QoS等级越高,消息传递的可靠性越高,但需要更多的网络资源和时间。选择适当的QoS等级应该根据实际应用需求来确定,以保证传输效率和可靠性的平衡。
2.MQTT协议中的消息确认机制
MQTT协议中的消息确认机制指的是在消息发送和接收过程中,为确保消息的可靠性和正确性而采取的一系列措施。MQTT协议支持三种不同的QoS等级,每种等级都具有不同的消息确认机制。
- QoS0:最多一次传输,不需要消息确认,消息不可靠。
- QoS1:至少一次传输,需要消息确认,消息可能重复。
- QoS2:恰好一次传输,需要消息确认,消息不会重复。
在QoS1和QoS2等级下,消息发布者会收到来自消息接收者的确认消息,以确保消息被正确接收。当消息发布者收到确认消息时,表示该消息已被接收,如果没有收到确认消息,则需要重新发送该消息。
在QoS2等级下,还需要进行消息重传,即如果发布者没有收到确认消息,需要重新发送消息,直到接收到确认消息为止。
在消息确认过程中,需要进行超时判断,如果超时没有收到确认消息,则需要重新发送消息。
除了QoS等级外,MQTT协议还支持遗嘱消息,可以在客户端断开连接时发送一条预定义的消息,通知其他客户端该客户端已经离线。这也是一种消息确认机制,确保其他客户端能够正确地处理客户端离线的情况。
3.MQTT协议中的遗嘱消息
当客户端连接断开时,可能会有一些遗留的消息需要处理,而这时就需要使用MQTT协议中的遗嘱消息。遗嘱消息可以理解为客户端意外断开连接后,需要由服务器代表客户端执行的最后一次意愿。
遗嘱消息需要在建立连接时设置,当客户端连接异常断开时,服务器会将遗嘱消息发布到之前订阅过的主题中。在发布遗嘱消息时,服务器会检查其QoS等级和Retain标志,如果Retain标志被设置,则遗嘱消息将一直保存在服务器上,直到另一个客户端订阅相应的主题并读取该遗嘱消息。
遗嘱消息的使用可以在许多情况下提供有用的支持,例如:
- 当客户端断开连接时,向其他订阅者发送离线通知
- 当客户端长时间未响应时,向其他订阅者发送超时通知
- 当客户端异常断开时,向其他订阅者发送异常断开通知
在设置遗嘱消息时,需要指定其主题、负载、QoS等级和Retain标志。这些信息将被保存在连接协议中,以备断开连接时使用。
五、MQTT协议与其他通信协议的比较
5.1 MQTT协议与HTTP协议的比较
MQTT协议与HTTP协议都是常用的互联网通信协议,它们在很多方面都有着不同的特点。下面是MQTT协议与HTTP协议的一些比较:
-
传输方式:HTTP协议采用的是请求-响应模式,即客户端向服务器发送一个请求,服务器返回一个响应,请求和响应都需要耗费额外的网络传输和处理时间。而MQTT协议采用的是发布-订阅模式,客户端与服务器之间只需要建立一次连接,之后就可以通过订阅和发布消息来实现通信,通信效率更高。
-
消息大小:HTTP协议在传输过程中通常需要携带大量的HTTP头部信息和Cookie等数据,因此消息大小通常较大。而MQTT协议中的消息格式更加紧凑,消息头部信息较少,传输的数据量更小,特别适合在低带宽、不稳定网络下使用。
-
连接状态:HTTP协议中,每个请求都需要客户端与服务器之间建立一个连接,请求结束后断开连接,这样的连接过程需要大量的网络资源,对于服务器来说是一种负担。而MQTT协议中,客户端只需要在连接建立后保持连接状态,之后的消息传输都是通过这个连接实现的,不需要每次都建立连接,节省了服务器资源。
-
QoS等级:MQTT协议支持三种不同的服务质量(QoS)等级,可以根据应用需求选择适合的等级。而HTTP协议并没有像MQTT协议一样提供多种不同的QoS等级。
-
消息传输方式:HTTP协议传输的消息都是明文传输的,容易被攻击者窃取。而MQTT协议支持加密传输,可以使用TLS协议对消息进行加密,提高了数据的安全性。
总体来说,MQTT协议适合传输实时性要求高,数据量较小且需要安全性的场景,而HTTP协议适合传输一些较大的数据,适合用于客户端与服务器之间的交互。
5.2 MQTT协议与CoAP协议的比较
MQTT协议和CoAP协议都是用于物联网设备之间的通信协议,它们之间也有一些共同点和区别。
共同点:
- 都是轻量级协议:MQTT协议和CoAP协议都是为了解决物联网设备之间的通信而设计的,因此它们都是轻量级协议,具有小型代码库和低带宽占用。
- 都是基于发布/订阅模型:MQTT协议和CoAP协议都是基于发布/订阅模型的协议,它们都支持发布者发布数据到主题,订阅者可以订阅相关主题,并接收发布者发布的数据。
区别:
- 应用场景不同:MQTT协议主要应用于需要低带宽和网络不稳定的场景,如传感器和遥测应用。CoAP协议主要应用于需要低功耗和低带宽的场景,如智能家居和物联网设备。
- 传输协议不同:MQTT协议使用的是TCP协议作为传输层协议,而CoAP协议使用的是UDP协议作为传输层协议。因此,MQTT协议可以保证消息的可靠性和顺序性,而CoAP协议则更加适用于低带宽和无线网络场景。
- 安全性不同:MQTT协议在传输层和应用层都提供了安全性机制,如TLS/SSL协议和基于用户名和密码的认证机制。CoAP协议在传输层和应用层都没有提供安全性机制,需要在应用层自行添加安全性机制。
以上是MQTT协议与CoAP协议的比较,可以看出MQTT协议适用于对传输质量要求较高,需要保证数据完整性的场景,而CoAP协议适用于对传输质量要求不高,需要低功耗和低带宽的场景。
六、划重点
MQTT协议是一种基于发布/订阅模式的消息传输协议。它的消息模型被称为“主题”模型,通过主题对消息进行分类,客户端可以通过订阅主题来接收所需的消息。
在MQTT协议中,客户端需要与服务器进行连接,建立连接后客户端可以向服务器发布消息或订阅主题。服务器接收到消息后,会根据主题进行分类,并通过与之对应的主题通知已订阅该主题的客户端。
MQTT协议支持三种不同的服务质量(QoS)等级,分别是至多一次(QoS0)、至少一次(QoS1)和只有一次(QoS2)。通过消息确认机制,可以保证消息的可靠性,并且可以设置遗嘱消息来提供额外的安全性。
MQTT协议与HTTP协议和CoAP协议都是互联网应用程序之间的通信协议。相比于HTTP协议,MQTT协议具有更高的实时性和更小的数据包头,更适合于在网络带宽受限的环境中使用。相比于CoAP协议,MQTT协议具有更高的可靠性和更多的功能扩展性,更适合于大规模物联网设备的连接和数据传输。