0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

物联网协议MQTT

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-11-22 09:53 次阅读

物联网协议MQTT

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。由IBM在1999年发布。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。如:机器与机器(M2M通信和物联网(IoT)。其在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

pYYBAGN8K6-AVFpsAAFSZEnVdl0071.png#pic_center

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 固定报头格式

poYBAGN8K6-ABJy4AABWgv60g9o461.png#pic_center

控制报文类型

pYYBAGN8K6-AYOzUAAKa8PkrpmY293.png#pic_center

3.2 MQTT控制报文类型集标志

固定报头第1个字节高4位(4 ~ 7)为控制报文类型,一共14个,低4位(0~3)包含每个 MQTT 控制报文类型特定的标志,见下表。表中任何标记为“保留”的标志位,都是保留给以后使用的,必须设置为表格中列出的值。如果收到非法的标志,接收者必须关闭网络连接。

poYBAGN8K7CALU7WAAHtHXc3bVQ035.png#pic_center


  DUP1 =控制报文的重复分发标志。
  QoS2 = PUBLISH 报文的服务质量等级。
  RETAIN3 = PUBLISH 报文的保留标志。
  PUBLISH 控制报文中的 DUP, QoS 和 RETAIN 标志。
  详情参考MQTT3.1协议。

3.3 剩余长度计算

剩余长度(Remaining Length) 表示当前报文剩余部分的字节数,包括可变报头和负载的数据。 剩余长度不包括用于编码剩余长度字段本身的字节数。

剩余长度字段使用一个可变长度编码方案,对小于128的值它使用单字节编码。 更大的值按下面的方式处理。低7位有效位用于编码数据8,最高有效位用于指示是否有更多的字节。 即剩余长度安装128进制进行计数,剩余长度字段最大 4 个字节。

剩余长度字段取值如下:

pYYBAGN8K7CARXl_AADFQTtkisQ848.png#pic_center

 剩余长度按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

测试示例:

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

4.MQTT消息等级

MQTT提供三种等级的服务质量

QS0:“最多一次”,尽操作环境所能提供的最大努力分发消息。 消息可能会丢失。 例如,这个等级可用于环境传感器数据,单次的数据丢失没关系, 因为不久之后会再次发送。

QS1:“至少一次”,保证消息可以到达, 但是可能会重复。

QS2: “仅一次”, 保证消息只到达一次。 例如, 这个等级可用在一个计费系统中,这里如果消息重复或丢失会导致不正确的收费。很小的传输消耗和协议数据交换,最大限度减少网络流量。

poYBAGN8K7CAB-aXAABqlqhTb8A984.png#pic_center



  PUBLISH报文不能将 QoS所有的位设置为1。如果服务端或客户端收到QoS所有位都为 1的PUBLISH报文,它必须关闭网络连接。

Qos0最多一次

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

pYYBAGN8K7GAI32ZAAFVpo9-WTs219.png#pic_center

Qos1至少一次

服务器接收到消息会被确认,通过传输一个PUBACK信息。如果有一个可以辨认的传输失败,无论是通讯连接还是发送设备,还是过了一段时间确认信息没有收到,发送方都会将消息头的DUP位置1,然后再次发送消息。消息最少一次到达服务器。

如果客户端没有接收到PUBACK信息(无论是应用定义的超时,还是检测到失败然后通讯session重启),客户端都会再次发送PUBLISH信息,并且将DUP位置1。

当它从客户端接收到重复的数据,服务器重新发送消息给订阅者,并且发送另一个PUBACK消息。

poYBAGN8K7GAP-1OAAEpTwRoQT4630.png#pic_center

  如上图所示, Qos1消息等级为了保证至少传达一次,发布方会将发送的消息本地暂存,并且会每隔一段时间重发一次,直到接收方返回应答为止。当我们收到应答后即可将暂存消息删除,停止重传。

对应接收方,则需要在每次收到消息后都要回复应答。在上图中publisher(发布方)到broker(代理方,服务器)和broker(代理方,服务器)到subscriber(订阅方)是同等的,两段通信都应按以上讨论的进行实现。

Qos2仅一次

pYYBAGN8K7KAfZVwAAH_B_epClM970.png#pic_center

  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后知道接收端已经接收到消息了,所以不必再发送消息,并且可以删除暂存了。

审核编辑 黄昊宇


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2909

    文章

    44557

    浏览量

    372757
  • MQTT
    +关注

    关注

    5

    文章

    650

    浏览量

    22487
收藏 人收藏

    评论

    相关推荐

    什么是ThingsKit联网平台?

    快速了解ThingsKit ThingsKit是一个开箱即用的联网平台,它可以帮助您快速实现联网的数据收集、分析处理、可视化和设备管理,支持通过行业标准
    的头像 发表于 08-17 10:14 1074次阅读
    什么是ThingsKit<b class='flag-5'>物</b><b class='flag-5'>联网</b>平台?

    联网传输协议MQTT到底是个什么?

    MQTT是什么?MQTT是一个联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的
    发表于 01-08 11:27

    工业无线MQTT联网网关

    本帖最后由 wtblchenwei1981 于 2018-2-10 16:25 编辑 产品简介 随着越来越多的联网采用 MQTT 作为支持协议,您会发现许多开源应用和产品中出现
    发表于 02-07 14:00

    萌新闯关之联网MQTT协议梳理

    目前大家的进度已经推进到使用联网协议进行控制终端设备了,先头部队已经完整的移植了MQTT协议到我们的开发板上了,既然应用端已经实现,作为作
    发表于 11-27 00:23

    萌新闯关之联网MQTT协议梳理

    目前大家的进度已经推进到使用联网协议进行控制终端设备了,先头部队已经完整的移植了MQTT协议到我们的开发板上了,既然应用端已经实现,作为作
    发表于 12-02 16:56

    联网的基石-MQTT协议初识

    1、联网的基石-mqtt协议初识随着 5G 时代的来临,万互联的伟大构想正在成为现实。联网
    发表于 09-08 16:03

    如何采用mqtt协议实现联网模块消息推送?

    如何采用mqtt协议实现联网模块消息推送
    发表于 11-03 06:55

    联网传输协议MQTT的优势

    联网传输协议为什么首选MQTT
    的头像 发表于 01-09 14:46 4110次阅读

    联网协议MQTT协议的实现

    MQTT是IBM开发的一个即时通讯协议,有可能成为联网的重要组成部分。该协议支持所有平台,几乎可以把所有
    的头像 发表于 05-05 23:07 4078次阅读
    <b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>协议</b><b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>的实现

    基于以太网通信的远程IO模块广泛应用在工业联网领域

    随着IIOT(Industrial IOT)工业联网技术的发展,很多传统的资产都需要接入互联中,实现数据的统一采集、分析、处理以及存储,打破传统的设备信息孤岛现象。因此支持联网
    发表于 11-21 10:17 793次阅读

    如何实现OPC DA Server和MQTT Broker之间的数据交互?

    作为工业领域重要的通信协议,OPC DA常用于现场控制系统/设备之间的数据交互;作为联网协议MQTT常用于
    的头像 发表于 03-23 10:08 1294次阅读
    如何实现OPC DA Server和<b class='flag-5'>MQTT</b> Broker之间的数据交互?

    智联联分享之联网协议MQTT简述,MQTT协议特点

    )基于客户端/服务器的信息发布/订阅的联网常用传输协议。1999年由开发商IBM发布,MQTT协议是轻量、简单、开放和易于实现的,这些特点
    的头像 发表于 03-28 18:10 1288次阅读
    智联<b class='flag-5'>物</b>联分享之<b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>协议</b><b class='flag-5'>MQTT</b>简述,<b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>特点

    ThingsKit联网平台优势

    产品核心优势 ThingsKit是一个开箱即用的联网平台,它可以帮助您快速实现联网的数据收集、分析处理、可视化和设备管理,支持通过行业标准
    的头像 发表于 08-21 14:49 412次阅读

    联网中的MQTT协议概述

    MQTT协议已经成了联网通信中的一个热词,今天我们一起来学习一下关于MQTT协议的一些知识。
    的头像 发表于 11-25 14:09 1318次阅读

    MQTT联网平台是什么

    MQTT联网平台是一种软件平台,它基于MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议
    的头像 发表于 07-18 14:22 582次阅读