Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

 

Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

 

 

前言 诞生及优势

MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道。目标是拥有一个带宽有效且使用很少电池电量的协议,因为这些设备是通过卫星链路连接的,当时这种设备非常昂贵。 与HTTP及其请求/响应范例相比,该协议使用发布/订阅体系结构。发布/订阅是事件驱动的,可以将消息推送到客户端。中央通信点是MQTT代理,它负责调度发送者和合法接收者之间的所有消息。向代理发布消息的每个客户端都在消息中包含一个主题。主题是代理的路由信息​。每个想要接收消息的客户端都订阅某个主题,并且代理将具有匹配主题的所有消息传递给客户端。因此,客户不必彼此了解,他们只通过主题进行通信。该架构支持高度可扩展的解决方案,而不依赖于数据生产者和数据使用者。

Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

发布/订阅架构

与HTTP的区别在于客户端不必提取所需的信息,但是在有新内容的情况下,代理会将信息推送到客户端。因此,每个MQTT客户端都与代理具有永久打开的TCP连接。如果此连接在任何情况下中断,MQTT代理可以缓冲所有消息,并在它重新联机时将它们发送到客户端。 如前所述,MQTT中用于分派消息的核心概念是主题。主题是一个简单的字符串,可以有更多的层次结构级别,用斜杠分隔。用于发送起居室的温度数据的示例主题可以是房屋/起居室/温度。一方面,客户端可以订阅确切的主题,或者另一方面使用通配符。对房屋/ + /温度的订阅将导致所有消息发送到先前提到的主题房屋/起居室/温度以及在起居室的地方具有任意值的任何主题,例如房屋/厨房/温度。加号是单级通配符,只允许一个层次结构的任意值。如果您需要订阅多个级别,例如订阅整个子树,还有一个多级通配符)。它允许订阅所有底层层次结构级别。比如房子/#订阅以house开头的所有主题。

Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

 

 

适用人群

以下内容需要你对照着MQTT协议内容仔细推敲

推荐资源:

MQTT协议中文版: https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

MQTT Version 3.1.1:

 

MQTT控制报文格式 MQTT控制报文结构 结构 备注
Fixed header   固定报头,所有控制报文都包含  
Variable header   可变报头,部分控制报文包含  
Payload   有效载荷,部分控制报文包含  

 

固定报头 Fixed header +-----+-----+-----+-----+-----+------+------+------+-------+
|     |     |     |     |     |     |     |     |       |
| Bit | 7 | 6 | 5 | 4 | 3   | 2   | 1   | 0   |
+-----------+-----+-----+------------+------+------+-------+
|     |                       |                           |
|byte1|MQTT ControlPacket type|         Flags             |
+----------------------------------------------------------+
|     |                                                   |
|byte2|         Remaining Length                         |
+----------------------------------------------------------+

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsffgz.html