物联网MQTT协议

物联网MQTT协议

1.MQTT协议是什么?

MQTT协议最早是由IBM公司提出的,它最初的用途是将石油管道上的传感器与卫星相链接。顾名思义,它是一种支持在各方之间异步通信的消息协议。MQTT的全称是“Message Queuing Telemetry Transport”,没错,和我们开发中常用的rabbitmq、activemq、kafka等“消息队列”的概念很像。MQTT 是用于物联网 (IoT) 的 OASIS 标准消息传递协议。 它被设计为一种极其轻量级的发布/订阅消息传输,非常适合连接具有少量代码占用和最小网络带宽的远程设备。现如今,MQTT 被广泛用于各种行业,例如汽车、制造、电信、石油和天然气等。

2.为什么使用MQTT协议

由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:

(1)精简,不添加可有可无的功能;
(2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
(3)允许用户动态创建主题,零运维成本;
(4)把传输量降到最低以提高传输效率;
(5)把低带宽、高延迟、不稳定的网络等因素考虑在内;
(6)支持连续的会话控制;
(7)理解客户端计算能力可能很低;
(8)提供服务质量管理;
(9)假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

2.1.HTTP协议构建物联网应用有哪些弊病

我们进行web开发中最常用的HTTP协议构建物联网应用有哪些弊病呢?因为HTTP协议的首部(header)比较大,而且每次发送数据都要发送一个数据包来连接/断开TCP,因此发送的数据越多,数据总通信量也就越大。而MQTT 的首部比较小,还能在维持TCP 连接的同时,进行下一次数据的收发,所以比起HTTP,它更能抑制数据总通信量。

除此之外,在使用MQTT 时还要注意一点,即应该一边维持MQTT的TCP 连接,一边进行数据的发送和接收。因为MQTT 是通过维持TCP 连接来削减通信量的,所以要是每次进行数据通信都断开TCP 连接,MQTT 就会跟HTTP 一样在每次发送数据时都执行连接和断开处理,结果反而会增加通信量。

2.2.自定义协议构建物联网应用

自定义协议设计的好也可以拥有MQTT相同的优点,但是因为是自定义所以开发设计成本较高,扩展性、通用性不友好,可能会经常涉及修改,如果面向第三方对接开发成本也较高。

3.MQTT消息的QOS

MQTT支持三种QOS等级:

QoS 0:“最多一次”,消息发布完全依赖底层 TCP/IP 网络。分发的消息可能丢失或重复。例如,这个等级可用于环境传感器数据,单次的数据丢失没关系,因为不久后还会有第二次发送。

QoS 1:“至少一次”,确保消息可以到达,但消息可能会重复。

QoS 2:“只有一次”,确保消息只到达一次。例如,这个等级可用在一个计费系统中,这里如果消息重复或丢失会导致不正确的收费。

4.MQTT控制报文的结构

MQTT协议通过交换预定义的MQTT控制报文来通信。这一节描述这些报文的格式。MQTT控制报文由三部分组成:

部分说明
Fixed header固定报头,所有控制报文都包含。里面指出报文的类型和等级。
Variable header可变报头,部分控制报文包含
Payload有效载荷,部分控制报文包含

注意:上面的说的报文的类型。是指连接(CONNECT),发布(PUBLISH)等。而等级是指服务质量 (QoS) 。

具体报文中每个字节的含义请参看:MQTT官方文档

5.MQTT的消息类型

序号消息类型说明
1CONNECT客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是CONNECT报文 [MQTT-3.1.0-1]
2CONNACK确认连接请求:服务端发送CONNACK报文响应从客户端收到的CONNECT报文。 服务端发送给客户端的第一个报文必须是CONNACK。如果客户端在合理的时间内没有收到服务端的CONNACK报文, 客户端应该关闭网络连接。合理的时间取决于应用的类型和通信基础设施。
3PUBLISH发布消息:PUBLISH控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息。
4PUBACK发布确认:PUBACK报文是对QoS 1等级的PUBLISH报文的响应。
5PUBREC发布收到( QoS 2, 第一步):PUBREC报文是对QoS等级2的PUBLISH报文的响应。 它是QoS 2等级协议交换的第二个报文。
6PUBREL发布释放( QoS 2, 第二步):PUBREL报文是对PUBREC报文的响应。 它是QoS 2等级协议交换的第三个报文。
7PUBCOMP发布完成( QoS 2, 第三步):PUBCOMP报文是对PUBREL报文的响应。 它是QoS 2等级协议交换的第四个也是最后一个报文。
8SUBSCRIBE订阅主题:客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅。 每个订阅注册客户端关心的一个或多个主题。 为了将应用消息转发给与那些订阅匹配的主题, 服务端发送PUBLISH报文给客户端。 SUBSCRIBE报文也( 为每个订阅) 指定了最大的QoS等级, 服务端根据这个发送应用消息给客户端。
9SUBACK订阅确认:服务端发送SUBACK报文给客户端, 用于确认它已收到并且正在处理SUBSCRIBE报文。
10UNSUBSCRIBE取消订阅:客户端发送UNSUBSCRIBE报文给服务端, 用于取消订阅主题。
11UNSUBACK取消订阅确认:服务端发送UNSUBACK报文给客户端用于确认收到UNSUBSCRIBE报文。
12PINGREQ心跳请求:客户端发送PINGREQ报文给服务端的。 用于:1. 在没有任何其它控制报文从客户端发给服务的时, 告知服务端客户端还活着。2. 请求服务端发送 响应确认它还活着。3. 使用网络以确认网络连接没有断开。
13PINGRESP心跳响应:服务端发送PINGRESP报文响应客户端的PINGREQ报文。 表示服务端还活着。
14DISCONNECT断开连接:DISCONNECT报文是客户端发给服务端的最后一个控制报文。 表示客户端正常断开连接。

6.后续

在下一篇文章我将介绍EMQ X 开源版的搭建和使用,并使用java代码编写一个简单的发布订阅的例子。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值