美文网首页
MOTT协议

MOTT协议

作者: 天冷请穿衣 | 来源:发表于2019-08-13 19:20 被阅读0次

MQTT是什么?

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议。
该协议构建于TCP/IP协议上,由IBM在1999年发布。
MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,在物联网、小型设备、移动应用等方面有广泛的应用。

MQTT是哪一层的协议?

MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。
(TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。)

MQTT消息格式

每条MQTT命令消息的消息头都包含一个固定的报头,有些消息会携带一个可变报文头和一个负荷。
消息格式如下:

固定报文头 | 可变报文头 | 负荷(报文体)

  • 固定报文头(Fixed Header)
    MQTT固定报文头最少有两个字节,第一字节包含消息类型(Message Type)和QoS级别等标志位。第二字节开始是剩余长度字段,该长度是后面的可变报文头加消息负载的总长度,该字段最多允许四个字节。
    剩余长度字段单个字节最大值为二进制0b0111 1111,16进制0x7F。也就是说,单个字节可以描述的最大长度是127字节。为什么不是256字节呢?因为MQTT协议规定,单个字节第八位(最高位)若为1,则表示后续还有字节存在,第八位起“延续位”的作用。
    例如,数字64,编码为一个字节,十进制表示为64,十六进制表示为0×40。数字321(65+2*128)编码为两个字节,重要性最低的放在前面,第一个字节为65+128=193(0xC1),第二个字节是2(0x02),表示2×128。
    由于MQTT协议最多只允许使用四个字节表示剩余长度(如表1),并且最后一字节最大值只能是0x7F不能是0xFF,所以能发送的最大消息长度是2的28次方=256MB.
表1-各字节的取值范围
  • 可变报文头(Variable Header)
    可变报文头主要包含协议名、协议版本、连接标志(Connect Flags)、心跳间隔时间(Keep Alive timer)、连接返回码(Connect Return Code)、主题名(Topic Name)等。

  • 有效负荷(Payload)
    有效负荷即是消息主体(body)。
    当MQTT发送的消息类型是CONNECT(连接)、PUBLISH(发布)、SUBSCRIBE(订阅)、SUBACK(订阅确认)、UNSUBSCRIBE(取消订阅)时,则会带有负荷。

MQTT的主要特性

  • MQTT的消息类型(Message Type)
    固定报文头中的第一个字节包含连接标志(Connect Flags),连接标志用来区分MQTT的消息类型。
    MQTT协议拥有14种不同的消息类型,可简单分为连接及终止发布和订阅QoS 2消息的机制以及各种确认ACK

    MQTT的消息类型
  • 消息质量(QoS)
    MQTT消息质量有三个等级,QoS 0,QoS 1和 QoS 2。

  • QoS 0:最多分发一次。消息的传递完全依赖底层的TCP/IP网络,协议里没有定义应答和重试,消息要么只会到达服务端一次,要么根本没有到达。

  • QoS 1:至少分发一次。服务器的消息接收由PUBACK消息进行确认,如果通信链路或发送设备异常,或者指定时间内没有收到确认消息,发送端会重发这条在消息头中设置了DUP位的消息。

  • QoS 2:只分发一次。这是最高级别的消息传递,消息丢失和重复都是不可接受的,使用这个服务质量等级会有额外的开销。
    应用举例:共享单车,使用QoS 0发送单车的当前位置,QoS 1进行单车解锁操作,QoS 2进行支付。

  • 遗愿标志(Will Flag)
    在可变报文头的连接标志位字段(Connect Flags)里有三个Will标志位:Will Flag、Will QoS和Will Retain Flag,这些Will字段用于监控客户端与服务器之间的连接状况。如果设置了Will Flag,就必须设置Will QoS和Will Retain标志位,消息主体中也必须有Will Topic和Will Message字段。
    那遗愿消息是怎么回事呢?服务器与客户端通信时,当遇到异常或客户端心跳超时的情况,MQTT服务器会替客户端发布一个Will消息。当然如果服务器收到来自客户端的DISCONNECT消息,则不会触发Will消息的发送。
    因此,Will字段可以应用于设备掉线后需要通知用户的场景。

  • 心跳机制(Keep Alive Timer)
    MQTT客户端可以设置一个心跳间隔时间(Keep Alive Timer),表示在每个心跳间隔时间内发送一条消息。如果在这个时间周期内,没有业务数据相关的消息,客户端会发一个PINGREQ消息,相应的,服务器会返回一个PINGRESP消息进行确认。如果服务器在一个半(1.5)心跳间隔时间周期内没有收到来自客户端的消息,就会断开与客户端的连接。心跳间隔时间最大值大约可以设置为18个小时,0值意味着客户端不断开。

  • 异步发布/订阅实现
    发布/订阅模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。
    发布者设定一个发布主题,订阅者可以订阅某个主题,然后发布者对该主题发布消息,订阅者收到消息后即可进行一系列操作。

  • 二进制格式实现
    MQTT基于二进制实现而不是字符串,MQTT固定报文头仅有两字节,所以相比其他协议,发送一条消息最省流量。
    (HTTP和XMPP都是基于字符串实现,拥有冗长的协议头部。)

  • MQTT的安全
    MQTT运行于TCP层之上并以明文方式传输,作为传输协议,MQTT仅关注消息传输。安全性由具体的开发者提供保障。
    全功能可以从三个层次来考虑——应用层、传输层、网络层。

  • 应用层:在应用层上,MQTT提供了客户标识(Client Identifier)以及用户名和密码,可以在应用层验证设备。

  • 传输层:类似于HTTPS,MQTT基于TCP连接,也可以加上一层TLS,传输层使用TLS加密是确保安全的一个好手段,可以防止中间人攻击。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。

  • 网络层:如果有条件的话,可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。

  • 认证

  • 应用层:MQTT支持客户标识、用户名和密码认证;

  • 传输层:传输层可以使用TLS,除了加密通讯,还可以使用X509证书来认证设备。

  • 客户标识
    MQTT客户端可以发送最多65535个字符作为客户标识(Client Identifier),一般来说可以使用嵌入式芯片的MAC地址或者芯片序列号。虽然使用客户标识来认证可能不可靠,但是在某些封闭环境或许已经足够了。

  • 用户名和密码
    MQTT协议支持通过CONNECT消息的username和password字段发送用户名和密码。
    一般来说,使用客户标识、用户名和密码已经足够了,如果感觉还不够安全,还可以在传输层进行认证。
    在传输层认证是这样的:MQTT代理在TLS握手成功之后可以继续发送客户端的X509证书来认证设备,如果设备不合法便可以中断连接。使用X509认证的好处是,在传输层就可以验证设备的合法性,在发送CONNECT消息之前便可以阻隔非法设备的连接,以节省后续不必要的资源浪费。而且,MQTT协议运行在使用TLS时,除了提供身份认证,还可以确保消息的完整性和保密性。

选择报文内容格式

MQTT协议只实现了传送消息的格式,并没有限制用户协议需要按照一定的风格,因此在MQTT协议之上,我们需要定义一套自己的通信协议。MQTT协议只实现了传送消息的格式,并没有限制用户协议需要按照一定的风格,因此在MQTT协议之上,我们需要定义一套自己的通信协议。
比如说,发布者向设备发布一条打开消息,设备可以回复一个消息并携带返回码,这样的消息格式是使用二进制、字符串还是JSON格式呢?

参考引用:https://blog.csdn.net/anxianfeng55555/article/details/80908795

相关文章

  • MOTT协议

    MQTT是什么? MQTT(Message Queuing Telemetry Transport,消息队列遥测传...

  • MOTT摩特贝壳模式app开发

    MOTT摩特贝壳挖矿系统开发找(欧生 137-6067-4940 微/电)、MOTT摩特贝壳挖矿区块链系统开发、M...

  • 算法(一)截取reads的算法

    原创:hxj7 关键词:phred; trim; mott; NGS(二代测序)分析的起点往往是fastq文件。f...

  • 肖申克的救赎经典台词

    这是一部看过很多遍的电影, 有很多寓意, 也许不同的人有不同的理解。 这部片子绝对称得上是经典中的经典, Mott...

  • 能将导体转变成超导体!新研究表明光脉冲能增强超导性!

    在正常的电子带理论中,Mott绝缘体应该导电,但它们不是由于电子之间的相互作用而导电。但是现在,来自理研所在进行开...

  • 基本介绍

    文集主要是整理了振幅计算的基础知识并计算了六个基本量子电动力学过程的低阶树图的振幅,其中包括Mott散射、Moll...

  • git协议

    git支持的协议 local协议 https协议 ssh协议 git协议 github常用的协议

  • Dubbo服务 上传文件解决方案以及Hessian协议

    协议支持Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebS...

  • Procotol 和 Delegate

    目录 Procotol 协议的概念 协议的分类 协议的定义 协议的遵循 协议的方法 协议的属性 Delegate ...

  • 计算机网络题目

    几种协议分别属于哪一层传输层协议:TCP协议、UDP协议应用层协议:FTP、HTTP、SMTP网络层协议:IP协议...

网友评论

      本文标题:MOTT协议

      本文链接:https://www.haomeiwen.com/subject/orhebqtx.html