MQTT服务器初体验

  |   0 评论   |   0 浏览

背景

工作中用到了MQTT,本文来学习一下MQTT相关内容。

基础知识

简介

MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道。

目标:适合网络不佳情形,同时要省电。因为这些设备通过卫星链路连接。

特点:使用了发布/订阅体系结构。这种体系结构,通过事件驱动的,来进行消息的推送。MQTT接入点,只是一个代理,用来路由所有的消息。

路由方式:每个消息中都带有一个topic。接收消息的客户端,来订阅这个topic。然后MQTT接入点,会将订阅的内容,传递给客户端。

发布订阅架构

每个MQTT客户端,都通过TCP长连接的方式,与接入网关保持着连接,实时接收网关的消息推送。连接断开时,网关会缓存消息;连接恢复时,消息会重新发送给客户端。

订阅的topic,可以有层次结构,用斜杠分隔,如房屋/起居室/温度。订阅的时候,除了可以精确订阅,也可以通过通配符订阅,如房屋/+/温度来通过单级通配符,来通配一个层次结构的任意值;或者房屋/#来通过多级通配符,来订阅以house开头的所有主题。

MQTT控制报文结构

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

控制报文

名字报文流动方向描述
Reserved0禁止保留
CONNECT1客户端到服务端客户端请求连接服务端
CONNACK2服务端到客户端连接报文确认
PUBLISH3两个方向都允许发布消息
PUBACK4两个方向都允许QoS 1消息发布收到确认
PUBREC5两个方向都允许发布收到(保证交付第一步)
PUBREL6两个方向都允许发布释放(保证交付第二步)
PUBCOMP7两个方向都允许QoS 2消息发布完成(保证交互第三步)
SUBSCRIBE8客户端到服务端客户端订阅请求
SUBACK9服务端到客户端订阅请求报文确认
UNSUBSCRIBE10客户端到服务端客户端取消订阅请求
UNSUBACK11服务端到客户端取消订阅报文确认
PINGREQ12客户端到服务端心跳请求
PINGRESP13服务端到客户端心跳响应
DISCONNECT14客户端到服务端客户端断开连接
Reserved15禁止保留

详细内容见[2],本文暂不进行展开介绍。

参考

  1. Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上
  2. 第三章 MQTT控制报文 MQTT Control Packets