MQTT服务器初体验
背景
工作中用到了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 | 有效载荷,部分控制报文包含 |
控制报文
名字 | 值 | 报文流动方向 | 描述 |
---|---|---|---|
Reserved | 0 | 禁止 | 保留 |
CONNECT | 1 | 客户端到服务端 | 客户端请求连接服务端 |
CONNACK | 2 | 服务端到客户端 | 连接报文确认 |
PUBLISH | 3 | 两个方向都允许 | 发布消息 |
PUBACK | 4 | 两个方向都允许 | QoS 1消息发布收到确认 |
PUBREC | 5 | 两个方向都允许 | 发布收到(保证交付第一步) |
PUBREL | 6 | 两个方向都允许 | 发布释放(保证交付第二步) |
PUBCOMP | 7 | 两个方向都允许 | QoS 2消息发布完成(保证交互第三步) |
SUBSCRIBE | 8 | 客户端到服务端 | 客户端订阅请求 |
SUBACK | 9 | 服务端到客户端 | 订阅请求报文确认 |
UNSUBSCRIBE | 10 | 客户端到服务端 | 客户端取消订阅请求 |
UNSUBACK | 11 | 服务端到客户端 | 取消订阅报文确认 |
PINGREQ | 12 | 客户端到服务端 | 心跳请求 |
PINGRESP | 13 | 服务端到客户端 | 心跳响应 |
DISCONNECT | 14 | 客户端到服务端 | 客户端断开连接 |
Reserved | 15 | 禁止 | 保留 |
详细内容见[2],本文暂不进行展开介绍。