简介:emqx-5.3.2-windows-amd64 是面向 Windows 64 位平台的 EMQ X Broker 5.3.2 安装包,适合物联网开发者、后端工程师及运维人员搭建 MQTT 消息代理服务。该版本支持百万级设备并发连接、TLS/SSL 加密认证、插件扩展与 REST API,可满足智能家居、工业物联等场景的消息路由与设备管理需求。压缩包共约 2000 个文件,整体 55.9MB,以 1629 个 beam 字节码文件、106 个 app 应用描述文件、89 个 js 与 74 个 css 前端资源为主,另含 dll 动态库、pem 证书、proto 协议定义及 bat 启动脚本等,覆盖运行、配置与 Web 管理界面所需组件。目前已有 1979 人学习下载。解压后可直接获得完整 broker 运行环境,便于快速部署、调试与二次开发,是 Windows 平台学习与实践 MQTT 消息中间件的实用资源。
1. 从 emqx-5.3.2-windows-amd64 说起:Windows 上到底该不该自建 MQTT Broker
如果你手头有一批设备要上报数据,又不想把消息链路完全交给外部服务,大概率会搜到emqx-5.3.2-windows-amd64这个包名。它指的是 EMQX 5.3.2 版本、面向 Windows 64 位系统的发行包。EMQX 是一款开源的 MQTT Broker,负责在设备与业务系统之间转发消息,支持 MQTT、WebSocket 等多种接入方式。把它跑在 Windows 上,最常见的场景是:本地开发联调、内网小规模设备接入、教学演示,或者作为边缘节点先验证协议再上生产。这篇文章不聊虚的,只讲怎么在 Windows 上把这个包跑起来、参数怎么调、坑在哪,以及它到底值不值得你投入时间。适合手里有 Windows 机器、想快速搭一套可用 MQTT 服务的开发者。
2. 先搞清楚 EMQX 5.3.2 在 Windows 上的运行形态
2.1 为什么 Windows 包和 Linux 包不是一回事
很多人第一次拿到emqx-5.3.2-windows-amd64会下意识以为解压就能双击运行,结果发现目录里全是.bat、.cmd和.erl相关文件。这是因为 EMQX 底层基于 Erlang/OTP 运行时,Windows 版本把 Erlang 运行时和 Broker 本体打包在一起,但启动方式、服务注册、日志路径都和 Linux 版有差异。Linux 上习惯的systemctl、emqx start在 Windows 上对应的是bin\emqx.cmd和bin\emqx_ctl.cmd。理解这一点,后面所有操作才不会拧巴。
Windows 版默认不会把自己注册成系统服务,除非你显式执行安装服务命令。这意味着你关掉命令行窗口,Broker 可能就跟着退了。另一个差异是路径分隔符和空格问题:如果解压路径里有中文或空格,Erlang 运行时解析配置文件时容易出玄学错误。我一般会把它放在D:\emqx这种纯英文、无空格的短路径下,省掉一半排查时间。
还有一点,Windows 防火墙对端口的态度比 Linux 更“主动”。默认情况下,外部设备访问 1883 端口会被拦,必须手动放行。这不是 EMQX 的锅,但如果你不提前处理,会误以为 Broker 没起来。
2.2 解压后先看目录:哪些文件你一定会碰
拿到包之后,先别急着启动。把压缩包解压到D:\emqx,你会看到类似这样的结构:
D:\emqx ├── bin\ │ ├── emqx.cmd │ ├── emqx_ctl.cmd │ └── emqx_service.cmd ├── etc\ │ ├── emqx.conf │ └── acl.conf ├── data\ ├── log\ └── releases\其中bin\emqx.cmd是主入口,bin\emqx_ctl.cmd是管理命令入口,etc\emqx.conf是主配置。data和log目录初始可能是空的,启动后才会写入。这里有个血泪经验:不要手动去改releases目录下的东西,那是 Erlang 发布版本管理的内部结构,改坏了只能重新解压。
2.3 启动前必须确认的两个前置条件
第一个条件是端口占用。EMQX 默认会监听 1883(MQTT)、8083(WebSocket)、8084(WebSocket TLS)、8883(MQTT TLS)、18083(Dashboard)。如果你机器上已经跑了其他 MQTT 服务或占用了 18083,启动会直接失败。用下面命令先查一遍:
netstat -ano | findstr "1883 8083 8084 8883 18083"如果输出里有 LISTENING,记下最后一列的 PID,去任务管理器里确认是什么程序。第二个条件是 Erlang 运行时依赖的 VC++ 运行库。虽然包内自带了 Erlang,但部分 Windows Server 或精简版系统缺少vcruntime140.dll,启动时会报“找不到指定模块”。遇到这种情况,装一个微软官方的 VC++ 2015-2022 运行库即可,这不是 EMQX 特有的问题。
3. 把 Broker 跑起来:命令行启动与 Dashboard 验证
3.1 用 emqx.cmd 前台启动并观察日志
进入D:\emqx\bin,打开 CMD 或 PowerShell,执行:
cd /d D:\emqx\bin emqx.cmd consoleconsole参数表示前台运行,日志直接打印在窗口里。这是调试阶段最推荐的启动方式,因为任何启动错误你都能第一时间看到。正常启动会输出一系列[info]日志,最后停在类似EMQX 5.3.2 is running now!的位置。此时不要关窗口,另开一个 CMD 做后续操作。
如果你看到[error]后进程退出,重点看三行:第一行是错误模块名,第二行是Reason,第三行是Stacktrace。常见原因包括端口被占、配置文件语法错误、data 目录权限不足。Windows 下权限问题容易被忽略:如果 EMQX 放在C:\Program Files下,普通用户没有写权限,data 和 log 写不进去就会启动失败。
3.2 用 emqx_ctl.cmd 确认节点状态
前台窗口保持运行,另开一个 CMD:
cd /d D:\emqx\bin emqx_ctl.cmd status正常输出会显示节点名称、运行状态和版本号。如果提示Node 'emqx@127.0.0.1' not responding,说明 Broker 没起来或者节点名不匹配。节点名在etc\emqx.conf里由node.name控制,默认是emqx@127.0.0.1。如果你改了主机名或用了自定义节点名,emqx_ctl需要加-n参数指定,否则连不上。
这里有个细节:emqx_ctl.cmd依赖 Erlang 的分布式通信端口(默认 4370 附近)。如果 Windows 防火墙拦了本地回环之外的通信,emqx_ctl可能连本机节点都连不上。排查时先临时关闭防火墙测试,确认后再加放行规则。
3.3 登录 Dashboard 并做一次发布订阅验证
EMQX 5.x 默认开启 Dashboard,地址是http://127.0.0.1:18083。默认账号admin,默认密码public。首次登录会强制要求改密码,这是 5.x 的安全策略,不是 bug。改完之后进入「连接」→「客户端」,应该能看到当前没有客户端连接。
接下来做一次最小验证。用任意 MQTT 客户端工具,或者直接用 EMQX 自带的 WebSocket 客户端(Dashboard 左侧「工具」→「WebSocket 客户端」)。订阅主题test/topic,然后向同一主题发布一条消息。如果订阅端能收到,说明 Broker 的消息转发链路是通的。
如果你更习惯命令行,可以用 Python 的 paho-mqtt 写个最小脚本:
import paho.mqtt.client as mqtt # 连接回调,确认是否连上 Broker def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("test/topic") # 消息回调,打印收到的 payload def on_message(client, userdata, msg): print(msg.topic + " " + msg.payload.decode()) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message # 连接本机 1883 端口,keepalive 设为 60 秒 client.connect("127.0.0.1", 1883, 60) client.loop_forever()这段代码的逻辑很直白:连上 Broker 后订阅test/topic,收到消息就打印。connect的第三个参数是 keepalive,单位秒,表示客户端最长多久没发心跳就判定断线。测试阶段设 60 足够,生产环境要根据网络质量调整,弱网下设太短会导致频繁重连。
4. 配置文件怎么改:端口、认证与数据落盘
4.1 emqx.conf 的语法和几个必调参数
EMQX 5.x 的配置文件采用 HOCON 风格,和 4.x 的emqx.conf语法不完全兼容。如果你从旧版本迁移,不要直接复制旧配置。几个最常改的参数:
| 参数 | 默认值 | 作用 | 建议 |
|---|---|---|---|
node.name | emqx@127.0.0.1 | 节点标识 | 单机保持默认 |
listeners.tcp.default.bind | 0.0.0.0:1883 | MQTT 监听地址 | 只内网用可改127.0.0.1:1883 |
listeners.ws.default.bind | 0.0.0.0:8083 | WebSocket 监听 | 不用可关 |
dashboard.listeners.http.bind | 0.0.0.0:18083 | Dashboard 端口 | 生产建议改非默认 |
log.file.level | warning | 文件日志级别 | 调试时改info |
改完配置后,用emqx_ctl.cmd reload让部分配置生效。但注意,监听端口这类参数通常需要重启节点才能生效。我一般改完直接emqx.cmd stop再emqx.cmd console,避免“改了没生效”的困惑。
4.2 开启用户名密码认证的最小配置
默认情况下 EMQX 允许匿名连接,这在开发阶段方便,但内网小规模使用也建议加上认证。5.x 内置了基于文件的密码认证,配置方式如下。在etc\emqx.conf末尾追加:
# 启用内置数据库认证 authentication = [ { mechanism = password_based backend = built_in_database password_hash_algorithm { name = sha256 salt_position = suffix } user_id_type = username } ]然后通过emqx_ctl.cmd创建用户:
emqx_ctl.cmd admins add testuser testpass这里要注意,admins命令管理的是 Dashboard 管理员,不是 MQTT 客户端用户。MQTT 客户端用户要用emqx_ctl.cmd users add testuser testpass。这两个命令容易搞混,我当初就翻过车,加了半天发现连不上,最后发现加错了地方。创建完用户后,客户端连接时必须带用户名密码,否则会被拒绝。
4.3 数据目录和日志目录的迁移
Windows 下默认 data 和 log 都在安装目录内。如果你把 EMQX 放在系统盘,长期运行后日志可能把盘写满。可以在emqx.conf里改:
node.data_dir = "D:/emqx_data" log.file.path = "D:/emqx_log/emqx.log"路径要用正斜杠或双反斜杠,单反斜杠在 HOCON 里是转义字符,会解析出错。改完目录后,确保目标目录存在且当前用户有写权限。如果目录不存在,EMQX 启动时会尝试创建,但 Windows 下跨盘创建目录偶尔会失败,手动建好更稳妥。
5. 避坑与排查:Windows 上跑 EMQX 最常见的五个问题
5.1 启动报“端口已被占用”但 netstat 查不到
现象:emqx.cmd console启动失败,日志提示eaddrinuse,但netstat -ano查 1883 没有 LISTENING。原因通常是 Windows 的“排除端口范围”占用了该端口,或者 Hyper-V 保留了动态端口段。用netsh int ipv4 show excludedportrange protocol=tcp查看保留段。解决方法是换一个监听端口,或者调整 Hyper-V 的动态端口范围。这个问题在开发机上尤其常见,因为 Docker Desktop 和 WSL2 会占用大量端口段。
5.2 Dashboard 能打开但客户端连不上 1883
现象:浏览器访问 18083 正常,但 MQTT 客户端连 1883 超时。原因九成是 Windows 防火墙拦了入站。解决:在“高级安全 Windows Defender 防火墙”里新建入站规则,放行 TCP 1883。如果只是本机测试,也可以临时把网络配置文件设为“专用”并允许应用通过防火墙。注意,放行后如果客户端在另一台机器,还要确认两台机器在同一网段且没有其他隔离策略。
5.3 前台窗口一关 Broker 就退出
现象:用emqx.cmd console启动,关掉 CMD 窗口后服务不可用。原因:console就是前台模式,窗口关闭等于进程终止。解决:生产或长期运行要用emqx.cmd start后台启动,或者用emqx_service.cmd install注册成 Windows 服务。注册服务后可以用net start emqx启动。但要注意,服务模式下的日志路径和前台模式一致,排查问题时还是去看log目录。
5.4 配置文件改了但行为没变
现象:改了emqx.conf里的端口,重启后还是旧端口。原因:EMQX 5.x 的部分配置在首次启动后会写入data\configs下的运行时配置,优先级高于etc\emqx.conf。解决:要么用 Dashboard 改,要么删掉data\configs下对应文件再重启。我一般直接emqx.cmd stop,删data\configs,再启动,让etc\emqx.conf重新生效。这个机制是 5.x 和 4.x 的一大差异,不熟悉的话很容易怀疑人生。
5.5 大量客户端连接后内存飙升
现象:几百个客户端连上后,Erlang 进程内存持续上涨。原因:每个 MQTT 连接对应一个 Erlang 进程,默认的进程内存和 TCP 缓冲区参数偏保守。解决:在emqx.conf里调整listeners.tcp.default.max_connections和sysmon.os相关参数,同时检查是否有客户端频繁重连导致会话堆积。Windows 下还要注意 Erlang 虚拟机的内存分配策略和 Linux 不同,建议用emqx_ctl.cmd broker metrics观察连接数和消息速率,再决定是否要限制单 IP 连接数。
6. 进阶技巧:用规则引擎把消息落到本地文件
6.1 规则引擎能做什么,为什么在 Windows 上更实用
EMQX 的规则引擎可以在 Broker 内部对消息做过滤、转换和转发,不需要额外写订阅客户端。在 Windows 环境下,很多团队没有现成的 Kafka 或数据库,规则引擎可以直接把消息写入本地文件或转发到 HTTP 接口,省掉一个中间件。5.3.2 的规则引擎支持 SQL 语法,配合内置的file动作,可以把指定主题的消息追加到文本文件。
6.2 配置一条“收到消息就写文件”的规则
在 Dashboard 左侧进入「集成」→「规则」,新建规则。SQL 写:
SELECT payload, topic, timestamp FROM "sensor/#"这表示订阅sensor/下所有主题。然后添加动作,选择「文件」类型,配置:
文件路径:D:/emqx_data/sensor.log 写入模式:追加 模板:${timestamp} ${topic} ${payload}保存后启动规则。向sensor/temp发一条消息,去D:\emqx_data\sensor.log看,应该多了一行。这里的关键是模板变量:${timestamp}、${topic}、${payload}是规则引擎内置的字段,不需要额外定义。文件路径同样要用正斜杠。
6.3 验证规则是否生效的三个检查点
第一,看 Dashboard 规则列表里的「命中次数」是否增加。如果一直是 0,说明 SQL 没匹配到消息,检查主题通配符写法。第二,看log目录下的emqx.log,规则引擎执行失败会在这里打[error]。第三,直接看目标文件是否可写。Windows 下如果文件被其他程序占用(比如你用记事本开着),追加会失败。我一般用Get-Content -Wait在 PowerShell 里实时看文件变化,比反复打开记事本靠谱。
6.4 一个我常犯的错误:忘了规则引擎的异步特性
规则引擎的动作是异步执行的,消息写入文件不是瞬时的。如果你发完消息立刻去读文件,可能读不到。我当初就因为这个怀疑规则没生效,反复重启了好几次。后来在动作配置里加了重试和缓冲参数,并养成发完消息等两秒再验证的习惯。另外,文件动作在高吞吐下会成为瓶颈,如果消息量超过每秒几千条,建议改用 HTTP 转发或直接落数据库,别跟本地文件较劲。
希望帮到你。
本文还有配套的精品资源,点击获取