先决条件–
- 消息队列遥测传输协议(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秒钟后接收发布的消息。
输出 –