MQTT3.1.1协议研究记录

MQTT协议概述

网上搜索下载mqtt协议文档,有英文版和中文版,首先简单说一下几个报文和代码说明

MQTT报文格式

MQTT控制报文

在这里插入图片描述
固定报头 Fixed header
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.1 CONNECT – 连接服务端----报文标识0x10

客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报 文 [MQTT-3.1.0-1]。 在一个网络连接上,客户端只能发送一次CONNECT报文。服务端必须将客户端发送的第二 个CONNECT报文当作协议违规处理并断开客户端的连接 [MQTT-3.1.0-2]。有效载荷包含一个或多个编码的字段。包括客户端的唯一标识符,Will主题,Will消息,用户 名和密码。除了客户端标识之外,其它的字段都是可选的,基于标志位来决定可变报头中是 否需要包含这些字段。

报文格式:报文标识+剩余长度

报文标识 — 0x10

剩余长度=可变报头(10字节)+负载

负载 = 客户端ID长度(2字节)+客户端ID+客户端用户名长度(2字节)+客户端用户名+密码长度(2字节)登录密码
在这里插入图片描述
举个例子:如果剩余长度为100(100<128),那么剩余长度就占一个字节的大小,0x64(1个字节的范围是0-127)
如果剩余长度为250(250>128),那么剩余长度就使用2个字节,250=1128+122,根据上边的定义,第一个字节的最高位应该置1,剩下的七位就是122(111 1010)那么第一个字节就是1111 1010,第二个字节就是0x01(2个字节的范围是128-16383)
如果剩余长度是321=(2
128+65),那么就需要2个字节,第一个字节最高位置1,剩余七位就是65(100 0001),那么第一个字节就是1100 0001,第二个字节是0x02
例子:
客户端ID(字符串长度0x3D):“STM32F103ZET6|securemode=3,signmethod=hmacsha1,timestamp=789|”
用户名(字符串长度0x19):“STM32F103ZET6&a1imgCVG7ts”
密码(字符串长度0x28):“b4060e3beead328ad07d73ac7fc8a6260e5ca7fc”
变成mqtt报文就是(16进制)
10 8E 01 00 04 4D 51 54 54 04 c2 00 64 00 3D 53 54 4D 33 32 46 31 30 33 5A 45 54 36 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 2C 74 69 6D 65 73 74 61 6D 70 3D 37 38 39 7C 00 19 53 54 4D 33 32 46 31 30 33 5A 45 54 36 26 61 31 69 6D 67 43 56 47 37 74 73 00 28 62 34 30 36 30 65 33 62 65 65 61 64 33 32 38 61 64 30 37 64 37 33 61 63 37 66 63 38 61 36 32 36 30 65 35 63 61 37 66 63

003D 0019 0028 都是各自的长度
其中10就是0x10就是CONNECT的报文标识
8E 01:剩余长度,就是8E 01之后的16进制的个数,就是从00 04开始到最后的66 63,一共是多少个字节,一共是142个字节,
8E(1000 1110),01(0x01)—>> 1*128+14(1110) = 142

如下图就是***可变报头 ***的举例:
在这里插入图片描述

3.2 订阅主题:SUBSCRIBE

在这里插入图片描述

剩余长度 = 可变报头+有效负载

可变报头

在这里插入图片描述

有效负载

在这里插入图片描述
在这里插入图片描述

3.3 订阅确认

在这里插入图片描述
在这里插入图片描述

举例

SUBACK(订阅确认)90 03 00 0A 01 、
90(固定报头) 03(之后的数据总数)00 0A(报文标识符) 01(阿里云不管是服务要求质量(Qos)是0/1都回复01)

3.4取消订阅

在这里插入图片描述
在这里插入图片描述

UNSUBSCRIBE(取消订阅)
A2 3D 00 0A 00 39 2F 73 79 73 2F 61 31 69 6D 67 43 56 47 37 74 73 2F 24 7B 64 65 76 69 63 65 4E 61 6D 65 7D 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
A2(固定报头) 3D(后边数据的总长)00 0A(报文标识符) 00 39(数据长度)+后边的数据

3.4 发布消息 PUBLISH

在这里插入图片描述
在这里插入图片描述
RETAIN:0
固定报头:0x30

在这里插入图片描述

3.5 心跳包 PINGREQ

在这里插入图片描述
心跳包:0xC0 0x00

3.6 CONNACK – 确认连接请求

服务端发送CONNACK报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第 一个报文必须是CONNACK [MQTT-3.2.0-1]。
如果客户端在合理的时间内没有收到服务端的CONNACK报文,客户端应该关闭网络连接。 合理 的时间取决于应用的类型和通信基础设施。

固定报头

在这里插入图片描述
在这里插入图片描述

3.7

有空补上,现在没空了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值