java解析mqtt_谈MQTT消息传输协议(11.9)

前面讲物联网云平台,经常会谈到MQTT协议,下面对MQTT协议做一个简单总结。

MQTT(Message Queuing Telemetry

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

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

MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。其特点包括:

1.使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。

2.对负载内容屏蔽的消息传输机制。

3.对传输消息有三种服务质量(QoS):

a.最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1

b.至多一次,这一级别会确保消息到达,但消息可能会重复。即:>=1

c.只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别

4.数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量

5.通知机制,异常中断时通知传输双方

MQTT协议实现

对于MQTT协议本身也是基于消费发布订阅模式,对于实现MQTT协议需要:客户端和服务器端。在MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。

MQTT代理即MQTT服务器,提供类似消息中间件的能力,同时也提供消息重试,订阅管理等关键的消息发布订阅能力。对于MQTT代理实际是可以集成到物联网网关能力中,而不再部署单独的MQTT服务器,如果对于物联网厂家的集成解决方案中已经有独立的MQTT代理服务本期部署,那么就可以进一步来做MQTT代理服务器和网关间的接口服务集成。

消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分

1.

Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)

2. Payload,可以理解为消息的内容,是指订阅者具体要使用的内容

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

1. 订阅(Subscription)- 订阅包含主题筛选器(Topic

Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

2. 会话(Session)-

每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。

3. 主题名(Topic Name)-

表示客户端具体订阅的哪个消息,根据专题进行判断。

4. 主题筛选器(Topic

Filter)-订阅中包含的一个表达式,用于表示相关的一个或多个主题。

5.负载(Payload)- 消息订阅者所具体接收的内容

MQTT协议数据包结构

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable

header)、消息体(payload)三部分构成。MQTT数据包结构如下:

1. 固定头(Fixed header)-

存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。

2. 可变头(Variable header)-

存在于部分MQTT数据包中,数据包类型决定了可变头是否存在内容。

3. 消息体(Payload)- 存在于部分MQTT数据包中,表示客户端收到的具体内容。

很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是PUBLISH(QoS > 0时),

PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,

SUBACK,UNSUBSCIBE,UNSUBACK。

MQTT协议的优缺点分析

MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。它的核心设计思想是开源、可靠、轻巧、简单,具有以下主要的几项特性:

1. 非常小的通信开销(最小的消息大小为 2 字节);

2. 支持各种流行编程语言(包括C,Java,Ruby,Python

等等)且易于使用的客户端;

3. 支持发布 / 预定模型,简化应用程序的开发;

4. 提供三种不同消息传递等级,让消息能按需到达目的地,适应在不稳定工作的网络传输需求

对于传统的HTTP和MQ协议,MQTT的优势在哪里呢?

1. 低协议开销:MQTT 的独特之处在于,它的每消息标题可以短至 2 个字节。

2. 对不稳定网络的容忍:MQTT 和 MQ 能够从断开等故障中恢复,而且没有进一步的代码需求。

3. 低功耗:MQTT 是专门针对低功耗目标而设计的。HTTP 的设计没有考虑此因素,因此增加了功耗。

4. 数百万个连接的客户端:支持数百万个并发连接,而类似MQ 不是为大量并发客户端而设计的。

5. 推送通知:您需要能够及时地将通知传递给客户。而不需要轮询。节省功耗。

6. 客户端平台差异:HTTP 和 MQTT 客户端都已在大量平台上实现。

7. 防火墙容错:MQTT 可封装在一个 WebSockets 连接中,显示为一个 HTTP 升级请求。

MQTT协议的缺陷

由于MQTT本身的各项技术优势,越来越多的企业倾向于选用MQTT作为物联网产品通讯的标准协议,也因此,工程师们渐渐发现MQTT协议要想大规模商用,也有一些有待完善的功能。比如:

没有齐备的SDK,不同的异构终端,需要有对应的与MQTT服务器通信的软件SDK包,比如MCU、Linux、Android、IOS、WEB等之间要实现互联互通必然需要不同的SDK包

不支持与第三方HTTP的集成不支持负载均衡,为防止高并发和恶意攻击,负载均衡服务器也必不可少。

不支持用户管理接口不支持离线消息,弥补设备离线以后,MQTT服务器对设备的控制信息丢失的问题。

不支持点对点通信,采用标准的MQTT协议,理论上可以通过相互订阅的方式实现点对点通信,但是逻辑相对复杂,并且对设备的安全性方面存在担忧。当设备B和设备C在同一主题的情况下,设备A无法知道是设备B还是设备C发送的消息,也有可能消息被设备D窃听。

MQTT的Java客户端开发

对于使用Java客户端收发MQTT消息,可以参考阿里云的一篇帮助文章和指南

一般常用的方法就是通过Eclipse Paho Java SDK 来实现。Paho

Java客户端是一个用Java编写的MQTT客户端库,用于开发在JVM或其他Java兼容平台(如Android)上运行的应用程序。Paho

Java客户端提供了两个API:MqttAsyncClient提供了一个完全异步的API,通过已注册的回调通知完成活动。

MqttClient是MqttAsyncClient的一个同步包装,其中函数与应用程序同步。

你可能感兴趣的:(java解析mqtt)