mqtt

安装

准备好docker环境
安装

1
2
3
4
5
6
7
8
docker run -d --name emqx-enterprise \
-p 1883:1883 -p 8083:8083 \
-p 8084:8084 -p 8883:8883 \
-p 18083:18083 \
-v emqx_data:/opt/emqx/data \
-v emqx_log:/opt/emqx/log \
-v emqx_etc:/opt/emqx/etc \
emqx/emqx-enterprise:5.6.1
端口号 说明
1883 TCP端口
8083 WebSocket端口
8084 WebSocket Secure 端口
8883 SSL/TLS 端口
18083 Broker的Dashboard访问端口号

Dashboard

http://localhost:18083/

换成自己的ip
http://192.168.1.100:18083/

admin/public

重置密码:

1
2
# 进入容器内部
./bin/emqx ctl admins passwd <Username> <Password>

EMQX客户端

MQTTX官网:https://mqttx.app/zh

1.MQTTX

桌面端工具

点连接之后,可以看到已经建立了连接

再次添加一个connection,名字sub

然后添加一个订阅,topic=a

同样的订阅管理可以看到对应的topic

pub中指定发送的topic=a,然后点击发送

可以发现sub成功接收到了对应的消息

2.MQTTX CLI

命令行工具

下载MQTTX CLI:https://mqttx.app/zh/downloads?os=windows

-t表示的是主题的名称
sub表示订阅 pub表示发布

1
./mqttx-cli-win-x64.exe sub -t 'b' -h 192.168.1.100 -p 1883  -v
1
./mqttx-cli-win-x64.exe pub -t 'b' -q 0 -h 192.168.1.100 -p 1883 -m "from MQTTX CLI"

可以看到一边消息发送出去,另外一边接收到了对应的消息

3.MQTTX Web

1
2
3
4
docker pull emqx/mqttx-web
# 这里80端口可能跟nginx冲突了
# docker run -d --name mqttx-web -p 80:80 emqx/mqttx-web
docker run -d --name mqttx-web -p 81:80 emqx/mqttx-web

浏览器:http://192.168.1.100:81/

界面与客户端一样

控制报文

在 MQTT 中,无论是什么类型的控制报文,它们都由固定报头、可变报头和有效载荷三个部分组成。

固定报头固定存在于所有控制报文中而可变报头和有效载荷是否存在以及它们的内容则取决于具体的报文类型。例如用于维持连接的 PINGREQ 报文就只有一个固定报

头,用于传递应用消息的 PUBLISH 报文则完整地包含了这三个部分。

固定报头

固定报头由报文类型、标识位和报文剩余长度三个字段组成。

报文类型

占4个bit位,是一个无符号的整数

常见的报文类型:https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901022

标识位

占4个bit位,不过到 MQTT 5.0 为止,只有 PUBLISH 报文的这四个比特位被赋予了明确的含义:

1、Bit 3:DUP,表示当前 PUBLISH 报文是否是一个重传的报文。

2、Bit 2,1:QoS,表示当前 PUBLISH 报文使用的服务质量等级。

3、Bit 0:Retain,表示当前 PUBLISH 报文是否是一个保留消息。

其他所有的报文中,这 4 位都仍是保留的。

剩余长度

剩余长度指示了当前控制报文剩余部分的字节数,也就是可变报头和有效载荷这两个部分的长度。MQTT 控制报文的总长度= 固定报头的长度 + 剩余长度。

可变报头

可变报头的内容取决于具体的报文类型。

举例:

1、CONNECT 报文的可变报头按顺序包含了协议名、协议级别、连接标识、Keep Alive 和属性这五个字段

2、PUBLISH 报文的可变报头则按顺序包含了主题名、报文标识符和属性这三个字段。

属性是 MQTT 5.0 引入的一个概念。属性字段基本上都是可变报头的最后一部分,由属性长度和紧随其后的一组属性组成,这里的属性长度指的是后面所有属性的总长度

所有的属性都是可选的,因为它们通常都有一个默认值,如果没有任何属性,那么属性长度的值就为0。属性通常都是为了某个专门的用途而设计的,不同的报文所支持的属

性都是不一样的,具体的对应情况可以查看官网地址:https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901027

有效载荷

有效载荷是用于实现对应报文的核心功能。

举例:

1、在 PUBLISH 报文中,Payload 用于承载具体的应用消息内容,这也是 PUBLISH 报文最核心的功能。

2、在 SUBSCRIBE 报文中,Payload 包含了想要订阅的主题以及对应的订阅选项,这也是 SUBSCRIBE 报文最主要的工作。

报文验证

安装wireshark,选择VM8网卡

协议输入mqtt

接下来我们通过Wireshark工具,抓取一下各种通讯操作所涉及到的报文。

链接相关报文验证:

发布相关报文:

上述发布的消息QoS的值设置为0,因此看不到发布消息的时候的其他的报文数据,如果此时把消息的QoS等级设置为1、2就可以看到发送消息的时候其他的报文:

QoS的值设置为2以后,抓取的报文数据如下所示:

订阅相关报文:

进阶

QoS 表示消息可靠性的一个等级

1、QoS 0,最多交付一次 —–> 可能丢失消息

2、QoS 1,至少交付一次 —–> 可以保证收到消息,但消息可能重复

3、QoS 2,只交付一次 —–> 可以保证消息既不丢失也不重复

QoS 0 是最低的 QoS 等级。QoS 0 消息即发即弃,不需要等待确认,不需要存储和重传,因此对于接收方来说,永远都不需要担心收到重复的消息。

QoS 1 引入了应答与重传


mqtt
https://xiamu.icu/Java/mqtt/
作者
肉豆蔻吖
发布于
2024年11月16日
许可协议