学习笔记 | EMQX

一、MQTT协议

1-1 简介

MQTT协议是一种基于发布/订阅模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publisher)、代理(Broker)(服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

1-2 Qos服务质量等级

MQTT协议中设计了个Qos服务等级

Qos0 : 消息最多传递1次,如果当时客户端不可用,则会丢失该消息。

Qos1 : 消息至少传递1次

Qos2 : 消息仅传送一次

学习笔记 | EMQX_第1张图片
学习笔记 | EMQX_第2张图片
学习笔记 | EMQX_第3张图片

1-3 发布与订阅QoS

木桶效应,去最小的那面板

学习笔记 | EMQX_第4张图片

1-4 Topic通配符

层级分隔符:/

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

多层通配符:#

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

单层通配符:+

只匹配主题的一层。

注意事项

1.主题层次分隔符被用来在主题中引入层次。多层的通配符和单层通配符可以被使用,但他们不能被使用来做发布者的消息。

2.Topic命名尽量见名知意,符合规范,主题名字是大小写敏感的。比如说,love和LOVE是两个不同的主题。

3.以/开头会产生一个不同的主题。比如说,/love与love不同。/love匹配"+/+"和/+,但不匹配+

4.不要在任何主题中包含null(Unicode \x0000)字符。

5.在主题树中,长度被限制于64k内但是在这以内没有限制层级的数目 。

6.可以有任意数目的根节点;也就是说,可以有任意数目的主题树。

二、EMQX

2-1 EMQX简介

emqx其实就是mqtt协议中的broker (代理服务器)

2-2 环境搭建与配置

##拉取镜像

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

2-3 Dashboard

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

当 EMQ X 成功运行在你的本地计算机上且 EMQ X Dashboard 被默认启用时,通过访问

http://localhost:18083 来查看Dashboard,默认用户名是 admin,密码是 public。

2-4 MQTTX

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

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

2-5 延迟发布(重点)

发布topic的格式

$delayed/{DelayInterval}/{TopicName}

需要开启delay模块(在Dashboard

学习笔记 | EMQX_第5张图片

2-4 共享订阅(重点)

类似于做负载均衡

共享订阅有俩种模式

$queue 队列 将消息按负载均衡规则发到服务

$share/g1 指定分组 ,按负载均衡规则发到每个分组下的一个服务

指定负载均衡

学习笔记 | EMQX_第6张图片

2-6 代理订阅 (重点)

代理订阅可以理解成帮客户端自动订阅一个主题。

需要进行配置:

学习笔记 | EMQX_第7张图片

仅仅开启并不意味代理订阅已经工作,你还需要配置相应的规则,EMQ X 的代理订阅规则支持用户自行配置,用户可以自行添加多条代理订阅规则,每条代理订阅规则都需要指定 Topic 和 QoS,规则的数量没有限制,在 etc/emqx.conf 文件中添代理订阅规则的格式如下:

vi etc/emqx.conf module.subscription..topic = module.subscription..qos =

在配置代理订阅的主题时,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

2-7 保留消息(重点)

需要使用到插件,插件默认开启

修改保留消息的时间

vi etc/plugins/emqx_retainer.conf。

修改retainer.expiry_interval

2-8 HTTP认证(作用于连接代理服务器)(重点)

最常用的是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
学习笔记 | EMQX_第8张图片

2-9 ACL (发布订阅权限校验)

开启acl

学习笔记 | EMQX_第9张图片

更改配置(默认规则会放行)


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

你可能感兴趣的:(学习笔记,学习)