实验目的
1)熟悉MQTT协议的功能
2)掌握MQTT协议发布和订阅的方法
实验准备
实验硬件: | PC电脑 |
实验软件: | eqmx 开源服务器、MQTTX桌面测试客户端 |
实验原理
MQTT简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT协议运行在TCP/IP,或其它提供了有序、可靠、双向连接的网络连接上。MQTT协议的功能及特点:
- 使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。
- 消息传输不需要知道负载内容。
- 提供三种等级的服务质量:
“最多一次(QoS0)”,尽操作环境所能提供的最大努力分发消息。消息可能会丢失。例如,这个等级可用于环境传感器数据,单次的数据丢失没关系,因为不久之后会再次发送。
“至少一次(QoS1)”,保证消息可以到达,但是可能会重复。
“仅一次(QoS2)”,保证消息只到达一次。例如,这个等级可用在一个计费系统中,这里如果 消息重复或丢失会导致不正确的收费。
- 很小的传输消耗和协议数据交换,最大限度减少网络流量。
- 异常连接断开发生时,能通知到相关各方。
MQTT协议工作原理
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(服务器)(Broker)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT客户端(Client) | MQTT服务器(Server) |
(1)发布其他客户端可能会订阅的信息; (2)订阅其它客户端发布的消息; (3)退订或删除应用程序的消息; (4)断开与服务器连接。 | (1)接受来自客户的网络连接; (2)接受客户发布的应用信息; (3)处理来自客户端的订阅和退订请求; (4)向订阅的客户转发应用程序消息。 |
- MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
- MQTT协议工作在TCP协议之上,因为客户端和服务器都是应用层,需要一种协议在两者之间进行通信,MQTT控制报文有3个部分组成:
分别是固定报头(fixed header)、可变报头(variable header)、有效荷载(数据区域payload)。固定报头,所有的MQTT控制报文都包含,可变报头与有效载荷是部分MQTT控制报文包含。
- MQTT控制报文的类型
类型 | 值 | 说明 |
Reserved | 0 | 系统保留 |
CONNECT | 1 | 客户端请求连接服务端 |
CONNACK | 2 | 连接报文确认 |
PUBLISH | 3 | 发布消息 |
PUBACK | 4 | 消息发布收到确认(QoS1) |
PUBREC | 5 | 发布收到(QoS2) |
PUBREL | 6 | 发布释放(QoS2) |
PUBCOMP | 7 | 消息发布完成(QoS2) |
SUBSCRIBE | 8 | 客户端订阅请求 |
SUBACK | 9 | 订阅请求报文确认 |
UNSUBSCRIBE | 10 | 客户端取消订阅请求 |
UNSUBACK | 11 | 取消订阅报文确认 |
PINGREQ | 12 | 心跳请求 |
PINGRESP | 13 | 心跳响应 |
DISCONNECT | 14 | 客户端断开连接 |
Reserved | 15 | 系统保留 |
- MQTT的订阅和发布
MQTT消息发布步骤:
1)发布者通过TCP/IP协议连接到代理服务器;
2)发布者向代理服务器发送CONNECT消息,请求连接;
3)代理服务器接收CONNECT消息后,将进行连接验证和身份认证;
4)连接验证和身份认证完成后,代理服务器向发布者发送CONNACK(连续报文确认)消息,表示连接已建立;
5)发布者向代理服务器发送PUBLISH消息,包含发布的消息内容和指定的主题。
MQTT消息订阅步骤:
1)订阅者通过TCP/IP协议连接到MQTT代理服务器;
2)订阅者想代理服务器发送CONNECT消息,请求连接;
3)代理服务器接收CONNECT消息后,将进行连接验证和身份认证;
4)连接验证和身份认证完成后,代理服务器向订阅者发送CONNACK(连续报文确认)消息,表示连接已建立;
5)订阅者向代理服务器发送SUBSCIRBE消息后,指定要订阅的主题和效应的QoS级别;
6)代理服务器接收到SUBSCRIBE消息后,根据订阅者请求进行主题订阅;
7)代理服务器向订阅者发送SUBACK(订阅请求报文确认)消息,表示订阅已被接受;
8)当有新的消息发布到订阅者订阅的主题上时,代理服务器将消息推送给订阅者;
MQTT消息取消订阅:
1)订阅者可以随时发送UNSUBSCRIBE消息,取消对某个或者多个主题的订阅;
2)代理服务器接受到UNSUBSCRIBE消息后,删除响应的订阅关系。
实验步骤
1)下载并安装emqx服务器和MQTTX桌面客户端:
点击下列链接进入官网:
- 下载 EMQX选择系统版本,下载并解压;
- 使用 MQTT 客户端快速测试 MQTT 服务 | EMQ (emqx.com),点击立即下载,进入新的页面,选择系统版本,点击免费下载,选择安装方式和CPU架构下载安装。
2)打开emqx下载后解压位置,用记事本格式打开“.\etc\emqx.conf”文件,记住地址。
3)在解压位置,鼠标右键菜单(win11系统使用shift+鼠标右键),选择再此处打开Powershell窗口,输入“.\bin\emqx start”命令,回车,等到下一行输入光标出现表示emqx服务器开启成功。
4)打开浏览器输入emqx.conf中地址,加上端口号18083(默认地址为127.0.0.1:18083)进入登录界面,初始账号为admin,初始密码为public,跳过修改密码,进入主页面,此时连接数、主题数、订阅数均为0。
5)打开MQTTX客户端,新建两个连接test1和test2:填写名称和服务器地址,其他可保持默认,点击连接,连接成功则左侧连接栏显示为绿色。此时emqx服务器连接数增加。
6)发布和订阅
在test1连接右下角设置发送的信息和目标主题“test/hello”;
在test2添加订阅主题“test/hello”。
7)实验完毕后,断开客户端连接,在Powershell中运行“.\bin\emqx stop”关闭服务器。
实验结果
在客户端test1连接中发送消息到主题,如果客户端test2订阅了该主题,则可以收到订阅该主题的信息;在客户端test2中发送消息到主题,由于客户端test1未订阅主题,所以收不到消息。
客户端连接服务器后的消息流入、发出和丢弃的统计信息,可在emqx服务器折线图中观测。