MQTT报文理解

官方文档


看图更好理解
图解


报文结构

  1. 固件报头Fixed header

    1. 控制报文的类型 Control Packet type,14种有效类型: [connect, publish, subscribe,.....]

      第一个1个字节前4位,

    2. 标志Flags,

      第一个1个字节后4位,

      1. DUP 控制报文是否为重复报文,只有PUBLISH才会有DUP为1的情况,其他的报文类型都是0
    3. QoS 控制PUBLISH报文的质量等级,

      1. 最多一次(0), 发出去了就不管了

        publish

      2. 至少一次(1) ,发不出必须要等接收方回复ack,没有回复,那么就找时机重发,接收方需要处理去重

        publish - pubrec

      3. 准确一次(2),保证只发一次,需要持久化,重复消息自动去重,并且只有当接收方把消息投递出去,才算完成

        publish - pubrec - pubrel - pubcomp

    4. RETAIN,

      每个topic只有唯一的保留消息,每个client订阅的时候,会立刻读取到保留消息

      1. 如果订阅者无法与broker连接,可以通过retain消息,让订阅者下次连接订阅成功时一次接受所有的内容

      2. 发布者定时发布retain消息,订阅者可以根据retain消息的变化推测发布者状态

    5. 剩余长度 Remaining Length

      从第二个字节开始,最大长度是4个字节,低位在前,高位在后,通过每一个字节第一位[0不需要 1需要]确定是否需要继续往后继续计算,也就是最多可以存储256M, 最大值16进制为:0xFF,0xFF,0xFF,0x7F

  2. 可变报头Variable header

    可变报文部分是根据不同的报文类型,这部分的内容也不同

    比如: 连接报文会有用户名密码标识,遗嘱标识 ,是否清理会话标识等

    ​ 发布报文会有topic信息

    1. 报文标识符 PackageIdentifier 【messageId】

      2个字节最大65535

      这些报文类型需要:PUBLISH(QoS > 0), PUBACK, PUBREL, PUBCOMP, SUBSCRIBE,SUBACK, UNSUSCRIBE,UNSUBACK

      重发使用相同的标识符

      确认后释放标识符

  3. 有效载荷Payload

    这些报文类型才有payload:

    CONNECT(用户名密码,遗嘱消息,遗嘱topic,客户端标识),

    PUBLISH(可有可无,根据实际情况),

    SUBSCRIBE(订阅的topic信息集合),

    SUBACK(按顺序返回的订阅的topic的报文质量等级集合)

    UNSUBSCRIBE(取消订阅的topic信息集合)

报文类型处理逻辑(接收方的处理逻辑)

CONNECT 连接服务端 客户端--服务端

  1. 报文解析错误:
    1. 如果报文解析错误,连接失败
    2. 如果解析的报文标识符不合法,连接失败
  2. 报文解析成功
    1. 如果报文标识符不存在,连接失败
    2. 如果用户密码验证失败,连接失败
    3. 如果是会话中已经存在该连接,说明是发送重复的连接报文
      1. 如果之前保存的会话信息,cleanSession == true,需要清空保存的session,订阅信息,需要重发的发布QoS1报文,需要重发的发布的QoS2的报文
      2. 关闭之前的保存的会话
    4. 检查心跳包,将已经存在的心跳包的间隔时间,更新成客户端指定的时间
    5. 如果连接报文中存在遗嘱消息,需要将遗嘱消息保存在本次连接的会话对象中
      1. 连接成功,保存会话信息
      2. 连接成功,回会CONNACK报文给客户端
    6. 如果本次连接的报文cleanSession == false,也就是不清理会话,如果是客户端重连的,可能存在服务端有部分信息没有发送出去,需要重新发送给该客户端
      1. 重发QoS1的未完成的消息
      2. 重发QoS2的未完成的消息

CONNACK 确认连接请求 服务端--客户端

​ 1. 客户端确认连接成功

PUBLISH 发布消息 双向

客户端发送给服务端,是为了将报文分发到其他订阅匹配的客户端

服务端发送给客户端,是为了发消息给匹配订阅的客户端

1. 根据不同的质量等级进行不同的回复报文
    1. QoS 0 直接publish消息即可
    2. QoS 1 PUBLISH消息之后,还需要回复PUBACK给来源客户端
    3. Qos 2 PUBLISH消息之后,还需要回复PUBREC给来源客户端 (后续客户端端发送PUBREL,再服务端发送PUBCOMP完成整个生命周期)
2. 如果是保留消息,需要覆盖之前保存的保留消息

PUBACK 发布确认 双向

1. 带着messageId回复发布方,通知发布成功

PUBAREC 发布收到 双向

​ 1. 带着messageId回复发布方,通知收到了发布报文

PUBREL 发布释放 双向

​ 1. 带着messageId回复接收方,可以释放报文

PUBCOMP 发布完成 双向

​ 1. 带着messageId回复发布方,可以发布完成了

SUBSCRIBE 订阅主题 客户端--服务端

1.  根据订阅的主题列表,
    1.  保存订阅信息
    2.  回复SUBACK,按顺序返回订阅报文中的报文质量等级集合
2.  根据订阅的主题,处理服务端保留信息,立即PUBLISH给客户端

SUBACK 订阅确认 服务端-- 客户端

1.  客户端确认订阅成功

UNSUBSCRIBE 取消订阅 客户端--服务端

  1. 移除掉该客户端保存的订阅主题
  2. 回复UNSUBACK报文

UNSUBACK 订阅确认 服务端-- 客户端

  1. 客户端确认取消订阅成功

PINGREQ 心跳请求 客户端--服务端

  1. 返回客户端PINGRESP报文

PINGRESP 心跳响应 服务端--客户端

  1. 收到报文确认服务端正常
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • —— [1.MQTT项目工程](https://github.com/LiamBindle/MQTT-C) [2....
    郑行_aover阅读 1,561评论 0 0
  • MQTT使用的底层传输协议基础设施。 客户端使用它连接服务端。 它提供有序的、可靠的、双向字节流传输。 客户端 C...
    Android_冯星阅读 1,716评论 0 0
  • 简介 MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)...
    殖民_FE阅读 4,410评论 1 6
  • 网络编程 1. 概论 建立连接:通过IP或者域名来连接两台设备,通过端口号找到对应的通信程序 通信协议:要传输的数...
    陵无山阅读 3,977评论 0 12
  • 我的对象是逗比 01.我对象一度以为姨妈巾是贴在屁屁上的,像创可贴一样。每次完上厕所,就得丢掉,重贴。#吼,流血了...
    小杏仁阅读 90评论 0 0