MQTT协议,EMQX自建服务器
实验环境搭建
运行Emqx需要Erlang,如果大家没有安装过的话,可以安装上方红圈中已经下载好的Erlang安装包。emqx无需安装,直接解压到无中文路径处即可。
直接把emqx解压到了D盘下。
emqx-5.3.2-windows-amd64文件夹内,按住Shift不松手,点击鼠标右键,弹出的对话框中点击红圈圈中的“在此处打开Powershell窗口”打开命令窗口。
先检查红圈中的路径,是我们emqx的文件夹
输入 bin/emqx start 命令,启动emqx
看到红圈中的信息,表示emqx启动成功,关闭命令窗口。
打开浏览器,地址栏中输入127.0.0.1:18083,登陆管理界面。
登陆管理界面,大家第一次登陆时默认用户名和密码是admin/public,登陆后emqx要求我们设置自己的密码,大家自行设置密码即可。
登陆管理界面后,选择左侧第2个选项下的客户端认证。
点击红圈中的创建按钮
选择Password-Based选项,也就是使用客户端用户名、Client ID 与密码进行认证,然后点击下一步。
选择内置数据库,然后点击下一步
按图中配置后,点击创建按钮
点击上图中用户管理,添加用户。我们建立两个用户。
用户1:ClientID(USER001) 用户名(USER001) 密码(USER001)Topic(USER001) 用户1用网络调试助手登陆
用户2:ClientID(USER002) 用户名(USER002) 密码(USER002)Topic(USER002) 用户2用MQTTX登陆
点击上图中的+号,开始添加用户。
先添加USER001用户。
再添加USER002用户。
MQTT协议报文总览
MQTT协议报文——剩余长度
剩余长度 = 可变报头长度 + 负载长度
可变长编码(1~4个字节)(128进制)
MQTT协议报文—— CONNECT 、 CONNACK 与 DISCONNECT报文
CONNECT:
10 25
00 04 4D 51 54 54 04 C2 00 64
00 07 55 53 45 52 30 30 31
00 07 55 53 45 52 30 30 31
00 07 55 53 45 52 30 30 31
DISCONNECT:
E0 00
MQTT协议报文—— PING 与 PINGRESP 报文
PING: C0 00
MQTT协议报文—— SUBSCRIBE 、 SUBACK 、UNSUBSCRIBE与 UNSUBACK报文
SUBSCRIBE:
82 0C
00 0A
00 07 55 53 45 52 30 30 32 02
UNSUBSCRIBE:
A2 0B
12 34
00 07 55 53 45 52 30 30 32
MQTT协议报文——服务质量等级
0:不需要签收
1:需要一次签收
2:需要一次签收 且 需要一次回访
MQTT协议报文—— PUBLISH 报文的分类
等级0的PUBLISH:发送方用到3号报文 没有接收方的事
等级1的PUBLISH:发送方用到3号报文 / 接收方用4号报文表示签收
等级2的PUBLISH:发送方先用到3号报文 / 接收方用5号报文表示签收 发送方再用6号报文开启回访 / 接收方用7号报文表示回访确认
MQTT协议报文—— 等级0的PUBLISH 报文
30 0C
00 07 55 53 45 52 30 30
31 31 32 33
MQTT协议报文—— PUBLISH 报文保留功能
第一个字节是 0x30:等级0的不带保留功能
第一个字节是 0x31:等级0的带保留功能
保留本条PUBLISH报文,为新粉丝保留,只保留最近的1条
31 0C
00 07 55 53 45 52 30 30
31 31 32 33
MQTT协议报文—— 等级1的PUBLISH 报文
第一次发送,不带保留:
32 0E
00 07 55 53 45 52 30 30
31 12 34 31 32 33
接收方第一次没有签收,发送方后续重发,不带保留:
3A 0E
00 07 55 53 45 52 30 30
31 12 34 31 32 33
PUBACK:
40 02 00 01
MQTT协议报文—— 等级2的PUBLISH 报文
第一次发送,不带保留:
34 0E
00 07 55 53 45 52 30 30
31 11 22 31 32 33
接收方第一次没有签收,发送方后续重发,不带保留:(如果是7号没有回访确认,不重发3号,而是重发6号报文)
3C 0E
00 07 55 53 45 52 30 30 31 11 22
31 32 33
(6)PUBREL: 62 02 11 22
(5)PUBREC: 50 02 00 01
(7)PUBCOMP : 70 02 00 01
MQTT协议报文—— 会话清理与保留
1:清理会话:每次CONNECT报文,都是崭新的人生,记忆丢失。每次登陆后需要重新订阅需要的TOPIC。收不到离线消息。 10 25 00 04 4D 51 54 54 04 C2 00 64 00 07 55 53 45 52 30 30 31 00 07 55 53 45 52 30 30 31 00 07 55 53 45 52 30 30 31
0:保留会话:每次CONNECT报文,有记忆的,不用重新订阅TOPIC。离线期间的消息(PUBLISH)我们可以收到。 10 25 00 04 4D 51 54 54 04 C0 00 64 00 07 55 53 45 52 30 30 31 00 07 55 53 45 52 30 30 31 00 07 55 53 45 52 30 30 31
必须是连续的C0,连续的保留之间才有记忆。
CONNECT使用清理会话--> SP就是0
CONNECT使用保留会话--> SP就是1 ???? 不是
MQTT协议报文—— 会话清理和保留 同 ClientID的关系
有记忆的,但是,必须保证相同的ClientID
MQTT协议报文—— 遗嘱功能
报警功能,非正常断线(不发14号报文,直接断开TCP / 被踢下线)时,服务器会向,订阅了遗嘱TOPIC的客户端推送遗嘱PUBLISH报文。
WILL001(遗嘱TOPIC)
WILL001(PUBLISH报文数据)
10 37
00 04 4D 51 54 54 04 C6 00 64
00 07 55 53 45 52 30 30 31
00 07 57 49 4C 4C 30 30 31
00 07 57 49 4C 4C 30 30 31
00 07 55 53 45 52 30 30 31
00 07 55 53 45 52 30 30 31
82 0C
00 0A
00 07 57 49 4C 4C 30 30 32 02