mqtt服务器安装

504 阅读5分钟

mqtt服务器介绍

MQTT服务器是支持MQTT协议的消息代理服务器,用于实现MQTT协议的消息传输和处理。MQTT服务器负责接收来自客户端的发布(publish)和订阅(subscribe)请求,并将消息传递给对应的订阅者。下面是关于MQTT服务器的一些介绍:

  1. 功能:

    • 消息路由:MQTT服务器负责将发布的消息路由到订阅者,确保消息能够准确地传递到目标客户端。
    • 订阅管理:MQTT服务器维护订阅关系,记录客户端的订阅信息,并在有新消息发布时通知订阅者。
    • QoS支持:MQTT服务器支持不同的服务质量(QoS)级别,确保消息的可靠传输和按需传输。
    • 持久化存储:MQTT服务器通常支持将消息持久化存储,以便在客户端断线重连后仍然能够接收未读消息。
  2. 常见的MQTT服务器:

    • Eclipse Mosquitto:Mosquitto是一个轻量级的开源MQTT消息代理服务器,具有良好的性能和可扩展性。
    • HiveMQ:HiveMQ是一个专业的商业级MQTT消息代理服务器,提供高可靠性和可伸缩性的解决方案。
    • EMQ X:EMQ X是一个开源的分布式MQTT消息代理服务器,支持海量设备的连接和消息处理。
    • IBM Watson IoT Platform:IBM Watson IoT Platform是一个基于云的MQTT消息代理服务器,为物联网应用提供端到端的解决方案。
  3. 部署和配置:

    • MQTT服务器可以部署在本地服务器、云服务器或者物联网平台上,具体配置取决于使用场景和需求。
    • 配置包括MQTT服务器的监听端口、认证和授权机制、持久化存储方式、QoS级别等。
  4. 安全性考虑:

    • MQTT服务器可以通过TLS/SSL加密来保护消息的传输安全。
    • MQTT服务器可以支持基于用户名和密码的认证机制,以确保只有授权的客户端能够连接和发布消息。

总之,MQTT服务器是实现MQTT协议的消息代理服务器,负责接收、路由和传递MQTT消息。选择适合自己需求的MQTT服务器,可以构建高效、可靠的物联网应用。

EMQ X服务器安装

以下是emqx的官方文档,我们使用v5.0版本:

 https://www.emqx.io/docs/zh/v5.0/`

使用docker安装

  1. 运行以下命令获取 Docker 镜像:
 docker pull emqx/emqx:5.0.26
  1. 运行以下命令启动 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
  1. 查看集群状态
 $ 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安装

  1. 下载 emqx-5.0.26-windows-amd64.zip (opens new window),并解压缩。

  2. 修改配置文件,路径为./etc/emqx.conf

     node {
       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 }
     }
    
  3. 通过命令行下进入解压路径,通过以下命令启动 EMQX:

     ./emqx/bin/emqx start
    

服务端管理页面

服务端启动后,访问http://localhost:63086/

默认的登录账号是配置文件中dashboard下的用户名和密码。

1686800819691

配置客户端权限

1686801158323

进入客户端认证页面,点击创建按钮,配置数据库连接。配置完成后,点击用户管理,创建客户端用户名和密码。

此处设置的账号密码,将用于客户端连接时的认证,如果选择了管理员权限,那么将跳过后续的所有认证。

配置客户端授权

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/TCPMQTT/TLSMQTT/WebSocket 连接。

以下是使用 MQTTX 完成连接、发布订阅并查看消息全流程:

  1. 下载并安装 MQTTX:前往 MQTTX 官网 ,通过应用商店或直接下载对应操作系统安装包进行安装。详细操作请参考 MQTTX - 下载与安装
  2. 配置 MQTT 连接以及消息发布订阅测试:在 MQTTX 中填入 EMQX 连接信息并建立连接,详细操作请参考 MQTTX - 快速建立连接服务器地址 选择 mqtt:// 协议并填入对应监听器的 IP 地址,默认 IP 地址为 localhost端口为 1883,根据情况填入用户名密码,没有启用访问控制的情况下留空即可。
  3. 消息发布订阅以及查看消息:连接到 EMQX 后,使用 MQTTX 收发消息,详细操作请参考 MQTTX - 消息的发布订阅

创建连接

1686815084534

clientId需要全局唯一,否则服务器会踢除相同id的连接。

这里以MQTT/WebSocket连接为例,由于我们在服务器配置中指定了ws协议的监听端口是63084,所以这里要填写正确的端口号。用户名和密码,是在管理页面中配置的账号。mqtt版本使用5.0

需要注意的是,如果选择使用MQTT/WebSocket连接,那么在path中的地址必须填/mqtt,填写其他的会导致客户端连不上服务器。

订阅主题

点击添加订阅,在弹框中填写订阅相关的配置。

1686807941606

主题相关的注意点:

  • 为了避免混淆,官方建议,主题不要以/开头或结尾
  • 多级主题使用/隔开,由于服务端是根据主题层级来进行路由转发的,所以层级越多,对于服务器的压力也就越大
  • +代表匹配任意一个层级的主题,#代表匹配任意多个层级的主题