推荐一款稳定的基于C编写的MQTT Client开源库 cMQTTMQTT协议详解及开发教程(一)MQTT协议概述MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建MQTT协议详解及开发教程(三)MQTT Client工具软件选择及简单测试MQTT协议详解及开发教程(四)MQTT协议报文格式MQTT协议详解及开发教程(五)CONNECT/CONNACK报文分析MQTT协议详解及开发教程(六)PUBLISH发布QoS0消息报文分析MQTT协议详解及开发教程(七)PUBLISH发布QoS1报文流程分析MQTT协议详解及开发教程(八)PUBLISH发布QoS2报文流程分析MQTT协议详解及开发教程(九)订阅SUBSCRIBE及SUBACK报文流程分析MQTT协议详解及开发教程(十)取消订阅UNSUBSCRIBE及UNSUBACK报文流程分析
前言
在上一篇文章中,我们对取消订阅UNSUBSCRIBE和取消订阅确认UNSUBACK的报文进行了分析,本文我们接着分析心跳请求PINGREQ和响应PINGRSP
MQTT的心跳PING本质上是类似于TCP的心跳,检测通信网络是否正常
1. Client 中KeepAlive参数示例
本文中KeepAlive时间设置为30秒
1.1 PINGREQ抓包
源码如下:
c0 00
1.2 固定报头
c0 0
其中:
c0 – 对应的控制报文类型为PINGREQ
00 – 剩余长度0 = 0个字节
1.3 可变报头
PINGREQ没有 可变报头
1.4 有效载荷
PINGREQ没有有效载荷
2 PINGRSP 报文分析
2.1 PINGRSP 抓包
源码:
d0 00 ..
2.2 固定报头
d0 00
其中:
d0 – 对应的控制报文类型为PINGRSP
00 – 剩余长度0x00 = 0个字节
2.3 可变报头
PINGRSP报文没有可变报头
2.4 有效载荷
PINGRSP报文没有有效载荷
3.KeepAlive参数含义
可以简单的认为客户端和服务器之间约定的心跳时间,客户端会每隔KeepAlive时间向broker发送一次ping请求指令,如果服务器返回PINGRSP,则认为网络正常,当然这个检测是双向的,服务器也会检测client有没有在规定的时间内发送ping请求,如果没有,服务器认为客户端已经离线,那么就会关闭客户端会话。
3.1 KeepAlive抓包
通过上图可以看到,两次的PINGREQ之间的间隔是30秒,这跟本文开头设置的KeepAlive时间是一致的。