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.<number>.topic = <topic>module.subscription.<number>.qos = <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
需要使用到插件,插件默认开启
修改保留消息的时间
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
文章浏览阅读1.1w次,点赞32次,收藏75次。此文归纳整理和libhv源码分析相关的文章,献给感兴趣钻研libhv源码的同学。如有其他同学有写过不错的libhv源码分析文章,可以联系我加上。文章目录: 事件循环和IO多路复用机制介绍、事件的定义以及数据结构介绍、事件的优先级机制、IO事件、定时器事件、空闲事件、自定义事件、心跳和保活机制、TCP如何处理粘包与分包、回显、聊天、代理三种经典服务实现详解、多线程/多进程服务端编程、网络编程十宗罪、致谢_libhv
文章浏览阅读1.8k次。任务:编程序,在屏幕的中间分别显示绿色、绿底红色、白底蓝色的字符串 ‘YantaiUniversity’ 提示:要计算出“屏幕的中间”对应的内存单元,然后将字符以及对应的属性字节写入到内存中。参考解答:assume cs:codeseg, ds:datasgdatasg segment db 'welcome to masm!'datasg endscodeseg segments_汇编程序红色的是什么
文章浏览阅读2.5k次。修改yum配置文件:vim /root/w3af/extras/docker/scripts/./w3af_console_dock。原因:yum需要用python2编译,如果服务器安装的是python3.6并作为默认编译器的话,就会出现这个错误。_syntaxerror: multiple exception types must be parenthesized
文章浏览阅读1.4w次,点赞59次,收藏333次。针对三电阻低测采样来讲一讲如何配置使用定时器来触发ADC的注入组进行采样_hal_adcex_injectedstart
文章浏览阅读1.6k次。转载地址:https://blog.csdn.net/qq_36357820/article/details/789606251.Linux命令行提示符简介 众所周知,Linux命令行是系统管理员管理Linux的重要手段,我们管理Linux,首先要面对的就是Linux命令行提示符。 Linux命令行结尾的提示符有“#”和“$”两种不同的符号,如下所示: [root@oldbo..._linux终端@是是什么意思
文章浏览阅读4.8k次。http://blog.chinaunix.net/uid-20662363-id-1904145.htmlhttps://winddoing.github.io/post/62371.html推荐命令:style=linuxindent-switchesindent-namespacesindent-preproc-blockpad-oper--ali..._astytle參數
文章浏览阅读146次。以前公司的wifi虽然做了802.1x无线接入认证,不过限制不严,采用的是账号认证,所以手机等无线设备也是可以接入的,后来采用计算机认证,只有加域的电脑才能接入,这下手机不能直接接入了,所幸电脑虽然没有管理员权限,还是可以开启移动热点,这样手机可以通过电脑接入网络,虽然跟电脑一样受上网行为约束,但是像邮件,微信,oa等还是可以使用的,总是省了下数据流量。有类似困扰的朋友,可以参考借鉴下,注意移动热点选2.4GHz,手机wifi不要限制IP地址跟踪,可能就能解决你无线设备接入win10的移动热点了。_iphone连win10热点
文章浏览阅读866次。考完试了,要把自己答应的补回来,今天就写java jdk的安装吧因为本人命令不熟悉,而且vi也不熟,就是菜鸟一个。所以,本文安装尽量避免命令及vi的使用。首先下载官网上最新的jdk,网址:http://www.Oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156.html。解压到桌面,放置到deve
文章浏览阅读1.6k次。nexus上传自定义starter_nexus手动传jar
文章浏览阅读2.5k次。改完之后在安装上面那个安装命令就可以啦。1、卸载docker:哪种方式安装的就用哪种方式卸载 |brew uninstall docker |brew cask uninstall docker。1、安装docker:brew cask install docker |这样安装的docker将会安装在usr/local/bin目录下。1、安装docker:brew install docker |这样的安装docker将会在usr/local/Cellar目录下。_brew 启动docker
文章浏览阅读97次。二.介绍ØFusionCharts是InfoSoftGlobal公司的一个产品,InfoSoftGlobal公司是专业的Flash图形方案提供商,他们还有几款其他的,基于Flash技术的产品,都非常的漂亮。ØFusionChartsFree则是FusionCharts提供的一个免费版本,虽然免费,功能依然强大,图形类型依然丰富。ØFusionChartsfr..._fusionchartsfree
文章浏览阅读2k次。代码是用python写的,切换上下文后,通过 chrome://inspect/#devices,获取页面的元素,通过xpath定位,但是appium一直报找不到元素的错误找了很多资料,结果发现上下文是一直变化的,所以不可以写死值,切换到正确的上下文后,便利handle,就可以了contexts = driver.contextsprint(driver.contexts)driver.s..._微信ui自动化定位了一个页面,定位第二个页面就报错了