0-MQTT基础使用教程【学习】

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 可参考下表:

发布消息的 QoS 主题订阅的 QoS 接收消息的 QoS
0 0 0
0 1 0
0 2 0
1 0 0
1 1 1
1 2 1
2 0 0
2 1 1
2 2 2

1.4 Topic通配符匹配规则

层级分隔符:/

/ 用来分割主题树的每一层,并给主题空间提供分等级的结构。当两个通配符在一个主题中出现的时候,主题层次分隔符的使用是很重要的。

示例:
love/you/with/all/my/heart

多层通配符:#

多层通配符有可以表示大于等于0的层次。因此,love/#也可匹配到单独的love,此时#代表0层。

多层通配符一定要是主题树的最后一个字符。比如说,love/#是有效的,但是love/#/with是无效的。

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 其目录结构会有所不同,具体如下:

描述 使用 ZIP 压缩包安装(同docker) 使用二进制包安装
可执行文件目录 ./bin /usr/lib/emqx/bin
数据文件 ./data /var/lib/emqx/data
Erlang 虚拟机文件 ./erts-* /usr/lib/emqx/erts-*
配置文件目录 ./etc /etc/emqx
依赖项目录 ./lib /usr/lib/emqx/lib
日志文件 ./log /var/log/emqx
启动相关的脚本、schema 文件 ./releases /usr/lib/emqx/releases

以上目录中,用户经常接触与使用的是 binetcdatalog 目录。

bin 目录

emqx、emqx.cmd:EMQ X 的可执行文件

emqx_ctl、emqx_ctl.cmd:EMQ X 管理命令的可执行文件

etc 目录

EMQ X 通过 etc 目录下配置文件进行设置,主要配置文件包括:

配置文件 说明
emqx.conf EMQ X 配置文件
acl.conf EMQ X 默认 ACL 规则配置文件
plugins/*.conf EMQ X 各类插件配置文件
certs/* EMQ X SSL 证书文件
emqx.lic License 文件仅限 EMQ X Enterprise

data 目录

EMQ X 将运行数据存储在 data 目录下,主要的文件包括:

configs/app.*.config

EMQ X 读取 etc/emqx.confetc/plugins/*.conf 中的配置后,转换为 Erlang 原生配置文件格式,并在运行时读取其中的配置。

loaded_plugins

loaded_plugins 文件记录了 EMQ X 默认启动的插件列表,可以修改此文件以增删默认启动的插件。

$ cat loaded_plugins
emqx_management.
emqx_recon.
emqx_retainer.
emqx_dashboard.
emqx_rule_engine.
emqx_web_hook.

mnesia

Mnesia 数据库是 Erlang 内置的一个分布式 DBMS,可以直接存储 Erlang 的各种数据结构。

EMQ X 使用 Mnesia 数据库存储自身运行数据,例如告警记录、规则引擎已创建的资源和规则、Dashbaord 用户信息等数据,这些数据都将被存储在 mnesia 目录下,因此一旦删除该目录,将导致 EMQ X 丢失所有业务数据。

2.3 Dashboard

2.3.1 功能简介

EMQ X 提供了 Dashboard 以方便用户管理设备与监控相关指标。通过 Dashboard可以查看服务器基本信息、负载情况和统计数据,可以查看某个客户端的连接状态等信息甚至断开其连接,也可以动态加载和卸载指定插件。除此之外,EMQ X Dashboard 还提供了规则引擎的可视化操作界面,同时集成了一个简易的 MQTT 客户端工具供用户测试使用。

EMQ X Dashboard 是一个 Web 应用程序,你可以直接通过浏览器来访问它,无需安装任何其他软件。

当 EMQ X 成功运行在你的本地计算机上且 EMQ X Dashboard 被默认启用时,通过访问 http://localhost:18083 来查看Dashboard,默认用户名是 admin,密码是 public

为了使用户在操作和浏览中可以快速地定位和切换当前位置,EMQ X Dashboard 采用了侧边导航的模式,默认情况下 Dashboard 包含以下一级导航项目:

最新版本EMQ X Broker的Dashboard界面布局略有不同,增加了些导航,但基本都差不多

导航项目 说明
Monitor 提供了服务端与客户端监控信息的展示页面
RULE ENGINE 提供了规则引擎的可视化操作页面
MANAGEMENT 提供了扩展插件与应用的管理页面
TOOLS 提供了 WebSocket 客户端工具以及 HTTP API 速查页面
ADMIN 提供了 Dashboard 用户管理和显示设置等页面
2.3.2 Websocket发布订阅测试

2.4 客户端调试工具MQTTX

MQTT XEMQ 开源的一款优雅的跨平台 MQTT 5.0 桌面客户端,它支持 macOS, Linux, Windows。

MQTT XUI 采用了聊天界面形式,简化了页面操作逻辑,用户可以快速创建连接,允许保存多个客户端,方便用户快速测试 MQTT/MQTTS 连接,及 MQTT 消息的订阅和发布。
在这里插入图片描述

https://mqttx.app/cn

3.延迟发布

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。以下是使用MQTT的基本步骤: 1. 安装MQTT客户端库:你可以使用Java、Python等语言的MQTT客户端库,例如Paho MQTT,Eclipse MQTT等。 2. 配置MQTT客户端:在客户端代码中,你需要设置MQTT代理的IP地址和端口号,以及订阅或发布的主题(topic)。 3. 连接到MQTT代理:使用MQTT客户端库,你可以创建一个MQTT客户端实例,并使用该实例连接到MQTT代理。 4. 发布消息:使用MQTT客户端库,你可以向MQTT代理发布消息。在发布消息时,你需要指定消息的主题和内容。 5. 订阅消息:使用MQTT客户端库,你可以订阅MQTT代理中的主题。当MQTT代理接收到与订阅的主题匹配的消息时,将会将该消息发送给订阅者。 以下是Python中使用Paho MQTT库实现发布和订阅MQTT消息的示例代码: ``` import paho.mqtt.client as mqtt # 连接到MQTT代理 client = mqtt.Client() client.connect("localhost", 1883) # 发布消息 client.publish("topic/test", "Hello, MQTT!") # 订阅消息 def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client.on_message = on_message client.subscribe("topic/test") client.loop_forever() ``` 该代码将会连接到localhost:1883的MQTT代理,发布一条主题为“topic/test”,内容为“Hello, MQTT!”的消息,并订阅“topic/test”主题。当有符合该主题的消息到达代理时,将会调用on_message函数并打印该消息的主题和内容。 希望这些信息能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值