mqtt服务器介绍
MQTT服务器是支持MQTT协议的消息代理服务器,用于实现MQTT协议的消息传输和处理。MQTT服务器负责接收来自客户端的发布(publish)和订阅(subscribe)请求,并将消息传递给对应的订阅者。下面是关于MQTT服务器的一些介绍:
-
功能:
- 消息路由:MQTT服务器负责将发布的消息路由到订阅者,确保消息能够准确地传递到目标客户端。
- 订阅管理:MQTT服务器维护订阅关系,记录客户端的订阅信息,并在有新消息发布时通知订阅者。
- QoS支持:MQTT服务器支持不同的服务质量(QoS)级别,确保消息的可靠传输和按需传输。
- 持久化存储:MQTT服务器通常支持将消息持久化存储,以便在客户端断线重连后仍然能够接收未读消息。
-
常见的MQTT服务器:
- Eclipse Mosquitto:Mosquitto是一个轻量级的开源MQTT消息代理服务器,具有良好的性能和可扩展性。
- HiveMQ:HiveMQ是一个专业的商业级MQTT消息代理服务器,提供高可靠性和可伸缩性的解决方案。
- EMQ X:EMQ X是一个开源的分布式MQTT消息代理服务器,支持海量设备的连接和消息处理。
- IBM Watson IoT Platform:IBM Watson IoT Platform是一个基于云的MQTT消息代理服务器,为物联网应用提供端到端的解决方案。
-
部署和配置:
- MQTT服务器可以部署在本地服务器、云服务器或者物联网平台上,具体配置取决于使用场景和需求。
- 配置包括MQTT服务器的监听端口、认证和授权机制、持久化存储方式、QoS级别等。
-
安全性考虑:
- MQTT服务器可以通过TLS/SSL加密来保护消息的传输安全。
- MQTT服务器可以支持基于用户名和密码的认证机制,以确保只有授权的客户端能够连接和发布消息。
总之,MQTT服务器是实现MQTT协议的消息代理服务器,负责接收、路由和传递MQTT消息。选择适合自己需求的MQTT服务器,可以构建高效、可靠的物联网应用。
EMQ X服务器安装
以下是emqx的官方文档,我们使用v5.0版本:
https://www.emqx.io/docs/zh/v5.0/`
使用docker安装
- 运行以下命令获取 Docker 镜像:
docker pull emqx/emqx:5.0.26
- 运行以下命令启动 Docker 容器
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.0.26
使用docker-compose构建
docker-compose.yml
version: '3'
services:
emqx1:
image: emqx:5.0.26
container_name: emqx1
environment:
- "EMQX_NODE_NAME=emqx@node1.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node1.emqx.io
ports:
- 1883:1883
- 8083:8083
- 8084:8084
- 8883:8883
- 18083:18083
# volumes:
# - $PWD/emqx1_data:/opt/emqx/data
emqx2:
image: emqx:5.0.26
container_name: emqx2
environment:
- "EMQX_NODE_NAME=emqx@node2.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node2.emqx.io
# volumes:
# - $PWD/emqx2_data:/opt/emqx/data
networks:
emqx-bridge:
driver: bridge
- 查看集群状态
$ docker exec -it emqx1 sh -c "emqx_ctl cluster status"
Cluster status: #{running_nodes => ['emqx@node1.emqx.com','emqx@node2.emqx.com'],
stopped_nodes => []}
windows安装
-
修改配置文件,路径为
./etc/emqx.confnode { name = "emqx@127.0.0.1" cookie = "emqxsecretcookie" data_dir = "data" } listeners { tcp.default { enabled = true bind = "0.0.0.0:63081" } ssl.default { enabled = true bind = "0.0.0.0:63082" } ws.default { enabled = true bind = "0.0.0.0:63084" } } cluster { name = emqxcl discovery_strategy = manual } dashboard { default_username = your_user_name default_password = your_password listeners.http { bind = 63086 } } authorization { deny_action = ignore no_match = allow cache = { enable = true } } -
通过命令行下进入解压路径,通过以下命令启动 EMQX:
./emqx/bin/emqx start
服务端管理页面
服务端启动后,访问http://localhost:63086/
默认的登录账号是配置文件中dashboard下的用户名和密码。
配置客户端权限
进入客户端认证页面,点击创建按钮,配置数据库连接。配置完成后,点击用户管理,创建客户端用户名和密码。
此处设置的账号密码,将用于客户端连接时的认证,如果选择了管理员权限,那么将跳过后续的所有认证。
配置客户端授权
acl规则默认是基于文件配置的,我们使用的场景较少,所以没有使用基于数据库的授权方式。
基于文件进行授权检查前,您需要将授权规则以 Erlang 元组 数据列表的形式存储在文件中。
基本语法和概念如下:
- 元组是用花括号包起来的一个列表,各个元素用逗号分隔
- 每条规则应以
.结尾 - 注释行以
%%开头,在解析过程中会被丢弃
代码示例:
%% 允许用户名是 dashboard 的客户端订阅 "$SYS/#" 这个主题
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
%% 允许来自127.0.0.1 的用户发布和订阅 "$SYS/#" 以及 "#"
{allow, {ipaddr, "127.0.0.1"}, all, ["$SYS/#", "#"]}.
%% 拒绝其他所有用户订阅 "$SYS/#" 和 "#" 主题
{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
%% 如果前面的规则都没有匹配到,则允许所有操作
{allow, all}.
在每个元组中:
第一个元素表示该条规则对应的权限;可选值:
allow(允许)deny(拒绝)
第二个元素用来指定适用此条规则的客户端,比如:
{username, "dashboard"}:用户名为dashboard的客户端;也可写作{user, "dashboard"}{username, {re, "^dash"}}:用户名匹配 正则表达式 (opens new window)^dash的客户端{clientid, "dashboard"}:客户端 ID 为dashboard的客户端,也可写作{client, "dashboard"}{clientid, {re, "^dash"}}:客户端 ID 匹配 正则表达式 (opens new window)^dash的客户端{ipaddr, "127.0.0.1"}:源地址为127.0.0.1的客户端;支持 CIDR 地址格式。注意:如果 EMQX 部署在负载均衡器后侧,建议为 EMQX 的监听器开启proxy_protocol配置 ,否则 EMQX 可能会使用负载均衡器的源地址。{ipaddrs, ["127.0.0.1", ..., ]}:来自多个源地址的客户端,不同 IP 地址之间以,区分all:匹配所有客户端{'and', [Spec1, Spec2, ...]}:满足列表中所有规范的客户端。{'or', [Spec1, Spec2, ...]}:满足列表中任何规范的客户端。
第三个元素用来指定该条规则对应的操作:
publish:发布消息subscribe:订阅主题all:发布消息和订阅主题
第四个元素用于指定当前规则适用的 MQTT 主题,支持通配符(主题过滤器),可以使用主题占位符:
"t/${clientid}":使用了主题占位符,当客户端 ID 为emqx_c的客户端触发检查时,将精确匹配t/emqx_c主题"$SYS/#":通过通配符匹配$SYS/开头的所有主题,如$SYS/foo、$SYS/foo/bar{eq, "foo/#"}:精确匹配foo/#主题,主题foo/bar将无法匹配,此处eq表示全等比较(equal)
另外还有 2 种特殊的规则,通常会用在 ACL 文件的末尾作为默认规则使用。
{allow, all}:允许所有请求{deny, all}:拒绝所有请求
桌面客户端
MQTTX 是 EMQ 开源的一款跨平台 MQTT 5.0 客户端工具,它支持 macOS, Linux, Windows,并且支持自定义脚本模拟测试、MQTT 消息格式转换、日志记录等多个功能。
MQTTX 提供了一键式的连接方式和简洁的图形界面,能够测试 MQTT/TCP、MQTT/TLS、MQTT/WebSocket 连接。
以下是使用 MQTTX 完成连接、发布订阅并查看消息全流程:
- 下载并安装 MQTTX:前往 MQTTX 官网 ,通过应用商店或直接下载对应操作系统安装包进行安装。详细操作请参考 MQTTX - 下载与安装。
- 配置 MQTT 连接以及消息发布订阅测试:在 MQTTX 中填入 EMQX 连接信息并建立连接,详细操作请参考 MQTTX - 快速建立连接。服务器地址 选择
mqtt://协议并填入对应监听器的 IP 地址,默认 IP 地址为localhost,端口为 1883,根据情况填入用户名密码,没有启用访问控制的情况下留空即可。 - 消息发布订阅以及查看消息:连接到 EMQX 后,使用 MQTTX 收发消息,详细操作请参考 MQTTX - 消息的发布订阅 。
创建连接
clientId需要全局唯一,否则服务器会踢除相同id的连接。
这里以MQTT/WebSocket连接为例,由于我们在服务器配置中指定了ws协议的监听端口是63084,所以这里要填写正确的端口号。用户名和密码,是在管理页面中配置的账号。mqtt版本使用5.0。
需要注意的是,如果选择使用MQTT/WebSocket连接,那么在path中的地址必须填/mqtt,填写其他的会导致客户端连不上服务器。
订阅主题
点击添加订阅,在弹框中填写订阅相关的配置。
主题相关的注意点:
- 为了避免混淆,官方建议,主题不要以
/开头或结尾 - 多级主题使用
/隔开,由于服务端是根据主题层级来进行路由转发的,所以层级越多,对于服务器的压力也就越大 +代表匹配任意一个层级的主题,#代表匹配任意多个层级的主题