网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

MQTT的基本特性 | 第4部分

更新时间:2026年03月27日   作者:spoto   标签(Tag):

先决条件/前提条件 –

  • 消息队列遥测传输协议(MQTT)
  • MQTT的基本特性 | 第1部分
  • MQTT的基本特性 | 第二部分
  • MQTT的基本特性 | 第3部分

保持消息状态:在MQTT协议中,当客户端和代理之间进行通信时,由于各种原因,两个设备之间的连接可能会中断。这些原因包括:

  • 其中有一台因为软件故障而坠毁了。
  • 其中有一台设备因为硬件故障而损坏了。

由于这种软件或硬件故障,两个组件可能会失去同步。这样的连接被称为……半开连接因此,为了确认客户端与代理之间的连接是否仍然保持正常,可以在一定的时间间隔后交换PINGREQ和PINGRESP消息。这种消息交换有助于判断两者之间的连接是否仍然处于开放状态。这些消息被交换的时间段,被称为“保持连接周期”。. 因此,当客户端向代理发送带有保持连接计时器的消息时,这个计时器就代表了客户端和代理能够保持连接的持续时间上限。即使此时没有消息在传输,它们仍然可以保持连接状态。 只有在保持连接的计时器到期之后,客户端才会向代理发送新的PINGREQ请求。 PINGRESP将会由经纪商发送回来,同时,保持连接的计时器也会重新启动(重置为0)。 这种消息传递方式有助于确保两个组件之间仍然保持连接状态。 PINGREQ和PINGRESP消息中并没有任何有效载荷。 在处理“Keep-alive”消息时,需要考虑以下两个因素:

  • 如果客户端没有收到任何PINGRESP的响应,那么应该关闭连接。
  • 如果客户端在保持连接的计时器倒计时达到1.5倍时仍然没有收到任何PINGREQ请求,那么代理服务器应该关闭与该客户端的连接。

“Keep-alive定时器”的默认值为60秒。该定时器的最大值可以达到18小时12分钟15秒。当“Keep-alive定时器”被设置为0时,表示“Keep-alive机制”已被禁用。下面是一段JavaScript代码,该代码展示了如何使用5秒的“Keep-alive定时器”来发布消息。

JavaScript
/* JSHint 版本:6 */使用“严格模式”;// 导入 MQTT 包变量MQTT=需要(‘mqtt’);// 创建客户端的一个实例变量客户/用户=MQTT.连接({clientId:1,保持连接状态:5});// 定义常量变量主题/话题=家/厨房/餐桌;变量信息/消息=“厨房内的餐桌”;变量选项={保留:错误的/不正确的,QoS:1};// 连接成功时客户端.on(“连接”,功能/作用(){控制台.日志/记录(连接成功后:,客户端.连接/关联);// 如果客户端已连接,那么就在该通道上发布消息。主题/话题之后每一个10秒数if(客户/用户.连接){setInterval(功能/作用(){控制台.日志/记录(关于该主题的出版物:,主题/话题);客户端.发布/发表(主题/话题,信息/消息,选项);},10000);}});


在上述程序中,编号为1的客户端与代理服务器进行连接,该连接的保持时间设置为5秒。 因此,PINGREQ和PINGRESP会在每5秒之间在发布客户端(ID:1)与代理之间交换一次。 另一方面,出版商的客户会每10秒向中介发送一条消息。 该经纪人将从客户编号1处接收“PUBLISH”信息,并发送确认消息,表示所使用的QoS等级为1。 该经纪人还会向订阅者客户端2发送“PUBLISH”指令,这样,订阅者客户端2就可以每10秒接收一次已发布的消息了。输出结果/内容图/图片 –Mosquitto:保持消息连接的示意图
如果发布方客户端不发送任何消息,那么每5秒只会交换PINGREQ和PINGRESP这两个消息。如果订阅方客户端也指定了“keep-alive”时间,那么这些PING消息将由代理服务器与两个客户端分别进行交换,这两个客户端的ID分别为1和2。
图 –Mosquitto:用于显示“保持连接状态”消息的插图
 

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料