软件研究之EMQX

标签: 无 分类: 未分类 创建时间:2023-06-25 03:35:45 更新时间:2024-11-23 10:24:26

1.前言

EMQX软件,是mqtt的服务端程序。

2.安装

不同的系统的安装方式不同,这里我简单的记录下相关的东西,具体的还是要去看官方文档。安装启动后,emqx 所占用的端口号如下:

1883 MQTT 协议端口
8883 MQTT/SSL 端口
8083 MQTT/WebSocket 端口
18083 HTTP API 服务的默认监听端口,Dashboard 管理控制台端口

修改默认的端口,就需要编辑 emqx/etc/emqx.conf 里面的配置。emqx restart 好像在5.x版本之后不能用了,只能先stop再start。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
listeners.tcp.default {
# bind = "0.0.0.0:1883"
bind = "0.0.0.0:10019"
max_connections = 1024000
}

listeners.ssl.default {
# bind = "0.0.0.0:8883"
bind = "0.0.0.0:10018"
max_connections = 1024000
}

listeners.ws.default {
# bind = "0.0.0.0:8083"
bind = "0.0.0.0:10017"
max_connections = 1024000
}

listeners.wss.default {
# bind = "0.0.0.0:8084"
bind = "0.0.0.0:10016"
max_connections = 1024000
}

还可以直接在 dashboard 页面进行编辑。打开菜单管理->监听器,针对每一个监听器,都可以进行端口修改。

参考文章:
1.安装 这是官方安装文档,里面有特别多的平台安装步骤。
2.EMQX 入门教程 环境篇②——修改TCP监听的端口
3.EMQX 入门教程③——默认端口、端口策略和端口修改
4.MQTT/TCP 监听器 - 1883 listeners.tcp.$name.bind,其中的 $name 是比如 default 这样的值。
5.EMQX 启动时提示端口被占用

2.1.CentOS安装

1
2
3
4
5
6
## 安装
sudo yum install emqx
## 启动
sudo systemctl start emqx
## 停止
sudo systemctl stop emqx

2.2.MacOS

这个的安装,我直接使用官方打包好的二进制文件下载下来,解压之后进行运行。进入到解压明目,执行相应命令启动。

1
2
3
4
# 启动
./bin/emqx start
# 停止
./bin/eqmx stop

EMQX Dashboard 是一个 Web 应用程序,默认监听 18083 端口。下载安装 EMQX 并成功启动之后,可以通过浏览器打开 http://localhost:18083/(如部署在非本机的,可将 localhost 替换为实际 IP 地址)来访问和使用 EMQX Dashboard。

2.3.Windows

进入 emqx 的目录,然后执行启动和重启命令。

1
2
3
4
# 启动
./bin/emqx start
# 停止
./bin/emqx start
参考文章:
【1】.Windows

2.4.Linux

(1) 下载安装包,使用源码安装配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 下载
wget https://www.emqx.com/en/downloads/broker/5.5.1/emqx-5.5.1-el8-amd64.tar.gz
# 解压后,将 emqx 拷贝到 /usr/local 目录。

# 进入到 cd /usr/local/emqx 目录,进行启动和停止
./bin/emqx start
# 停止
./bin/eqmx stop

# 修改默认端口配置
vi /usr/local/emqx/etc/emqx.conf
dashboard {
listeners.http {
bind = 10020
}
}


## 编辑服务 vi /usr/lib/systemd/system/emqx.service,根据自己的需要修改路径
[Unit]
Description=emqxautostart
After=network.target
[Service]
Type=forking
Environment=HOME=/usr/local/emqx
ExecStart=/usr/local/emqx/bin/emqx start
ExecStop=/usr/local/emqx/bin/emqx stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target

## 启动
systemctl start emqx
## 关闭
systemctl stop emqx
## 设置开机启动
systemctl enable emqx

(2) 使用yum安装,我自己没有尝试过,因为我用的是阿里云系统,好像脚本不支持

1
2
3
4
5
6
7
8
9
10
11
12
# 1.下载
curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash

# 2.安装依赖
yum install epel-release -y
yum install -y openssl11 openssl11-devel

# 3.EMQX
sudo yum install emqx -y

# 4.启动
sudo systemctl start emqx
参考文章:
【1】.CentOS 这里是官方的在 CentOS 上安装的,需要下载包自己配置。
【2】.EMQ开机自启

2.配置

配置文件在 ./etc/eqmx.conf 文件中。

2.1.配置用户名密码

对于首次安装和部署好 EMQX 的用户来说,浏览器打开 Dashboard 后可以使用默认用户名 admin 和默认密码 public 来进行登录使用。首次登录后,系统会自动检测到您正在使用默认用户名和密码登录,并会强制要求修改默认密码,这有利于访问 Dashboard 的安全性提升,注意修改的密码不能与原密码相同,且不建议再次使用 public 做为登录密码。

2.3.配置https

主要有三种方式可以配置
(1)使用 nginx 进行转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {

# 建议 WebSocket 也绑定到 443 端口
#listen 443, 8083;
listen 443 ssl;
server_name your.site.com;

ssl on;

ssl_certificate ssl/your.pem; # 证书路径
ssl_certificate_key ssl/your.key; # 密钥路径


location /mqtt {
proxy_pass http://127.0.0.1:8084;
proxy_set_header Sec-WebSocket-Protocol mqtt;
# 这行就是去除 Sec-WebSocket-Protocol
#more_clear_headers Sec-WebSocket-Protocol;

proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}

(2)使用 Dashboard 配置
打开 Dashboard,点击管理 -> 监听器进入监听器管理页面。选择名称为 default,类型为 ssl 的监听器,点击名称进行编辑。将从 阿里云获取到的 证书填入即可。TLS Cert 就是pem或者是crt文件,TLS Key 就是 key 文件内容。

这里需要注意的就是除了要有 TLS 证书,还要有根证书,因为我用的是 阿里云 的免费证书,签发机构是 DigCert 免费版,所以需要 Download DigiCert root and intermediate certificates, 找到证书进行下载,然后上传服务器,配置 cacertfile。其实不配置根证书,也能正常的使用,根证书不是必须的。

(3)使用 配置文件配置
将 SSL/TLS 证书文件复制到 EMQX etc/cert 目录。我直接用的是 nginx 的 pem 和 key ,然后将 pem 改成了 .crt 后缀。

打开配置文件 emqx.conf,根据您的安装方式,可能位于 ./etc 或 /etc/emqx/etc 目录。,mqx.conf 中默认没有监听器配置,添加以下配置内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
listeners.ssl.default {
bind = "0.0.0.0:8883"
ssl_options {
# 根证书,可以不提供
# cacertfile = "etc/certs/rootCA.crt"

certfile = "etc/certs/server.crt"
keyfile = "etc/certs/server.key"
# 私钥文件受密码保护时需要输入密码
# password = "123456"

# 单向认证,不验证客户端证书
verify = verify_none
}
}

(3)测试
测试可以使用 MQTTX 客户端进行测试,新建一个wss连接,然后选择连接就可以了。这里有一个 SSL Secure 配置,不能打开,打开就报错了。

(4)问题
我在MQTTX上测试了可以连接,但是在web端测试 wss,结果连接不上。后来我使用了 域名 代替了 IP 地址,就可以了。

参考文章:
【1】.emqx配置ssl/wss/mqtts并且测试通过 这里主要是使用的 nginx 进行的配置
【2】.EMQX SSL/TLS 使用配置指南 官方配置 ssl/tls 连接,这个配置还是比较老的,有点不适用了。
【3】.开启 SSL/TLS 连接 1.使用 Dashboard 配置;2.使用 配置文件配置。3.单向认证客户端测试。
【4】.Can’t configure EMQX dashboard in https 这是一个问题提问,但是没有人回复
【5】.如何获取根证书和中间证书
【6】.websocket wss连接出错 我用域名代替ip可以连接上了
【7】.emqx配置ssl/tsl实现双向认证 生成根证书私钥,配置双向认证。
【8】.wss连接不上会有哪些原因 connection refuse(连接拒绝), 一般是以下原因: 1、客户端连接的端口错了。2、客户端连接的域名或者ip错了。3、如果客户端使用了域名连接,域名可能指向了错误的服务器ip.4、服务器使用了cdn等加速代理,导致连接的实际ip与预期ip不一致.5、服务端没有启动或者端口没有被监听。6、使用了网络代理软件。7、服务端监听ip与访问地址不在一个地址段。例如服务端监听127.0.0.1,则客户端只能通过127.0.0.1连接,不能通过局域网ip或者外网ip连接。建议监听地址设置为0.0.0.0,这样本机、内网、外网都可以连接。

3.管理控制台

启动服务之后,可以在浏览器中输入:http://127.0.0.1:18083/ 地址,输入默认的用户名:admin,密码:public,进入之后,需要修改默认密码。

参考文章:
1.Dashboard

4.测试客户端

MQTTX是一个跨平台的mqtt客户端,可以很方便的在macOS / Linux / Windows 中进行使用。可以到官方下载 进行下载

4.1.问题

(1) Cannot publish messages to topics containing wildcard characters #, +

当我使用MQTTX的发送消息的时候,发送到了主题:sys/product/+/status,结果报错了。我网上搜到的结果就是:A client can publish a payload to a single topic only, you can’t use wildcards for topics while publishing.You can use wildcards(#+) only for subscribing to the topics.

【解决方案】
意思是发布的时候不能使用 + 号通配符,但是订阅的时候,可以使用通配符,这样也就可以解释为什么无法发送消息了。

参考文章:
1.JAVA Paho mqtt - publish to wildcard 这里说了原因
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。