MQTT协议基本讲解(结合netty)

news2024/11/27 22:41:12

正文

  • 前提
  • MQTT结构
    • 可变报文头(Variable Header)
    • 有效负荷(payload)
    • 固定报文头(Fixed Header)
      • 消息类型(Message Type)
      • QoS级别标志(0,1,2)
      • Dup、Retain
      • Remaining Length

前提

这里主要讲一下MQTT的结构,另外结合netty来说下具体参数的设置问题。

MQTT结构

首先基本概念,结构包含三个部分,分别为:固定报文头(Fixed Header)、可变报文头(Variable Header)、有效负荷(payload)。
通俗的介绍下这三个部分:

可变报文头(Variable Header)

可有可无
主要包含协议名,协议版本,连接标志,心跳间隔时间,连接返回码,主题名、是否有遗嘱、是否有用户名密码等等,这个自己定义,其中协议版本号一定要写对,否则在netty中使用会报错的,另外就是主题名了,这就相当于mq中的路由键一样,根据需求来写。

有效负荷(payload)

可有可无
这个就是你实际要发送的消息内容了。

固定报文头(Fixed Header)

一定要有
很好理解,就是固定不变的几个字段,包括:消息类型(Message Type)、QoS级别标志(0,1,2)、Dup、Retain、Remaining Length。

消息类型(Message Type)

这个就不多说了参考 协议类型
在netty中表现:
在这里插入图片描述

QoS级别标志(0,1,2)

这个就是消息服务质量等级了,有三个级别,级别越高,消息越精准。
Qos 0:最多分发一次,消息的传递完全依赖底层的TCP/IP网络,协议里没有定义应答和重试。消息只会到达服务端一次,要么就没到达。
在这里插入图片描述

Qos 1:至少分发一次、服务器的消息接收由PUBACK消息进行确认,如果通信链路或设备异常,或指定时间内没有收到确认消息,发送端会重发这条在消息头中设置了Dup位的消息。
在这里插入图片描述

Qos 2:只分发一次。最高级别的消息传递,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。
在这里插入图片描述

Dup、Retain

  • Dup 就是一个标志,0或false、1或true,在qos大于0的情况下还需要设置MessageId。
    默认为0,只占用一个字节,表示第一次发送,如果设置为1,表示当前消息先前已经被传送过,需要在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。
    简单理解就是,假如A给B发送很多条消息,B收到之后要告诉A我收到了某一条消息,那么区分消息是哪一条,就需要用到唯一的MessageId,同时确认的时候将Dup设置为1发送回去即可。

  • Retain 代表是否需要缓存消息。
    1:表示发送的消息需要一直持久保存(不受服务器重启影响),不但要发送给当前的订阅者,并且以后新来的订阅了此Topic name的订阅者会马上得到推送。
    0:仅仅为当前订阅者推送此消息。
    假如服务器收到一个空消息体(zero-length payload)、RETAIN = 1、已存在Topic name的PUBLISH消息,服务器可以删除掉对应的已被持久化的PUBLISH消息。

    简单说就是:消息是否要存储,同时是否需要发送给新订阅的客户端。

Remaining Length

这个是剩余长度。
剩余长度=可变报头长度+payload长度。
可变报头长度=主题名长度+标识符长度(固定为 2)。
payload长度=实际消息内容的字节长度。
举个例子:发送一个字符串消息“1234”并且主题名为“test”,那么剩余长度应该就等于4+4+2=10.
对于netty来说,直接将对象转成json字符串,然后转成byte数组获取长度,当然在使用netty的时候,我们可以直接把这个值设置为0,然后netty提供的mqtt的编码器会自动为我们计算这个剩余长度并且赋值,很方便,测试过,很准确。
在这里插入图片描述
当然如果我们没用netty,使用原生的MQTT,那么这个长度的计算和赋值方法就需要我们自己来算了。
那么请参考这里:MQTT协议-CONNECT报文剩余长度计算
简单来说,这就是人为设置的表示长度的规则,
先说个概念,再去看上边的文章,更好理解,剩余长度最多占用四个字节,每个字节有八位bit,这八位放的是二进制数,其中八位中前七位表示实际的数,最后一位代表是否还有值,这么说吧,假如一个字节全部取最大值1,那么前七位都是1的二进制是多少呢?
在这里插入图片描述
127,但如果实际长度是128怎么办,那么一个字节就没办法表示了,那就把最后一位(前七位代表实际数字)改成1,然后再增加一个字节来表示,以此类推,如果第二个字节还无法表示这个数,那就继续往下,但是最多四个字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud OpenFeign源码解析,代理的魅力一展无遗

文章目录 一、OpenFeign简介二、OpenFeign中Bean的动态装载1、EnableFeignClients2、registerFeignClients3、FeignClientFactoryBean.getObject4、loadBalance5、DefaultTarget.target6、ReflectiveFeign.newInstance生成代理(1)targetToHandlersByName…

C语言字符及字符串讲解

文章目录 前言一、字符介绍和使用二、字符串介绍和使用三、字符串操作函数四、字符串的长度和字符串所占内存空间的大小总结 前言 C 语言中的字符和字符串是常用的数据类型。字符是一个单个的字母、数字、标点符号或者其他可打印的符号,使用单引号 ’ ’ 表示&…

Linux route命令实战:route 命令实战教程,配置静态路由,删除路由表项

前言 大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第61篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象&am…

使用大型语言模(LLM)构建系统(四):链式提示

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码: import openai#您的openai的api key openai.api_key YOUR-OPENAI-API-KEY def get_…

word如何转化为pdf格式?分享四个方法给大家!

在工作和学习中,经常需要对文档进行转换,其中将Word文档转换为PDF是最常见的格式转换之一。下面介绍几种常用的转换方法,包括使用记灵在线工具。 方法一:使用Word软件直接转换 如果你使用的是电脑上的Word软件,可以直…

vue3ts安装sass(scss)

序 1、我附上个sass的github(跟本教程无关)地址GitHub - sass/sass: Sass makes CSS fun! 2、博主本地环境 "vue": "^3.2.47", "typescript": "^5.0.2" "vite": "^4.3.9", node18.12.1 3、…

外贸企业必看!这五种企业邮箱最适合你的跨国业务需求

在当今的数字世界中,电子邮件的使用对任何外贸企业的成功都至关重要。在技术的冲击下,企业开展运营以及与客户、潜在客户和合作伙伴沟通的方式发生了巨大变化,电子邮件迅速成为外贸中首选的沟通方式。 说到哪种企业邮箱最适合外贸企业使用&am…

MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置

MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置 文章目录 MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置制作局部放大图的方法文本箭头的便捷设置小结 本文主要介绍如何在MATLAB中绘制局部放大图和如何便捷地设置文本箭头的相关内容,以作后续回顾之…

CISP-PTE2022最新考试经验分享

CISP_PTE2022年10月份考试心得体会 2022年9月份由于公司需要,参加了中启航的CISPPTE培训,总培训时间八天,8师傅讲的很好,浅显易懂,经过4天的理论学习和4天的实操练习,经过十一假期的熟练,我在10…

2005-2021年全国及31省绿色信贷水平(含原始数据和测算过程)

1、时间:2005-2021年 2、范围:全国及31省市 4、内容说明:包含原始数据、计算结果、计算过程 5、来源:工业NJ、2018年经济普查、其中2017年缺失已采用插值法补齐 6、计算说明: 选取各省六大高耗能产业利息支出占工…

Unity3D:Project窗口

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 Project 窗口 “项目”窗口显示与项目相关的所有文件,是您在应用程序中导航和查找资源和其他项目文件的主要方式。默认情况下,当您启动新项目时&#xff0c…

这里推荐几个前端icon网站(动图网站)

1. Loading.ioLoading.io 是一个免费的加载动效(Loading animations)图标库。它提供了多种风格的加载动效图标,包括 SVG、CSS 和 Lottie 动画格式。这些加载图标可以增强用户体验,为网站和应用程序添加更佳的视觉效果。 网站地址:loading.io - Your SVG GIF PNG Ajax Loading…

Vue 中如何处理树形结构数据渲染与操作?

Vue 中如何处理树形结构数据渲染与操作? 在实际开发中,我们经常会遇到需要渲染树形结构数据的情况,例如商品分类、组织架构、地区选择等等。Vue 提供了一些便捷的方法和工具来处理树形结构数据的渲染和操作,本文将介绍 Vue 处理树…

web前端要怎么样自学?

前言 前端入门相关的路线图以及资源都帮大噶准备好啦,希望对想要入门前端的小伙伴们有所帮助~ 先放上前端学习的思维导图 : 学习前准备:编译器 编译器方面的选择推荐HBuilder X或者Vscode,运行环境在浏览器,推荐是ch…

Mysql锁机制简介

一、什么是锁 锁是系数据库统区别于文件系统的一个关键特性。 锁机制用于管理对共享资源的并发访问,提供数据的完整性和一致性。 InnoDB存储引擎不仅会在行级别上对表数据上锁,还会在数据库内部其他多个地方使用锁,从而允许对多种不同资源…

【项目实战】一、Spring boot整合JWT、Vue案例

前言 通过Spring boot整合JWT、Vue案例,其中融合了微服务网关、微服务等。 1、若无公共模块,先添加公共模块 1.1、创建模块:common-service 1.2、修改父项的pom文件 1.2.1、给springCloud父项添加子模块 1.2.2、添加common-service的全局…

FinClip | 日子过的飞快,又来汇报了

FinClip 的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。 产品方面的相关动向👇&#x1f…

【021】C/C++字符串处理函数

C/C字符串处理函数 引言一、字符串操作函数1.1、测量字符串的长度strlen1.2、字符串拷贝函数strcpy1.3、字符串追加函数strcat1.4、字符串比较函数strcmp 二、字符串查找函数2.1、字符串查找字符函数strchr2.2、字符串查找子串函数strstr 三、其他字符串处理函数3.1、字符串分割…

结构型设计模式04-适配器模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 适配器模式 1、适配器模式介绍 适配器模式(Adapter Pattern)是一种结构型设计…

chatgpt赋能python:用Python实现文本数字转换:从123到一二三

用Python实现文本数字转换:从123到一二三 在网站开发中,我们经常需要将数字转换成文字,比如将123转成“一百二十三”。这种数字转文字的需求,既方便了用户的阅读,也提高了网站的可读性和SEO效果。 在本文中&#xff…