mqtt协议 是什么,做什么,怎么做

特别感谢文章所引用文献作者:
https://www.cnblogs.com/saryli/p/9742709.html
为什么物联网通信协议常用http或mqtt而不是tcp.socket长连接? - Dirax的回答 - 知乎
https://www.zhihu.com/question/290477424/answer/1055143027
MQTT系列 | MQTT的基础概念 - 程序锅的文章 - 知乎
https://zhuanlan.zhihu.com/p/79455828
MQTT - 小t的文章 - 知乎
https://zhuanlan.zhihu.com/p/114280136
云端协议MQTT介绍 - 剑指工控的文章 - 知乎
https://zhuanlan.zhihu.com/p/148370513

mqtt协议中文文档
https://mcxiaoke.gitbooks.io/mqtt-cn/content/

物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP
mqtt协议 是什么,做什么,怎么做
连接阿里云平台,实现数据传输显示
本次例子使用stm32f103c8t6核心板和正点原子atk esp8266wifi模块

mqtt协议究竟可以做什么

以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用
在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

文章基础-常见物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP*

-图片来源https://www.cnblogs.com/saryli/p/9742709.html

-HTTP协议应用缺点:

  • 由于必须由设备主动向服务器发送数据,难以主动向设备推送数据。
  • 安全性不高。
  • 不同于用户交互终端如pc、手机,物联网场景中的设备多样化,对于运算和存储资源都十分受限的设备,http协议实现、XML/JSON数据格式的解析,都是不可能的任务

- CoAP协议

适用范围:CoAP是简化了HTTP协议的RESTful API,CoAP是6LowPAN协议栈中的应用层协议,它适用于在资源受限的通信的IP网络

-MQTT协议(低带宽)

适用范围:在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。
一般适用于设备数据采集到端(Device-》Server,Device-》Gateway),集中星型网络架构(hub-and-spoke),不适用设备与设备之间通信,设备控制能力弱,另外实时性较差,一般都在秒级

- DDS协议(高可靠性、实时)

适用范围:分布式高可靠性、实时传输设备数据通信。目前DDS已经广泛应用于国防、民航、工业控制等领域;
DDS很好地支持设备之间的数据分发和设备控制,设备和云端的数据传输,同时DDS的数据分发的实时效率非常高,能做到秒级内同时分发百万条消息到众多设备。DDS在服务质量(QoS)上提供非常多的保障途径,但这些应用都工作在有线网络下,在无线网络,特别是资源受限的情况下,没有见到过实施案例

- AMQP协议(互操作性)

适用范围:最早应用于金融系统之间的交易消息传递,在物联网应用中,主要适用于移动手持设备与后台数据中心的通信和分析

-XMPP协议(即时通信)

适用范围:即时通信的应用程序,还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等
XMPP是基于XML的协议,由于其开放性和易用性,在互联网及时通讯应用中运用广泛。相对HTTP,XMPP在通讯的业务流程上是更适合物联网系统的,开发者不用花太多心思去解决设备通讯时的业务通讯流程,相对开发成本会更低。但是HTTP协议中的安全性以及计算资源消耗的硬伤并没有得到本质的解决

- JMS (Java Message Service)

Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

1. mqtt协议是什么并且为什么使用mqtt协议

(难免有不足之处,请在评论去指出提醒我或者私信我)

mqtt协议是什么

MQTT协议最初是用在石油管道上传感器向卫星传输状态数据,其协议设计之初就是为了适应比较恶劣的网络环境。MQTT不同的消息类型有不同可变头来和不同荷载,相比于HTTP固定的报头也更加轻量、传输字节少,这可能也是MQTT号称耗电少的原因MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布/订阅信息传输协议。
#相较与其他通讯mqtt的优点

mqtt订阅/发布模式

MQTT的通信是通过发布/订阅的方式来实现的,订阅和发布又是基于主题(Topic)的。发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们需要一个中间方。在 MQTT 里面我们称之为 Broker,用来进行消息的存储和转发。 mqtt封装了TCP socket,相当于消息总线,只用往消息总线发一条消息,所有连接到这个消息总线的服务都可以收到消息的备份,就是,服务端只需要发一条,多个设备就可以同时收到同样的消息 收发消息都是异步的,发送方不需要等待接收方应答
一次典型的 MQTT 消息通信流程如下所示:

mqtt通信模型
发布方(Publisher)连接到Broker;
订阅方(Subscriber)连接到Broker,并订阅主题Topic1;
发布方(Publisher)发送给Broker一条消息,主题为Topic1;
Broker收到了发布方的消息,发现订阅方(Subscriber)订阅了Topic1,然后将消息转发给订阅方(Subscriber);
订阅方从Broker接收该消息

****

三种消息发布服务质量(QoS):

  • “至多一次”,消息发布完全依赖底层 TCP/IP 网络,会发生消息丢失或重复,这一级别可用于对采集数据要求不严格的情况
  • “至少一次”,确保消息到达,但消息可能会重复发生
  • “只有一次”,确保消息只到达一次,这一级别可用于要求严格如涉及计费系统的情况,消息重复或丢失都是不允许的

总结特点

MQTT是二进制使用TCP/IP提供网络连接的协议

  • 控制字段是精确到Bit级别的,单纯这一点就足以为其在物联网领域占据一席之地,
  • 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量
  • 收发消息都是异步的,发送方不需要等待接收方应答,
  • 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
    Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
    Testament:遗嘱机制,功能类似于Last Will
  • 并且面向流,内存占用低
  • 可以支持上行和下行。
  • 对负载内容屏蔽的消息传输
  • 有三种消息发布服务质量,“至多一次”,“至少一次”,“只有一次”
  • 但是MQTT是不支持分包等机制,并不适宜一些数据包特别大的应用场景

2. mqtt协议的实现和使用

MQTT协议中的订阅、主题、会话

一、订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
二、会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
三、主题名(Topic Name)
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
四、主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
五、负载(Payload)
消息订阅者所具体接收的内容。4.6 MQTT协议中的方法MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:
(1)Connect。等待与服务器建立连接。
(2)Disconnect。等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。
(3)Subscribe。等待完成订阅。
(4)UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。
(5)Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。

MQTT协议数据包结构

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:
(1)固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
(2)可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
(3)消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容

  1. MQTT固定头
    在这里插入图片描述
    固定头存在于所有MQTT数据包中,其结构如下:
    1.1 MQTT数据包类型位置:
    Byte 1中MQTT控制报文的类型。描述如下:
    MQTT控制报文的类型
    1.2 标识位位置:
    Byte 1。在不使用标识位的消息类型中,标识位被作为保留位。如果收到无效的标志时,接收端必须关闭网络连接:
    标识符
    (1)DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
    (2)QoS:发布消息的服务质量,即:保证消息传递的次数Ø00:最多一次,即:<=1Ø01:至少一次,即:>=1Ø10:一次,即:=1Ø11:预留
    (3)RETAIN:发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放
    1.3 剩余长度(Remaining Length)
    地址:Byte 2。固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为1时,表示长度不足,需要使用二个字节继续保存。例如:计算出后面的大小为0
    剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此每个字节可以编码128个数值和一个延续位(continuation bit)。剩余长度字段最大4个字节
    剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

  2. MQTT可变头

MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是作为包的标识:很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK。

  1. Payload消息体

Payload消息体位MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:
(1)CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
(2)SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
(3)SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
(4)UNSUBSCRIBE,消息体内容是要订阅的主题。

mqtt协议中文文档
https://mcxiaoke.gitbooks.io/mqtt-cn/content/

免责申明:本文章为本号原创或根据网络搜索编辑整理,文章版权归原作者所有。因转载众多,无法找到真正来源,如标错来源,或对于文中所使用的图片,资料,下载链接中所包含的软件,资料等,如有侵权,请跟我联系协商或删除,谢谢

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值