物联网协议MQTT

news2024/9/21 14:54:05

物联网协议MQTT

1.MQTT简介

  MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
  MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。由IBM在1999年发布。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。如:机器与机器(M2M)通信和物联网(IoT)。其在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
  MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
在这里插入图片描述

2.MQTT特点

  本协议运行在 TCP/IP,或其它提供了有序、可靠、 双向连接的网络连接上。MQTT属于应用层协议,它有以下特点:

  • 使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。
  • 消息传输不需要知道负载内容。
  • 提供三种等级的服务质量: .
  • QS0:“最多一次”,尽操作环境所能提供的最大努力分发消息。 消息可能会丢失。 例如, 这个等级可用于环境传感器数据,单次的数据丢失没关系, 因为不久之后会再次发送。
  • QS1:“至少一次”,保证消息可以到达, 但是可能会重复。
  • QS2: “仅一次”, 保证消息只到达一次。 例如, 这个等级可用在一个计费系统中, 这里如果消息重复或丢失会导致不正确的收费。很小的传输消耗和协议数据交换,最大限度减少网络流量。

3.MQTT控制报文

  MQTT 协议通过交换预定义的 MQTT 控制报文来通信。MQTT 控制报文由三部分组成:固定报头(Fixed header)、可变报头(Variable header)、有效载荷(Payload)。

Fixed header 固定报头,所有控制报文都包含
Variable header 可变报头, 部分控制报文包含
Payload 有效载荷, 部分控制报文包含

3.1 固定报头格式

在这里插入图片描述

  • 控制报文类型
    在这里插入图片描述

3.2 MQTT控制报文类型集标志

  固定报头第1个字节高4位(4 ~ 7)为控制报文类型,一共14个,低4位(0~3)包含每个 MQTT 控制报文类型特定的标志,见下表。表中任何标记为“保留”的标志位,都是保留给以后使用的,必须设置为表格中列出的值。如果收到非法的标志,接收者必须关闭网络连接。
在这里插入图片描述
  DUP1 =控制报文的重复分发标志。
  QoS2 = PUBLISH 报文的服务质量等级。
  RETAIN3 = PUBLISH 报文的保留标志。
  PUBLISH 控制报文中的 DUP, QoS 和 RETAIN 标志。
  详情参考MQTT3.1协议。

3.3 剩余长度计算

  剩余长度(Remaining Length) 表示当前报文剩余部分的字节数,包括可变报头和负载的数据。 剩余长度不包括用于编码剩余长度字段本身的字节数。
  剩余长度字段使用一个可变长度编码方案,对小于128的值它使用单字节编码。 更大的值按下面的方式处理。低7位有效位用于编码数据8最高有效位用于指示是否有更多的字节。 即剩余长度安装128进制进行计数,剩余长度字段最大 4 个字节

  • 剩余长度字段取值如下:
    在这里插入图片描述
      剩余长度按128进制计数,采用16进制方式表示,低字节在前。剩余长度编码示例:
      ①例如64:(64/128)取整=0,说明64不需要进位,1个字节即可表示,即:0x40;
      ②例如456:(456/128)取整=3,(3/128)取整=0,说明456需要2个字节表示。
       第一个字节bit7=1,(bit0~bit6)=456%128=72=0x48,即第一个字节表示为:0xc8;
       第二个字节bit7=3/128=0,(bit0~bit6)=3%128=3,即第二个字节表示位:0x3;
       综上,456采用2个字节表示为:0xc8 0x3;
      ③例如100000:(100000/128)=781,(781/128)=6,说明100000需要3字节表示
       第一个字节bit7=1,(bit0~bit6)=100000%128=0x20,即第一个字节为0xa0;
       第二个字节bit7=1,(bit0~bit6)=781%128=0x0d,即第二个字节为0x8d;
       第三个字节bit7=0,(bit0~bit6)=6%128=6,即第三个字节为0x6;
       综上,100000采用3字节表示为:0xa0 0x8d 0x6;

3.4 剩余长度计算C语言实现示例

  • 剩余长度编码
int MQTT_RemainSum(int data,u8 buff[])
{
	int cnt=0;//记录编码的字节数
	do
	{
		u8 encodedByte = data % 128;
		data/=128;
		if(data>0)
		{
			//若data超过128,则将最最高位置1
			encodedByte=encodedByte|=0x80;
		}
		buff[cnt++]=encodedByte;
		
	}while(data>0);
	return cnt;//返回需要编码的字节数个数
}
  • 剩余长度解码
int MQTT_remainGet(u8 buff[],int cnt)
{
	int data=0;
	int i=0;
	int count=1;
	for(;i<cnt;i++)
	{
		data+=(buff[i]&0x7f)*count;
		count<<=7;
	}
	return data;
}
  • 测试示例:
int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("格式:./a.out <剩余长度>\n");
		return 0;
	}
	int data=atoi(argv[1]);
	u8 buff[4];
	int cnt=MQTT_RemainSum(data,buff);
	for(int i=0;i<cnt;i++)
	{
		printf("%#x ",buff[i]);
	}
	printf("\n");
	printf("data=%d\n", MQTT_remainGet(buff,cnt));
}
[wbyq@wbyq work]$ ./a.out 64
0x40 
data=64
[wbyq@wbyq work]$ ./a.out 456
0xc8 0x3 
data=456
[wbyq@wbyq work]$ ./a.out 100000
0xa0 0x8d 0x6 
data=100000
[wbyq@wbyq work]$ ./a.out 268435455
0xff 0xff 0xff 0x7f 
data=268435455

4.MQTT消息等级

  • MQTT提供三种等级的服务质量
  • QS0:“最多一次”,尽操作环境所能提供的最大努力分发消息。 消息可能会丢失。 例如,
    这个等级可用于环境传感器数据,单次的数据丢失没关系, 因为不久之后会再次发送。
  • QS1:“至少一次”,保证消息可以到达, 但是可能会重复。
  • QS2: “仅一次”, 保证消息只到达一次。 例如, 这个等级可用在一个计费系统中,这里如果消息重复或丢失会导致不正确的收费。很小的传输消耗和协议数据交换,最大限度减少网络流量。
    在这里插入图片描述
      PUBLISH报文不能将 QoS所有的位设置为1。如果服务端或客户端收到QoS所有位都为 1的PUBLISH报文,它必须关闭网络连接。
  • Qos0最多一次

  发送者 只发送一次消息,不进行重试。在协议中也没有定义重传的语义。消息可能到达服务器1次,也可能根本不会到达。
在这里插入图片描述

  • Qos1至少一次

  服务器接收到消息会被确认,通过传输一个PUBACK信息。如果有一个可以辨认的传输失败,无论是通讯连接还是发送设备,还是过了一段时间确认信息没有收到,发送方都会将消息头的DUP位置1,然后再次发送消息。消息最少一次到达服务器。
  如果客户端没有接收到PUBACK信息(无论是应用定义的超时,还是检测到失败然后通讯session重启),客户端都会再次发送PUBLISH信息,并且将DUP位置1。
  当它从客户端接收到重复的数据,服务器重新发送消息给订阅者,并且发送另一个PUBACK消息。
在这里插入图片描述

  如上图所示, Qos1消息等级为了保证至少传达一次,发布方会将发送的消息本地暂存,并且会每隔一段时间重发一次,直到接收方返回应答为止。当我们收到应答后即可将暂存消息删除,停止重传。
  对应接收方,则需要在每次收到消息后都要回复应答。在上图中publisher(发布方)到broker(代理方,服务器)和broker(代理方,服务器)到subscriber(订阅方)是同等的,两段通信都应按以上讨论的进行实现。

  • Qos2仅一次
    在这里插入图片描述
      QS2消息等级保证消息一定可以到达一次,publisher(发布方)到broker(代理方,服务器)和broker(代理方,服务器)到subscriber(订阅方)是同等的,两段通信都是相同等级。具体消息传输过程如下:
      1.发布方发送消息,并将消息内容本地暂存。
      2.接收方接收到消息内容后,将消息内容暂存本地,并给发送方回复一个应答(PUBREC),发布方在没有收到PUBREC之前会隔一段时间进行消息重发一次,以确保消息一定可以送达。
      3.当发布方收到PUBREC后,则停止消息重发,并给接收方发送释放(PUBREL)消息内容,接收方收到PUBREL后即可确定消息传输成功。
      4.删除暂存的消息,之后发送端每次收到PUBREC都直接发送一个PUBREL消息给接收端。
      5.接收端在收到PUBREL消息后,修改暂存的消息状态为发布完成,停止发送PUBREC,然后给发送端发去一个发布完成(PUBCOM)的消息。此时接收端则将删除暂存的消息,之后每次收到PUBREL都直接回复PUBCOM。
      6.发送端收到PUBCOM,如果发现暂存的消息还每删除的话,就删除暂存消息,如果已经删除了就不管了。
      注意:在此过程中本地暂存消息的作用是为了在收到重复内容时可以实现去重,在接收到PUBREL后,就能确定发送端不再会发送此消息,所以这个时候就可以删除暂存消息了,同样的,发送端在接收到PUBREC后知道接收端已经接收到消息了,所以不必再发送消息,并且可以删除暂存了。

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

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

相关文章

必考设计模式

文章目录一、单例模式&#xff08;创建型&#xff09;1、饿汉式2、懒汉式3、双重检验锁&#xff08;DCL&#xff09;4、sync.once实现单例二、工厂模式&#xff08;创建型&#xff09;1、简单工厂模式2、工厂方法模式3、抽象工厂模式&#xff08;暂时不写&#xff09;三、装饰模…

高通SDX12:SFE(shortcut-fe)软加速驱动效果调测

背景 USB转PHY RTL8153不支持高通IPA硬加速,所以采用SFE软加速 调试设备为基于Cat.6通信模组的整机 SFE软加速前:UXM环境实际测速100Mbps,设备内部sirq 87% SFE软加速驱动调测 SFE驱动代码路径:sdx12-ap\shortcut-fe\shortcut-fe SFE驱动编译文件路径:sdx12-ap\poky\m…

阿里云ACP考试内容是什么?考试时间是什么时候?

对于现在的人来说&#xff0c;网络就是帮助自己了解世界的好帮手、就是让自己生活得更方便的好工具&#xff0c;这样一来&#xff0c;市场就需要大量的人才来满足需求&#xff0c;相对应的岗位也逐渐增多。于是就有大批的大学生在填报志愿的时候&#xff0c;选择IT专业&#xf…

使用Docker发布部署C# .NET core WebApi到服务器

1、启用Docker支持 如果我们使用vs2022新建WebApi项目的时候需要勾选 启用Docker &#xff1a; 如果没有勾选或者使用VS019创建的项目&#xff0c;可以在项目右键 添加 docker支持 2、发布运用程序 接下来开始发布程序&#xff0c;右键点击项目 发布 提示在哪里发布内容&am…

什么?console.log打印出的数据不对?

背景 都怪我年轻不懂事&#xff0c;调试代码只会用console.log。那么&#xff0c;就在今天&#xff0c;出事儿了&#xff01; 看图说话。上面的111和222后面跟的数据竟然不一致&#xff1f; 在我的认知中&#xff0c;JSON里面的parse和stringify方法只是类型的转换啊&#xff…

深浅拷贝小整理(对象赋值请注意)

深浅拷贝小整理1. 一些基础知识 js数据类型分为基本数据类型>Number、String、Boolean、Null、Undefined和引用(对象)数据类型>Object包括有Function、Array、Date&#xff1b;基本数据类型存放在栈中&#xff0c;访问是按值访问&#xff1b;引用类型指的是对象&#xf…

痛定思痛!!!结合fidller抓包,简单介绍http请求报文和http响应报文

简单介绍http请求报文和http响应报文前言1. http请求报文的组成1.1 请求行的内容1.2 请求头的组成1.3 请求体2. HTTP响应报文组成前言 各类书上在介绍http请求报文和http响应报文时花的太过于专业&#xff0c;没有结合实际&#xff0c;当时读的时候可能是我太笨了&#xff0c;…

今天给在家介绍一篇健身俱乐部信息管理系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

安装包UI美化之路-nsNiuniuSkin界面在线设计引擎

一年多前&#xff0c;我们自己开发了一个用于编辑、预览、调试nsNiuniuSkin的UI界面工具&#xff0c;越来越觉得好用&#xff0c;忍不住想要分享出来&#xff01; 今天我把这个工具重新整理了一下&#xff0c;功能又完善了一些&#xff1b;下面就介绍一下这个工具的功能和使用…

深度解析:Web 3.0和元宇宙

导读:元宇宙的终极形态势必是去中心化的,而现在的网络生态并不能完全满足元宇宙去中心化的需求。一些人认为,即将到来的Web 3.0时代和元宇宙需要的网络生态高度重合。Web 3.0或许能够成为人类迈向元宇宙道路上重要的一步。 01 Web的三次技术迭代 Web 3.0通过新技术体现出来,…

蓝桥杯2022年第十三届决赛真题-围栏(求凸多边形的面积)

题目描述 这天&#xff0c;小明在造围栏。 他提前在地上 (二维平面) 打好了 n 个洞&#xff0c;这 n 个洞的位置形成了一个凸多边形。当他准备把固定围栏的木杆插进去的时候&#xff0c;突然发现自己少准备了两根木杆。 如图&#xff0c;他现在只能在这 n 个洞中选出 n − 2 …

【linux】软件管理

linux软件管理 文章目录linux软件管理桥接模式下配置虚拟机连接互联网nmcli相关命令windows和linux之间的FTPlinux中的软件包类型rpm相关命令搭建本地软件仓库测试本地仓库重新挂载仓库到http服务器上设置仓库镜像开机自动挂载dnf相关命令配置EPEL&#xff08;Extra Packages f…

学生个人网页设计作品:旅游网页设计与实现——成都旅游网站4个页HTML+CSS web前端网页设计期末课程大作业 学生DW静态网页设计 学生个人网页设计作品

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

【YSYY】DSPE-PEG-Transferrin;DSPE-PEG-TF转铁蛋白的主动靶向介绍;磷脂-聚乙二醇-转铁蛋白

产品简称&#xff1a;DSPE-PEG-Transferrin&#xff1b;DSPE-PEG-TF 中文名称&#xff1a;磷脂-聚乙二醇转铁蛋白 产品全称&#xff1a; 1,2-dipalmitoyl-sn-glycero-3-phosphoethanolamine-N-(polyethylene glycol)-Transferrin 产品外观&#xff1a;白色固体 结 构 式&a…

Kubernetes NUMA 感知

TopologyManager TopologyManager 在1.18版本中处于 Beta 状态&#xff0c;该功能支持 CPU 和外围设备&#xff08;例如 SR-IOV VF 和 GPU&#xff09;的 NUMA 对齐&#xff0c;使工作负载能够在针对低延迟优化的环境中运行。 在引入 TopologyManager 之前&#xff0c;CPU 和…

2022-11-17 更高效的Cascades优化器 - Columbia Query Optimizer

在较早的文章中介绍了些Volcano/Cascades优化器框架的设计理念和实现思路&#xff0c;基本是基于论文的解读: https://zhuanlan.zhihu.com/p/364619893 https://zhuanlan.zhihu.com/p/365085770 虽然cascades号称目前最为先进的优化器搜索框架&#xff0c;但不得不说这2篇pa…

ZNS SSD是否真的前途一片光明?

引言 在上次存储随笔更新了一篇ZNS相关的文章“炙手可热的ZNS SSD将会为数据中心带来什么&#xff1f;”以后&#xff0c;在存储圈也一度引发关注。某公司相关同学也在朋友圈疯狂转发&#xff0c;让一些朋友误以为是存储随笔专为某公司写的技术推广软文。 借这个机会在这里再次…

【算法100天 | 20】有环/无环链表的相交问题(Java实现)

若两个链表相交&#xff0c;请返回相交的第一个节点。 给定两个有可能有环也有可能无环的单链表&#xff0c;头节点head1和head2。 实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的第一个节点&#xff08;从这个节点开始&#xff0c;后续结构都一样&#…

Leetcode-每日一题792. 匹配子序列的单词数(分桶)

题目链接&#xff1a;https://leetcode.cn/problems/number-of-matching-subsequences/description/ 思路 方法一、分桶 题目意思&#xff1a;给你一个字符串 s 和字符串数组 words&#xff0c; 可以对字符串 s 某些位置上的字符进行删除&#xff0c;并不改变原来的字符顺序…

什么是SIMD?

为了提高 CPU 指令处理数据的能力&#xff0c;半导体厂商在 CPU 中推出了一些可以同时并行处理多个数据的指令 ——SIMD指令。 百度百科定义为&#xff1a; SIMD全称Single Instruction Multiple Data&#xff0c;单指令多数据流&#xff0c;能够复制多个操作数&#xff0c;并…