文章仅为记录,如有错误请联系本人进行修改,以免误导他人~
前提
项目中需要新增消息推送功能,原本计划使用 websocket ,但因为某些原因决定使用 MQTT 。
网上资料众多,亦可自行查阅。
第一次接触消息推送类业务,本人通过网上冲浪摸索了一些基础用法,在这里简单的记录自己的 能跑就行。
使用:
EMQX (MQTT 消息服务器) ,B站EMQX视频教学;
后端 Java: eclipse.paho;
前端 Angular: ngx-mqtt;
一、EMQ X 前期准备工作
下载 EMQ X
官方文档写的挺详细了,基本按照自己的Linux系统照抄即可。
我这里选用的是 zpi 压缩包方式 安装emqx-centos7-v4.1.5.zip
下载到本地后,将它放到你要安装的服务器路径中,我的是/usr/local/emqx
解压 EMQ X
执行解压命令unzip emqx-centos7-v4.1.5.zip ,执行完成后出现 emqx 文件夹代表完成安装!
p.s. 如果没unzip 命令,可以执行 yum install -y unzip zip
启动 EMQ X
基础命令:
启动命令:emqx start
关闭命令:emqx stop
重启命令:emqx restart
查看状态:emqx_ctl stauts
进入刚解压完的文件夹中,进入bin 文件,执行启动命令,
出现 EMQ X Broker v4.1.5 is started successfully! 则代表启动完成!
进入 EMQ X Dashboard
EMQ X Dashboard 是一个 Web 应用程序,你可以直接通过浏览器来访问它,无需安装任何其他软件。
当 EMQ X 成功运行且 EMQ X Dashboard 被默认启用时,你可以访问 http://{ip地址}:18083 来查看你的 Dashboard,默认用户名是 admin,密码是 public。可通过下面命令修改账密
进入面板后可以通过设置改为中文语言。
修改 EMQ X Dashboard 密码
可使用以下命令行修改账号 emqx_ctl
创建 admin 账号: admins add <Username> <Password> <Tags>
重置 admin 密码: admins passwd <Username> <Password>
删除 admin 账号: admins del <Username>
二、EMQ X 基础连接以及测试
可通过面板自带的 工具 > Websocket 进行连接,以及订阅和发布测试
也可以通过安装 官方工具 MQTT X 进行更丰富、方便的测试
三、EMQ X 添加认证
大家可以根据实际项目情况选择适合自己的认证方式:
需注意!!
匿名认证 EMQ X 默认配置中启用了匿名认证,任何客户端都能接入 EMQ X。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQ X 将根据匿名认证启用情况决定是否允许客户端连接。
修改的任何配置都需要重启EMQX 达到生效目的
配置匿名认证开关:
修改 emqx/etc/emqx.conf
## Allow anonymous authentication by default if no auth plugins loaded.
## Notice: Disable the option in production deployment!
##
## Value: true | false
allow_anonymous = true
修改为false, 重启EMQ X
添加管理认证
这里我选择简单的Username 里的 HTTP API管理认证 :
Dashboard 默认关闭 Username 认证插件,我们需要打开此插件。
配置插件自启达到开启目的(它将在 EMQ X 启动时自动加载,优先推荐)- 也可以通过
Dashboard -> 插件手动选择 启动/停止;
配置插件自启,修改 data/loaded_plugins ,添加:
{emqx_auth_username, true}.

重启EMQ X 后,查看Dashboard 发现插件已经打开。
EMQ X提供了对应的HTTP API 用以维护内置数据源中的认证信息,我们可以添加/查看/取消/更改认证数据
我们使用postman 添加username以及password, 后续mqtt 的连接都需要此账号
username 认证相关的一些API,也可以在Dashboard -> 工具 -> HTTP 接口 中查看:
新增指定: POST http://localhost:18083/api/v4/auth_username
查找所有: GET http://localhost:18083/api/v4/auth_username
删除指定:DELETE http://localhost:18083/api/v4/auth_username/{username}
添加的时候注意需要携带Auth
添加完成后,再此使用mqtt x 测试连接会提示报错,链接时不设置刚添加的账号密码,
连接提示报错:Error: Connection refused: Not authorized,再设置账号密码进行连接,连接成功!
四、项目内使用
以后有空会把前后端的代码贴出来记录在另外两个帖子中 =。=
后端 Java采用eclipse.paho 开发;
前端 Angular采用ngx-mqtt 开发;
五、启用SSL\TSL 安全连接
SSL\TSL 安全连接简介

官方文档 说的也是很详细,大家对着抄就行,只有在购买证书的配置中,我需要再修改一行配置才能生效,不知道是文档中遗漏还是我的操作问题,会把这几个注意事项写在下面:
启用操作

注意事项一:
公司够买的证书文件为.pem 后缀, 一开始看文档以为emqx 需要的是.crt ,其实都可以;
复制一份证书:
cp 至emqx 文件里的/etc/certs 指定位置中
cp *****.key /emqx/etc/certs/emqx.key
cp *****.pem /emqx/etc/certs/emqx.pem
修改配置
结合我项目的实际使用有注意事项:
注意事项二
如上图文档,修改的配置为 listener.ssl. 开头配置项,这种修改只适合mqtts 方式 的链接。
前端项目使用wss 方式连接,所以需要修改 listener.wss.的配置:
注意事项三
官方文档只修改了 listener.ssl.external.keyfile = etc/certs/emqx.key && listener.ssl.external.certfile = etc/certs/emqx.crt 两处,但实际操作时发现仍需要多修改一处:
## Path to the file containing the user's private PEM-encoded key.
##
## See: listener.ssl.$name.keyfile
##
## Value: File
## listener.wss.external.keyfile = etc/certs/key.pem
listener.wss.external.keyfile = etc/certs/emqx.key
## Path to a file containing the user certificate.
##
## See: listener.ssl.$name.certfile
##
## Value: File
## listener.wss.external.certfile = etc/certs/cert.pem
listener.wss.external.certfile = etc/certs/emqx.pem
## Path to the file containing PEM-encoded CA certificates.
##
## See: listener.ssl.$name.cacert
##
## Value: File
## listener.wss.external.cacertfile = etc/certs/cacert.pem
listener.wss.external.cacertfile = etc/certs/emqx.pem
注意事项五

wss连接方式的默认最大连接数是很少的,可以根据实际项目情况自行修改:
## Maximum number of concurrent MQTT/Webwocket/SSL connections.
##
## Value: Number
## listener.wss.external.max_connections = 16
listener.wss.external.max_connections = 512
重启emqx 以生效配置!!!!!!
重启emqx 以生效配置!!!!!!
重启emqx 以生效配置!!!!!!
MQTT X 测试连接
按下图配置,连接成功,并且订阅收发消息正常!!自此全部完成!!
小菜鸟的日常记录,如有缺陷和错误的地方请联系作者,感谢你的贡献!!