MQTT协议------上

本文介绍了MQTT协议的基础知识,包括其轻量级特性、基于TCP/IP的通信方式、客户端-服务器模式以及消息发布/订阅模式。详细讲解了MQTT控制报文的组成部分,如固定报头、剩余长度、服务质量等级和协议流程,并举例说明了如CONNECT、PUBLISH、SUBSCRIBE等关键控制报文的结构和作用。此外,还探讨了心跳请求(PINGREQ)和响应(PINGRESP)的机制,以及如何确保客户端与服务端的连接保持。
摘要由CSDN通过智能技术生成

目录

前言

客户端&服务器 

MQTT控制报文 

MQTT控制报文由三部分组成 

固定报头 Fixed header

 剩余长度 Remaining Length

 服务质量等级和协议流程

MQTT控制报文

CONNECT – 连接服务端

 固定报头 Fixed header

 可变报头 Variable header

​编辑 有效载荷 Payload

CONNACK – 确认连接请求

固定报头

可变报头 (两个字节)

PUBLISH – 发布消息

固定报头

可变报头

有效载荷 

响应

PUBACK –发布确认

固定报头

可变报头

 有效载荷

SUBSCRIBE - 订阅主题

固定报头

可变报头 

有效载荷 

 响应

SUBACK – 订阅确认

固定报头

可变报头 

有效载荷 

UNSUBSCRIBE –取消订阅 

固定报头

可变报头 

有效载荷 

UNSUBACK – 取消订阅确认

固定报头

可变报头 

有效载荷 

PINGREQ – 心跳请求

固定报头

PINGRESP – 心跳响应

固定报头

DISCONNECT –断开连接 

 响应


前言

不论我们使用哪种互联网接入方式,只要我们的设备可以通过UDP或TCP通信访问互联网上对应IP地址的主机
那么理论上,当设备与云服务器建立UDP/TCP通信后,只要按照云服务器所规定的通信协议(数据格式)发送/接收消息,我们的设备就能接入云平台,实现物联网。

【MQTT 】,就是一种通信协议(数据格式协议)。【百度云】【阿里云】【腾讯云】的物联网组件都支持MQTT协议。
特点:
①、"轻量级"通信协议:实现MQTT协议的开销比较小,无需太多的额外数据/文本。
②、基于TCP/IP协议:建立TCP连接后,【云下设备】/【云平台】按照MQTT协议规定的数据格式来通信。(属于应用层)
③、基于【客户端-服务端】模式:云下设备==客户端、云平台==服务端
④、基于【消息发布(PUBLISH)】/【消息订阅(SUBSCRIBE)】模式

【发布(PUBLISH)】/【订阅(SUBSCRIBE)】

【请求 /回答】模式:假设你要打电话给朋友,你需要等到朋友接电话了,你们才能够开始交流。
【发布/订阅】模式:假设你要发邮件给朋友,邮件点击发送后,你就不用管了。
邮件服务器会将邮件发送给你的朋友,朋友收到新邮件提醒后,任何时候查看邮件都可以。(间接联系)
与【请求/回答】(例如HTTP)这种同步模式不同,【发布/订阅】模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系。
这意味着【发布者】和【订阅者】之间并不需要直接建立联系。

客户端&服务器 

客户端A发布这个主题后也可以订阅这个主题 客户端A,B,C是可以进行通信的,但是在网络连接上客户端A,B,C只和MQTT服务端建立网络连接,通过MQTT服务端来将消息转发

MQTT 控制报文中的文本字段编码为UTF-8格式的字符串。UTF-8 [RFC3629]是一个高效的Unicode字符编码格式,为了支持基于文本的通信﹐它对ASCII字符的编码做了优化·建议大家尽量发送【标准ASCII码字符串】

 需要注意因为之后的mqtt协议编程需要计算每一个字符串的长度,并且把这个长度作为前缀,添加到这个字符串前面

MQTT控制报文 

MQTT协议通过交换预定义的MQTT控制报文来通信

MQTT协议规定大部分通信规则,但是有一些通信规则没有规定,交由MQTT服务端(云平台来规定)
比如:用户名/密码的位数、发布消息的有效载荷格式(纯文本 / JSON /…)客户端订阅的最大主题数量 /
【百度云】、【阿里云】、【腾讯云】支持 【Qos=0/Qos=1】,不支持 【Qos=2】
留意【剩余长度】、【字符串前级】、【主题】、【Qos】、【遗嘱】。。。等参数

 下面这三个只有在QoS等于2的时候使用

PUBREC       5         两个方向都允许    发布收到(保证交付第一步)

PUBREL        6        两个方向都允许    发布释放(保证交付第二步)

PUBCOMP    7        两个方向都允许    QoS 2消息发布完成(保证交互第三步)

MQTT控制报文由三部分组成 

固定报头 Fixed header

 第一个字节的高四位MQTT控制报文的类型,也就是MQTT控制报文的值

第一个字节的低四位用于指定控制报文类型的标志位,除了发布消息这个控制报文之外,别的控制报文都是固定的

 从第二个字节开始是剩余长度

 剩余长度 Remaining Length

剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据也即是说我们只有知道剩余长度,我们才能知道这个MQTT的报文是到哪里结束剩余长度不包括用于编码剩余长度字段本身的字节数。也就是说剩余长度的字节数只是可变报头和有效负载的长度,不包括他自己本身

剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面 的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此每个 字节可以编码128个数值和一个延续位(continuation bit)。剩余长度字段最大4个字节。

它的第一个字节的低7位就是65,因为他之后还有第二个字节,所以说第一个字节它的最高位应该置一,第一个字节就是65+128=193。第二个字节是2,他是小于128的 可以使用7位数据来编码

 MQTT控制报文中的可变报头,有效载荷我们以具体的MQTT控制报文来讲,在介绍MQTT控制报文之前,我们需要先了解一下服务质量等级和协议流程

 服务质量等级和协议流程

的消息质量等级

QoS只能等于0,1,2  

当QoS等于0的时候,表示这个消息最多发送一次,发送方发送了消息,接收者不会发送响应,发送者也不会重试。消息可能送达一次也可能根本没送达

QoS 等于1的时候: 表示这个消息至少发送一次,发送方发送了这个消息,他需要等待接收方应答,如果接收方没有应答,发送方会尝试再次发送这个消息,那么这个消息至少发送了一次

QoS 等于2的时候:表示这个消息仅分发一次,他使用下面三个控制报文来实现仅分发一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paradise_Violet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值