📜  MQTT的基本功能|套装4

📅  最后修改于: 2021-08-27 17:25:14             🧑  作者: Mango

先决条件–

  • 消息队列遥测传输协议(MQTT)
  • MQTT的基本功能|套装1
  • MQTT的基本功能|套装2
  • MQTT的基本功能|套装3

保持活动消息:
在MQTT中,当客户和代理相互通信时,由于各种原因,两者之间建立的连接可能会丢失,例如–

  • 其中之一由于软件错误而崩溃。
  • 其中之一由于硬件错误而崩溃。

由于此类软件或硬件故障,两个组件可能不同步。这种连接称为半开连接。因此,要检查客户端和代理之间的连接是否仍然保持,可以在特定时间间隔后在它们之间交换PINGREQ和PINGRESP。此消息交换有助于检查两者之间的连接是否仍处于打开状态。

交换这些消息的时间段称为保持活动时间段

因此,当客户端使用保持活动计时器向代理发布消息时,该计时器指示即使没有进行任何消息传输,客户端和代理也可以保持连接的最长时间。

只有后一个保持活动计时器到期,然后客户端会将新的PINGREQ发送给代理。 PINGRESP将由代理发送作为响应,并且保持活动计时器将重新启动(重置为0)。此消息通信将有助于确保仍然连接了两个组件。 PINGREQ和PINGRESP消息没有有效负载。保持活动消息必须考虑以下两个因素–

  • 如果客户端未收到PINGRESP,则应关闭连接。
  • 如果在保持活动计时器的1.5倍内未从客户端收到PINGREQ,则代理应关闭连接。

保持活动计时器的默认值为60秒。此计时器的最大值可以为18h 12min 15sec。当keepalive定时器设置为0时,表示keepalive机制已被停用。以下是JavaScript程序,该消息指示发布消息的保持活动计时器为5秒。

Javascript
/* jshint esversion : 6 */
"use strict";
  
// Importing the MQTT package
var mqtt = require('mqtt');
  
// Creating an instance of the client
var client = mqtt.connect({clientId: "1", keepalive: 5});
  
// Definiting constants
var topic = "home/kitchen/table";
var message = "Table inside the kitchen";
var options = {retain: false, qos: 1};
  
// On successful connection
client.on('connect', function () 
{
    console.log(" After successful connection: ", 
    client.connected);
  
    // If client is connected, then publish on the 
    topic after every 10seconds
    if (client.connected) 
    {
        setInterval(function () 
        {
            console.log(" Publishing on topic: ", topic);
            client.publish(topic, message, options);
        }, 10000);
    }
});


在上面的程序中,ID为1的客户端使用5秒的保持活动计时器与代理连接。因此,每5秒将在发布者客户端(ID:1)与代理之间交换PINGREQ和PINGRESP。

另一方面,发布者的客户端将每10秒将消息发布到代理。代理将从客户端ID 1接收发布消息,并以所使用的Qos级别为1的方式发送回确认。代理还将向订阅者客户端2发送发布消息,订阅者客户端2将在每10秒钟后接收发布的消息。

输出 –

图– Mosquitto保持活动消息插图
如果发布者客户端未发布任何消息,则每5秒钟将仅交换PINGREQ和PINGRESP。在此,如果订户客户端也指定了保持有效期,则代理将与分别具有ID 1和2的两个客户端交换这些PING消息。

图– Mosquitto保持活动消息插图