物联网开发 + IM通讯开发 showcode1024
centos安装
cd /home/ && mkdir -p max && cd /home/max && yum install -y wget openssl && wget https://www.emqx.com/zh/downloads/broker/4.4.19/emqx-4.4.19-otp24.3.4.2-1-el7-amd64.rpm && sudo yum install emqx-4.4.19-otp24.3.4.2-1-el7-amd64.rpm -y && sudo systemctl start emqx && systemctl status emqx
MQTTBox
原文出自:www.hangge.com 转载请保留原文链接:MQTT系列教程3(客户端工具MQTTBox的安装和使用)
如果用ws(websocket)连接,需要加/mqtt
topic过滤器,通配符
单层通配符 ‘+’
直接看例子:
订阅客户端,订阅了:t/+ 这个主题。
发布客户端,发布了:t/1 这个主题的消息——A;t/a 这个主题的消息——B;t/1/1 这个主题的消息——C; t/1/a 这个主题的消息——D。
最终订阅客户端只接收到了A、B这两个消息。也就是只能接收到只有一个斜杠的主题的消息。(顾名思义,单层通配符)
通配符2——多层通配符 ‘#’
多层通配符单层相对应。还是上面的例子。
订阅客户端,改为订阅:t/# 这个主题。
发布客户端,发布的消息不变
最终订阅客户端会接收到A、B、C、D的消息。也就是只要开头是t的消息,不管后面有多少层都会匹配上。(顾名思义,多层通配符)
1.集群搭建
手动创建集群的时候: emqx_ctl cluster join emqx@192.168.153.128, 这里node节点的名字使用真实ip
EMQ X 支持多种节点发现策略,分布式集群 | EMQX 4.3 文档
注意开放集群发现端口的防火墙
JWT鉴权Golang 中使用 JWT 做用户认证
开启了auth.jwt.verify_claims = on之后,就要求在链接emq的时候,token中的playload信息username字段和链接时候设置的字段一致,否则返回失败
配置文件 /etc/emqx/emqx.conf
日志路径 log.dir = /var/log/emqx emqx.log
多租户消息隔离
配置
编辑emqx.conf,打开zone.external.mountpoint , 如: zone.external.mountpoint = %u/
说明
不开启集群中开启zone,各个用户(设备)之间可以互相订阅消息
开启后,各个用户的设备之间不能发消息,同一个用户下各个设备直接能互相订阅消息
这个主题前缀对客户端是无感的,但是服务端所有对于主题的操作都应该加上(%u表示用户id)前缀
通过http接口对服务端 所有对于主题的操作都应该加上前缀
如: 让dev1订阅a这个topic就应该发送 xiaoli/a (提前创建了用户xiaoli)
curl -i --basic -u admin:public -X POST "http://139.198.170.111:8081/api/v4/mqtt/subscribe" -d '{"topics":"xiaoli/a","qos":1,"clientid":"dev1"}'
集群都开启mountpoint
如果集群开启zone,客户端往a主题发消息, 11883端口的订阅者要订阅 xiaoli/a 才能收到消息, 同一用户的不同设备(连接到1883端口)正常订阅a就能收到消息
集群部分开启mountpoint
假如集群中有node 128和129, 128开启zone.external.mountpoint,129不开启
dev2订阅129的11883端口的主题a, 如果客户端都是链接到129,向a写,那么dev2能够正常收到数据, dev2订阅xiaoli/a收不到消息
如果其他客户端链接到128,向主题a发送消息, dev2还是链接129的11883端口,需要订阅 xiaoli/a 这样的主题才能收到消息 ,其他链接到129(1883端口)的设备,需要订阅 用户名/a才能收到数据
nginx做负载均衡
安装最新版本nginx, vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install nginx
编辑/etc/nginx/
stream{
upstream emqx_cluster {
server 192.168.3.233:1883;
server 192.168.3.234:1883;
server 192.168.3.235:1883;
}
server{
listen 18084 so_keepalive=on;
proxy_connect_timeout 10s;
proxy_timeout 20s;
proxy_pass emqx_cluster;
}
}
retained消息
emqx_ctl retainer topics
emqx_ctl retainer clean quote/2
mqtt 之 last will(遗愿)
设置了之后,异常断链的时候会发送这个消息
关闭匿名认证(关闭之后,登陆必须要有一个auth插件是返回true的,才能正常登陆)
# etc/emqx.conf
## Value: true | false
allow_anonymous = true
在dashboard上查看topic收到的数据消息
主题监控