文章目录

  • MQTT心跳机制

MQTT心跳机制

在医院里,医生利用心跳来判断患者是否还有生命体征。对于MQTT服务器来说,它要判断一台MQTT客户端是否依然保持连接可以检查这台客户端是不是经常发送消息给服务端。如果经常收到客户端的消息,那么没问题,这个客户端肯定在线。

但是有些客户端不经常发送消息服务端。对于这种客户端,服务端可以使用类似心跳检测的方法,来判断客户端是否在线。

不过客户端设备没有心脏,自然不会跳动。可是我们可以为它们配上一个类似心脏的机制,这个心脏机制就是让客户端在没有向服务端发送信息时,可以定时向服务端发送一条消息。这条用于心跳机制的消息也被称作心跳请求PINGREQ)。心跳请求的作用正是用于告知服务端,当前客户端依然在线。服务端在收到客户端的心跳请求后,会回复一条消息。这条回复消息被称作心跳响应PINGRESP)。

由于心跳请求客户端定时发送的,一旦服务端发现客户端停止发送请求信息,那么服务端就会知道,这台客户端已经断开了连接。

这个心跳机制不仅可以用于服务端判断客户端是否保持连接,也可以用于客户端判断自己与服务端是否保持连接。如果客户端在发送心跳请求(PINGREQ)后,没有收到服务端的心跳响应(PINGRESP),那么客户端就会认为自己与服务端的连接已经被断开了。

以上是心跳机制(Keep Alive)的简单介绍,为了更深入的了解心跳机制,我们接下来回忆一下MQTT客户端在连接服务端的过程。请见下图,客户端连接服务端时会像服务端发送CONNECT报文


我刚刚给大家讲过,在心跳机制中,客户端要定时向服务端发送心跳请求(PINGREQ)报文。那么客户端发送心跳请求的时间间隔是多少呢?

这个心跳时间间隔是我们在开发客户端时进行设置的。假如我们使用ESP8266开发板作为物联网客户端,那么我们在编写控制程序时,会在程序中对心跳时间间隔进行设置。

设置好心跳时间间隔后,客户端就知道多久要发送一条心跳请求给服务端。但是这里存在一个问题。光是客户端知道心跳时间间隔还不够,服务端也需要知道客户端的心跳时间间隔,这样服务端才能定时检查客户端的心跳请求消息。

因此,在客户端连接服务端时,会将心跳时间间隔信息放入CONNECT报文。也就是上图中最后一行的信息keepAlive。这个keepAlive正是用于告知服务端心跳时间间隔的。

以上示例图中我们看到keepAlive数值为60。这就意味着,客户端的心跳间隔时间60秒

接下来我要给您讲解的内容十分关键,请您务必留意。

在继续后面的学习以前我们先来问您个问题。假如客户端的心跳间隔时间是60秒,那么服务端是不是每隔60秒就检查一次客户端是否发来心跳请求呢?

我们本节课刚开始的时候曾给大家介绍过,如果客户端在心跳时间间隔内发布了消息给服务端,那么服务端不需要客户端发送心跳请求也可以确定该客户端肯定在线。


但是当客户端在心跳间隔内没有发布消息给服务端,这时客户端会主动发送一个心跳请求消息给服务端。以表明自己仍让在线


简而言之,客户端在心跳间隔时间内,如果有消息发布,那就直接发布消息而不发布心跳请求,但是在心跳间隔时间内,客户端没有消息发布,那么它就会发布一条心跳请求给服务端,这个心跳请求的目的就是为了告诉服务端,我还在线,你放心吧。

另外,在实际运行中,如果服务端没有在1.5倍心跳时间间隔内收到客户端发布消息(PUBLISH)或发来心跳请求(PINGREQ),那么服务端就会认为这个客户端已经掉线。

举例来说,如果心跳时间间隔是60秒。那么服务端在90秒内没有收到客户端发布的消息也没有收到PINGREQ请求,那么它就会认为客户端已经掉线。

另外,心跳机制不仅仅用于服务端判断客户端是否在线。客户端也可以利用这一机制来判断自己是否与服务端仍保持连接。如果客户端发送了心跳请求(PINGREQ)给服务端一段时间后,仍然没有收到服务端回复的心跳确认。那么客户端也会认为自己已经断开了与服务端的连接。

内容来自 -----> 太极创客
详情可见太极创客官网,内有Arduino、ESP32等详细教程

【MQTT基础篇(十四)】MQTT心跳机制相关推荐

  1. python socket 主动断开_Python网络编程tcp详解(基础篇十四)

    网络编程tcp 1 TCP详解 <1> tcp概述 TCP:英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的.可靠的.基于字节流的 ...

  2. WF4.0 基础篇 (十四) Delay 与WF4中的线程

    本节主要介绍WF的实例是单线程运行的,Delay并不是Thread.Sleep,Parallel是单线程运行的,WorkflowApplication与WorkflowInvoker在调用流程上的区别 ...

  3. MQTT基础——Part 1. 认识MQTT

    版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. https://blog.csdn.net/chszs/article/details/51635870 MQTT基础--Part 1 ...

  4. JVM上篇:内存与垃圾回收篇十四--垃圾回收器

    JVM上篇:内存与垃圾回收篇十四–垃圾回收器 1. GC分类与新能指标 1.1 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高 ...

  5. 机器学习基础篇(四)——交叉验证

    机器学习基础篇(四)--交叉验证 一.概述 交叉验证是在机器学习建立模型和验证模型参数时常用的办法.顾名思义,交叉验证就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集 ...

  6. 计算机视觉面试宝典--深度学习机器学习基础篇(四)

    计算机视觉面试宝典–深度学习机器学习基础篇(四) 本篇主要包含SVM支持向量机.K-Means均值以及机器学习相关常考内容等相关面试经验. SVM-支持向量机 支持向量机(support vector ...

  7. Spring 源码分析衍生篇十 :Last-Modified 缓存机制

    文章目录 一.前言 二.Last-Modify 三.实现方案 1. 实现 org.springframework.web.servlet.mvc.LastModified接口 1.1. 简单演示 1. ...

  8. a7100换电池_动动手你也行 篇十四:冲动是魔鬼——单反电池换芯失败记

    动动手你也行 篇十四:冲动是魔鬼--单反电池换芯失败记 2020-10-11 15:36:27 0点赞 5收藏 23评论 创作立场声明:本文系作者实践总结,欢迎交流. 背景 家有尼康D5200,现已7 ...

  9. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

    小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...

  10. go设置后端启动_Go语言基础(十四)

    Go语言基础(十四) 一.Redis 二.NSQ 三.Go module 四.Context......0 一.Redis Redis是一个key-value存储系统.和Memcached类似,它支持 ...

最新文章

  1. JS 实现下载Blod文件
  2. IT兄弟连 JavaWeb教程 MVC设计模式
  3. @ConfigurationProperties与@Value的区别
  4. boost::process::shell相关的测试程序
  5. Java黑皮书课后题第2章:*2.20(金融应用:计算利息)编写程序,读取余额和年利率百分比,打印下个月的利息
  6. 跨域资源共享(CORS)--跨域ajax
  7. html5 canvas 图像预览,html5-canvas 加载并显示图像
  8. java 获取oracle表结构_Java导出oracle表结构实例详解
  9. “+=”和append的区别
  10. Java实现本地缓存
  11. 用游戏编辑器制作MOD脱颖而出
  12. 凹多边形三角剖分算法实现---基于Unity3D
  13. mysql8.0.17 汉化
  14. python汇率换算注释_【菜鸟学Python】案例一:汇率换算
  15. 什么样的企业适合用EV证书呢?
  16. MPC5607B串口接收中断程序
  17. Gradle慢需要6min 现在20s解决了。
  18. 招商软文如何写:推广诱人的广告——文芳阁传媒有话说
  19. MATLAB画心形立体图
  20. Unity3D粒子系统实现落叶效果

热门文章

  1. 解析json格式请求返回500状态码的异常
  2. android将代码提交到github,[Android Studio使用][将AS上的代码提交到github]
  3. 生物网络中基于节点相似度的链路预测图卷积
  4. 8.java中面向对象---基础概念(1)(附讲解与练习)
  5. weex学习之路(一)--项目快速创建
  6. (二)基于Multisim的超外差接收系统:混频器的设计
  7. 字符取模 linux 软件,字符取模显示原理
  8. 山东工商学院计算机科学与技术排名,鲁东大学和山东工商学院计算机专业哪个好...
  9. 唯品会数据笔试mysql_唯品会测试开发笔试记录
  10. 摄氏度符号英文计算机语言,英文文章里摄氏度符号打法