MQTT协议是一种基于发布/订阅模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publisher)、代理(Broker)(服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
MQTT协议中设计了个Qos服务等级
Qos0 : 消息最多传递1次,如果当时客户端不可用,则会丢失该消息。
Qos1 : 消息至少传递1次
Qos2 : 消息仅传送一次
木桶效应,去最小的那面板
层级分隔符:/
/ 用来分割主题树的每一层,并给主题空间提供分等级的结构。当两个通配符在一个主题中出现的时候,主题层次分隔符的使用是很重要的。
多层通配符:#
多层通配符有可以表示大于等于0的层次。因此,love/#也可匹配到单独的love,此时#代表0层。
单层通配符:+
只匹配主题的一层。
注意事项
1.主题层次分隔符被用来在主题中引入层次。多层的通配符和单层通配符可以被使用,但他们不能被使用来做发布者的消息。
2.Topic命名尽量见名知意,符合规范,主题名字是大小写敏感的。比如说,love和LOVE是两个不同的主题。
3.以/开头会产生一个不同的主题。比如说,/love与love不同。/love匹配"+/+"和/+,但不匹配+
4.不要在任何主题中包含null(Unicode \x0000)字符。
5.在主题树中,长度被限制于64k内但是在这以内没有限制层级的数目 。
6.可以有任意数目的根节点;也就是说,可以有任意数目的主题树。
emqx其实就是mqtt协议中的broker (代理服务器)
##拉取镜像
docker pull emqx/emqx:v4.1.0
##运行镜像
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 提供了 Dashboard 以方便用户管理设备与监控相关指标。通过 Dashboard可以查看服务器基本信息、负载情况和统计数据,可以查看某个客户端的连接状态等信息甚至断开其连接,也可以动态加载和卸载指定插件。除此之外,EMQ X Dashboard 还提供了规则引擎的可视化操作界面,同时集成了一个简易的 MQTT 客户端工具供用户测试使用。
当 EMQ X 成功运行在你的本地计算机上且 EMQ X Dashboard 被默认启用时,通过访问
http://localhost:18083 来查看Dashboard,默认用户名是 admin,密码是 public。
MQTT X 是 EMQ 开源的一款优雅的跨平台 MQTT 5.0 桌面客户端,它支持 macOS, Linux, Windows。
MQTT X 的 UI 采用了聊天界面形式,简化了页面操作逻辑,用户可以快速创建连接,允许保存多个客户端,方便用户快速测试 MQTT/MQTTS 连接,及 MQTT 消息的订阅和发布。
发布topic的格式
$delayed/{DelayInterval}/{TopicName}
需要开启delay模块(在Dashboard)
类似于做负载均衡
共享订阅有俩种模式
$queue 队列 将消息按负载均衡规则发到服务
$share/g1 指定分组 ,按负载均衡规则发到每个分组下的一个服务
指定负载均衡
代理订阅可以理解成帮客户端自动订阅一个主题。
需要进行配置:
仅仅开启并不意味代理订阅已经工作,你还需要配置相应的规则,EMQ X 的代理订阅规则支持用户自行配置,用户可以自行添加多条代理订阅规则,每条代理订阅规则都需要指定 Topic 和 QoS,规则的数量没有限制,在 etc/emqx.conf 文件中添代理订阅规则的格式如下:
vi etc/emqx.conf module.subscription.
在配置代理订阅的主题时,EMQ X 提供了 %c 和 %u 两个占位符供用户使用,EMQ X 会在执行代理订阅时将配置中的 %c 和 %u 分别替换为客户端的 Client ID 和 Username,需要注意的是,%c 和 %u 必须占用一整个主题层级。
例如,在 etc/emqx.conf 文件中添加以下代理订阅规则:
module.subscription.1.topic = client/%c
module.subscription.1.qos = 1
module.subscription.2.topic = user/%u
module.subscription.2.qos = 2
module.subscription.3.topic = testtopic/#
module.subscription.3.qos = 2
需要使用到插件,插件默认开启
修改保留消息的时间
vi etc/plugins/emqx_retainer.conf。
修改retainer.expiry_interval
最常用的是Http认证,理解成连接到emqx代理服务器时需要进行权限认证
关闭匿名认证:
etc/emqx.conf
## Value: true | false
allow_anonymous = true ##改成false
emqx restart ##重启emqx
认证请求路径配置:
# etc/plugins/emqx_auth_http.conf
## 请求地址
auth.http.auth_req = http://192.168.200.0:8991/mqtt/auth
## HTTP 请求方法
## Value: post | get | put
auth.http.auth_req.method = post
## 请求参数
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
开启acl
更改配置(默认规则会放行)
etc/emqx.conf
## ACL 未匹配时默认授权
## Value: allow | deny
acl_nomatch = allow ##改成deny
配置超级管理校验规则使用Http
# etc/plugins/emqx_auth_http.conf
####使用vi编辑该配置,修改URL请求地址
##--------------------------------------------------------------------
## Superuser request.
##
## Variables:
## - %u: username
## - %c: clientid
## - %a: ipaddress
## - %r: protocol
## - %P: password
## - %p: sockport of server accepted
## - %C: common name of client TLS cert
## - %d: subject of client TLS cert
##
## Value: URL 请求地址
auth.http.super_req = http://192.168.200.1:8991/mqtt/superuser
## Value: post | get | put 请求方法
auth.http.super_req.method = post
## Value: Params 请求参数
auth.http.super_req.params = clientid=%c,username=%u
配置ACL请求
# etc/plugins/emqx_auth_http.conf
####使用vi编辑该配置,修改URL请求地址以及请求方式
##--------------------------------------------------------------------
## ACL request.
##
## Variables:
## - %A: 1 | 2, 1 = sub, 2 = pub
## - %u: username
## - %c: clientid
## - %a: ipaddress
## - %r: protocol
## - %m: mountpoint
## - %t: topic
##
## Value: URL
auth.http.acl_req = http://192.168.200.1:8991/mqtt/acl
## Value: post | get | put
auth.http.acl_req.method = post
## Value: Params
auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t,mountpoint=%m