我是靠谱客的博主 任性冬日,最近开发中收集的这篇文章主要介绍我的mqtt协议和emqttd开源项目个人理解(6) - 使用Wireshark分析mqtt协议,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MQTT V3.1.1协议报文

 

 

报文结构

固定报头(Fixed header)
可变报头(Variable header)
报文有效载荷(Payload)

固定报头

Bit76543210
byte1MQTT Packet typeFlags
byte2…Remaining Length

报文类型

类型名称类型值报文说明
CONNECT1发起连接
CONNACK2连接回执
PUBLISH3发布消息
PUBACK4发布回执
PUBREC5QoS2消息回执
PUBREL6QoS2消息释放
PUBCOMP7QoS2消息完成
SUBSCRIBE8订阅主题
SUBACK9订阅回执
UNSUBSCRIBE10取消订阅
UNSUBACK11取消订阅回执
PINGREQ12PING请求
PINGRESP13PING响应
DISCONNECT14断开连接

PUBLISH发布消息

PUBLISH报文承载客户端与服务器间双向的发布消息。 PUBACK报文用于接收端确认QoS1报文,PUBREC/PUBREL/PUBCOMP报文用于QoS2消息流程。

PINGREQ/PINGRESP心跳

客户端在无报文发送时,按保活周期(KeepAlive)定时向服务端发送PINGREQ心跳报文,服务端响应PINGRESP报文。PINGREQ/PINGRESP报文均2个字节。

MQTT消息QoS

MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS。

发布消息的QoS主题订阅的QoS接收消息的QoS
000
010
020
100
111
121
200
211
222

Qos0消息发布订阅

Qos1消息发布订阅

Qos2消息发布订阅

 

 

ClientID:861694030142473

客户端IP:172.16.6.*

服务器IP:172.16.6.161

一、客户端连接(这里使用的是MQTT 3.1.0版本)

1、客户端完成TCP三次握手之后,还需要发起CONNECT命令,用户名是libaineu2004,密码是12345678,CleanSession==1,KeepAlive==300s

MQ Telemetry Transport Protocol, Connect Command

        0001 .... = Message Type: Connect Command (1)
 #firecat注:这是mqtt协议v3.1.0版本的意思。v3.1.1该值是MQTT。
 #firecat注:这是mqtt协议v3.1.0版本的意思。v3.1.1该值是4。

2、服务器回应

MQ Telemetry Transport Protocol, Connect Ack

        0010 .... = Message Type: Connect Ack (2)

整理成文本是这样子的:

0000   10 35 00 06 4d 51 49 73 64 70 03 c2 01 2c 00 0f  .5..MQIsdp...,..

注意:如果客户端三次握手之后,不发起MQTT的CONNECT命令,30s之后会被服务器断掉。

emqttd.config文件有定义这个时间间隔:

 

 %% Client
{client, [
%% Socket is connected, but no 'CONNECT' packet received
{idle_timeout, 30} %% seconds
]},

 

二、客户端订阅

 

1、客户端订阅消息,主题是"r",QoS==0

MQ Telemetry Transport Protocol, Subscribe Request

2、服务器回应

MQ Telemetry Transport Protocol, Subscribe Ack

 

三、客户端取消订阅

MQ Telemetry Transport Protocol, Unsubscribe Request

取消订阅的回应

MQ Telemetry Transport Protocol, Unsubscribe Ack

 

四、心跳机制

MQ Telemetry Transport Protocol, Ping Request

MQ Telemetry Transport Protocol, Ping Response

 

五、客户端publish,QoS==0,主题是"r",内容是"Hello world!"

MQ Telemetry Transport Protocol, Publish Message

        0011 .... = Message Type: Publish Message (3)
.... .00. = QoS Level: At most once delivery (Fire and Forget) (0)

 

六、客户端publish,QoS==1,主题是"r",内容是"Hello world!"

MQ Telemetry Transport Protocol, Publish Message

        0011 .... = Message Type: Publish Message (3)
        .... .01. = QoS Level: At least once delivery (Acknowledged deliver) (1)

MQ Telemetry Transport Protocol, Publish Ack

 

七、客户端publish,QoS==2,主题是"r",内容是"Hello world!"

MQ Telemetry Transport Protocol, Publish Message

        0011 .... = Message Type: Publish Message (3)
        .... .10. = QoS Level: Exactly once delivery (Assured Delivery) (2)
.... ...0 = Retain: Not set

如果retain==1,则:

Header Flags: 0x35 (Publish Message)
        .... .10. = QoS Level: Exactly once delivery (Assured Delivery) (2)
.... ...1 = Retain: Set

MQ Telemetry Transport Protocol, Publish Received

MQ Telemetry Transport Protocol, Publish Release

MQ Telemetry Transport Protocol, Publish Complete

 

八、客户端关闭

MQ Telemetry Transport Protocol, Disconnect Req

 

最后

以上就是任性冬日为你收集整理的我的mqtt协议和emqttd开源项目个人理解(6) - 使用Wireshark分析mqtt协议的全部内容,希望文章能够帮你解决我的mqtt协议和emqttd开源项目个人理解(6) - 使用Wireshark分析mqtt协议所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部