mqtt 协议版本: 3.1.1
MQTT 介绍
互联网的基础网络协议是 TCP/IP协议.
MQTT(消息队列遥测传输)是基于 TCP/IP 协议栈而构建的, 已成为 IoT 通信的标准.
为什么选择 MQTT
MQTT 有多好多好, 多么牛逼我就不说了. 说的再多不如一个一个试, 试完了做比对, 剩下的那个就是要选择的.
实在不想这样搞, 技术就跟着一线走.
发布和订阅模型
MQTT 协议在网络中定义了两种实体类型: 一个消息代理和一些客户端.
代理是一个服务器, 它从客户端接收所有消息, 然后将这些消息路由到相关的目标客户端. 客户端就是能够与代理交互来发送和接收消息的.
客户端连接到代理. 它可以订阅代理中的任何消息 “主题”. 此连接可以是简单的 TCP/IP 连接, 也可以是用于发送敏感消息的加密 TLS 连接.
客户端通过将消息和主题发送给代理, 代理然后将消息转发给所有订阅该主题的客户端.
因为 MQTT 消息是按主题进行组织的, 所以应用程序开发人员能灵活地指定某些客户端只能与某些消息交互.
上图我们有两个主题分别是 config_change
device_data
.
设备将在 device_data
主题上发布设备数据, 经过 Broker 发送给所有订阅者接收(这里的订阅者是数据处理和存储).
而我们的设备控制器将命令发布到 config_change
主题, 经过 Broker 发送给所有订阅者接收(这里的订阅者是设备).
⚠️ Broker = 代理 = MQTT 服务器
MQTT Broker 选择
下面介绍几款MQTT服务器:
- Apache-Apollo: 一个代理服务器, 在 ActiveMQ 基础上发展而来, 可以支持 STOMP、AMQP、MQTT、Openwire、SSL和WebSockets 等多种协议, 并且 Apollo 提供后台管理页面, 方便开发者管理和调试.
- EMQ: 号称百万级开源MQTT消息服务器, 基于 Erlang/OTP 语言平台开发, 支持大规模连接和分布式集群, 发布订阅模式的开源MQTT消息服务器.
- HiveMQ: 一个企业级的MQTT代理,主要用于企业和新兴的机器到机器M2M通讯和内部传输, 最大程度的满足可伸缩性、易管理和安全特性, 提供免费的个人版. HiveMQ提供了开源的插件开发包.
- Mosquitto: 一款实现了消息推送协议MQTT v3.1的开源消息代理软件, 提供轻量级的、支持可发布/订阅的消息推送模式.
了解 MQTT 协议
更详细的协议介绍在这里
MQTT 是一种连接协议, 它指定了如何组织数据字节并通过 TCP/IP 网络传输它们. 但实际上, 开发人员并不需要了解这个连接协议.
所有 MQTT 库和工具都提供了直接处理这些消息的简单方法, 并能自动填充一些必需的字段, 比如消息和客户端 ID.
首先, 客户端发送一条 CONNECT 消息来连接代理. CONNECT 消息要求建立从客户端到代理的连接. CONNECT 消息包含以下内容参数.
表 1. CONNECT 消息参数
参数 | 说明 |
---|---|
cleanSession | 此标志指定连接是否是持久性的. 持久会话会将所有订阅和可能丢失的消息 (具体取决于 QoS) 都存储在代理中 (请参阅 表 3 获取 QoS 的描述) |
username | 代理的身份验证和授权凭证 |
password | 代理的身份验证和授权凭证 |
lastWillTopic | 连接意外中断时,代理会自动向某个主题发送一条 “last will” 消息. |
lastWillQos | “last will” 消息的 QoS. (请参阅 表 3 来查看 QoS 的描述) |
lastWillMessage | “last will” 消息本身 |
keepAlive | 这是客户端通过 ping 代理来保持连接有效所需的时间间隔 |
客户端收到来自代理的一条 CONNACK 消息. CONNACK 消息包含以下内容参数.
表 2. CONNACK 消息参数
参数 | 说明 |
---|---|
sessionPresent | 此参数表明连接是否已有一个持久会话. 也就是说, 连接已订阅了主题, 而且会接收丢失的消息. |
returnCode | 0 表示成功. 其他值指出了失败的原因. |
建立连接后, 客户端向代理发送一条或多条 SUBSCRIBE 消息, 表明它会从代理接收针对某些主题的消息. 如表 3.
表 3. SUBSCRIBE 消息参数
参数 | 说明 |
---|---|
qos | 表明此主题范围内的消息传送到客户端所需的一致程度. 值 0:不可靠, 消息基本上仅传送一次, 如果当时客户端不可用, 则会丢失该消息. 值 1:消息应传送至少 1 次. 值 2:消息仅传送一次. |
topic | 要订阅的主题. 一个主题可以有多个级别, 级别之间用斜杠字符分隔. 例如, “dw/demo” 和 “ibm/bluemix/mqtt” 是有效的主题. |
客户端成功订阅某个主题后, 代理会返回一条 SUBACK 消息, 其中包含一个或多个 returnCode 参数.
表 4. SUBACK 消息参数
参数 | 说明 |
---|---|
returnCode | SUBCRIBE 命令中的每个主题都有一个返回代码. 值 0 - 2:成功达到相应的 QoS 级别. 值 128:失败. |
与 SUBSCRIBE 消息对应, 客户端也可以通过 UNSUBSCRIBE 消息取消订阅一个或多个主题.
表 5. UNSUBSCRIBE 消息参数
参数 | 说明 |
---|---|
topic | 此参数可重复用于多个主题. |
客户端可向代理发送 PUBLISH 消息. 该消息包含一个主题和数据. 代理将消息转发给所有订阅该主题的客户端.
表 6. PUBLISH 消息参数
参数 | 说明 |
---|---|
topicName | 发布消息的相关主题. |
qos | 消息传递的服务质量水平. |
retainFlag | 此标志表明代理是否保留该消息作为针对此主题的最后一条已知消息. |
payload | 消息中的实际数据. 它可以是文本字符串或二进制大对象数据. |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。