推荐一款稳定的基于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参数示例

Android mqtt 发送心跳 mqtt心跳包_开发教程


本文中KeepAlive时间设置为30秒

1.1 PINGREQ抓包

Android mqtt 发送心跳 mqtt心跳包_开发教程_02


源码如下:

c0 00

1.2 固定报头

c0 0
其中:
c0 – 对应的控制报文类型为PINGREQ
00 – 剩余长度0 = 0个字节

1.3 可变报头

PINGREQ没有 可变报头

1.4 有效载荷

PINGREQ没有有效载荷

2 PINGRSP 报文分析

2.1 PINGRSP 抓包

Android mqtt 发送心跳 mqtt心跳包_开发教程_03


源码:

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抓包

Android mqtt 发送心跳 mqtt心跳包_Android mqtt 发送心跳_04


通过上图可以看到,两次的PINGREQ之间的间隔是30秒,这跟本文开头设置的KeepAlive时间是一致的。