MQTT基础使用教程
1. MQTT
1.1 MQTT简介
1.1.1 什么是MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:
- (1)发布其他客户端可能会订阅的信息;
- (2)订阅其它客户端发布的消息;
- (3)退订或删除应用程序的消息;
- (4)断开与服务器连接。
MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:
- (1)接受来自客户的网络连接;
- (2)接受客户发布的应用信息;
- (3)处理来自客户端的订阅和退订请求;
- (4)向订阅的客户转发应用程序消息。
1.1.2 设计原则
由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:
-
(1)精简,不添加可有可无的功能;
-
(2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递,解耦Client/Server模式,带来的好处在于不必预先知道对方的存在(ip/port),不必同时运行;
-
(3)允许用户动态创建主题(不需要预先创建主题),零运维成本;
-
(4)把传输量降到最低以提高传输效率;
-
(5)把低带宽、高延迟、不稳定的网络等因素考虑在内;
-
(6)支持连续的会话保持和控制(心跳);
-
(7)理解客户端计算能力可能很低;
-
(8)提供服务质量( quality of service level:QoS)管理
-
(9)不强求传输数据的类型与格式,保持灵活性(指的是应用层业务数据)。
1.1.3 应用领域
MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。
- 物联网M2M通信,物联网大数据采集
- Android消息推送,WEB消息推送
- 移动即时消息,例如Facebook Messenger
- 智能硬件、智能家居、智能电器
- 车联网通信,电动车站桩采集
- 智慧城市、远程医疗、远程教育
- 电力、石油与能源等行业市场
1.2 MQTT协议相关概念
1.2.1 MQTT协议实现方式
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publisher)、代理(Broker)(服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
- (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
- (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
1.2.2 MQTT协议中的方法
MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:
- (1)CONNECT:客户端连接到服务器
- (2)CONNACK:连接确认
- (3)PUBLISH:发布消息
- (4)PUBACK:发布确认
- (5)PUBREC:发布的消息已接收
- (6)PUBREL:发布的消息已释放
- (7)PUBCOMP:发布完成
- (8)SUBSCRIBE:订阅请求
- (9)SUBACK:订阅确认
- (10)UNSUBSCRIBE:取消订阅
- (11)UNSUBACK:取消订阅确认
- (12)PINGREQ:客户端发送心跳
- (13)PINGRESP:服务端心跳响应
- (14)DISCONNECT:断开连接
- (15)AUTH:认证
1.3 消息服务质量QoS
MQTT 协议中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,QoS 的设计是 MQTT 协议里的重点。作为专为物联网场景设计的协议,MQTT 的运行场景不仅仅是 PC,而是更广泛的窄带宽网络和低功耗设备,如果能在协议层解决传输质量的问题,将为物联网应用的开发提供极大便利。
1.3.1 消息服务质量QoS三个等级
MQTT 设计了 3 个 QoS 等级。
-
QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息。
-
QoS 1:消息传递至少 1 次。
-
QoS 2:消息仅传送一次。
QoS0:“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
QoS1:“至少一次”,确保消息到达,但消息重复可能会发生。
QoS2:“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
1.3.2 发布与订阅QoS
MQTT 发布与订阅操作中的 QoS 代表了不同的含义,发布时的 QoS 表示消息发送到服务端时使用的 QoS,订阅时的 QoS 表示服务端向自己转发消息时可以使用的最大 QoS。
- 当客户端 A 的发布 QoS 大于客户端 B 的订阅 QoS 时,服务端向客户端 B 转发消息时使用的 QoS 为客户端 B 的订阅 QoS。
- 当客户端 A 的发布 QoS 小于客户端 B 的订阅 QoS 时,服务端向客户端 B 转发消息时使用的 QoS 为客户端 A 的发布 QoS。
不同情况下客户端收到的消息 QoS 可参考下表:
1.4 Topic通配符匹配规则
层级分隔符:/
示例:
love/you/with/all/my/heart
多层通配符:#
love/you/# 可匹配如下内容(包括但不限于)
love/you
love/you/with
love/you/with/all
love/you/with/all/my/heart
love/you/with/all/my/hearts
单层通配符:+
1. love/you/+ :匹配love/you/with和love/you/and,但是不匹配love/you/with/all/my/heart。
2. 单层通配符只匹配1层,love/+不匹配love。
3. 单层通配符可以被用于主题树的任意层级,连带多层通配符。它必须被用在主题层级分隔符/的右边,除非它是指定自己。因此,+和love/+都是有效的,但是love+无效。单层通配符可以用在主题树的末端,也可以用在中间。比如说,love/+和love/+/with都是有效。
注意事项
1.主题层次分隔符被用来在主题中引入层次。多层的通配符和单层通配符可以被使用,但他们不能被使用来做发布者的消息。
2.Topic命名尽量见名知意,符合规范,主题名字是大小写敏感的。比如说,love和LOVE是两个不同的主题。
3.以/开头会产生一个不同的主题。比如说,/love与love不同。/love匹配"+/+"和/+,但不匹配+
4.不要在任何主题中包含null(Unicode \x0000)字符。
5.在主题树中,长度被限制于64k内但是在这以内没有限制层级的数目 。
6.可以有任意数目的根节点;也就是说,可以有任意数目的主题树。
2. EMQX
2.1 EMQ X简介
EMQ X 是开源社区中最流行的 MQTT 消息服务器。
EMQ官网:https://www.emqx.cn/
EMQ X 公司主要提供三个版本:开源版、企业版、平台版 可在官网首页产品导航查看每一种产品;主要体现在支持的连接数量、产品功能和商业服务等方面的区别。
**为什么选择EMQ X ?**从支持 MQTT5.0、稳定性、扩展性、集群能力等方面考虑,EMQX 的表现应该是最好的。
EMQ X 是开源百万级分布式 MQTT 消息服务器(MQTT Messaging Broker),用于支持各种接入标准 MQTT 协议的设备,实现从设备端到服务器端的消息传递,以及从服务器端到设备端的设备控制消息转发。从而实现物联网设备的数据采集,和对设备的操作和控制。
与别的MQTT服务器相比EMQ X 主要有以下的特点:
-
经过100+版本的迭代,EMQ X 目前为开源社区中最流行的 MQTT 消息中间件,在各种客户严格的生产环境上经受了严苛的考验;
-
EMQ X 支持丰富的物联网协议,包括 MQTT、MQTT-SN、CoAP、 LwM2M、LoRaWAN 和 WebSocket 等;
-
优化的架构设计,支持超大规模的设备连接。企业版单机能支持百万的 MQTT 连接;集群能支持千万级别的 MQTT 连接;
-
易于安装和使用;
-
灵活的扩展性,支持企业的一些定制场景;
-
中国本地的技术支持服务,通过微信、QQ等线上渠道快速响应客户需求;
-
基于 Apache 2.0 协议许可,完全开源。EMQ X 的代码都放在 Github 中,用户可以查看所有源代码。
-
EMQ X 3.0 支持 MQTT 5.0 协议,是开源社区中第一个支持 5.0协议规范的消息服务器,并且完全兼容 MQTT V3.1 和 V3.1.1 协议。除了 MQTT 协议之外,EMQ X 还支持别的一些物联网协议
-
单机支持百万连接,集群支持千万级连接;毫秒级消息转发。EMQ X 中应用了多种技术以实现上述功能,
- 利用 Erlang/OTP 平台的软实时、高并发和容错(电信领域久经考验的语言)
- 全异步架构
- 连接、会话、路由、集群的分层设计
- 消息平面和控制平面的分离等
-
扩展模块和插件,EMQ X 提供了灵活的扩展机制,可以实现私有协议、认证鉴权、数据持久化、桥接转发和管理控制台等的扩展
-
桥接:EMQ X 可以跟别的消息系统进行对接,比如 EMQ X Enterprise 版本中可以支持将消息转发到 Kafka、RabbitMQ 或者别的 EMQ 节点等
-
共享订阅:共享订阅支持通过负载均衡的方式在多个订阅者之间来分发 MQTT 消息。比如针对物联网等数据采集场景,会有比较多的设备在发送数据,通过共享订阅的方式可以在订阅端设置多个订阅者来实现这几个订阅者之间的工作负载均衡
2.2 环境搭建与配置
2.2.1 安装
安装的方式有很多种,可供自由选择:
Shell脚本安装、包管理器安装、二进制包安装、ZIP压缩包安装、Homebrew安装、Docker运行安装、Helm安装、源码编译安装
Docker运行安装
在EMQ X Broker下载页面直接提供的有基于docker的安装命令
1:首先拉取emqx的镜像
[root@docker emqx]# docker pull emqx/emqx:v4.1.0
2:使用docker命令运行得到docker容器
[root@docker emqx]# docker run -tid --name emqx -p 1883:1883 -p 8083:8083 -p 8081:8081 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.1.0
EMQ X broker提供了Dashboard 以方便用户管理设备与监控相关指标,启动后我们通过访问服务端18083端口
地址:http://192.168.200.128:18083
访问Dashboard 查看启动效果!
2.2.2 目录结构
不同安装方式得到的 EMQ X 其目录结构会有所不同,具体如下: