一个基于 Node.js 与 mqtt 的轻量发布脚本,可以通过命令行或环境变量向 MQTT Broker 发送消息,并提供 Docker 部署示例。
npm install
# 方式一:使用环境变量
PLUGIN_MQTT_URL="mqtt://localhost:1883" \
PLUGIN_MQTT_TOPIC="demo/topic" \
PLUGIN_MQTT_MESSAGE="Hello from Codex" \
npm run publish
# 方式二:使用命令行参数
node src/index.js \
--url mqtt://localhost:1883 \
--topic demo/topic \
--message "Hello from Codex"
npm run publish会自动触发npm run build,生成dist/index.js后再执行。如果只想构建,可单独运行npm run build。
可选参数:
--username / 环境变量 PLUGIN_MQTT_USERNAME--password / 环境变量 PLUGIN_MQTT_PASSWORD--client-id / 环境变量 PLUGIN_MQTT_CLIENT_ID--qos / 环境变量 PLUGIN_MQTT_QOS(默认 0)--retain / 环境变量 PLUGIN_MQTT_RETAIN(任何等价于 true 的值表示设置 retain 标记)--format / 环境变量 PLUGIN_MQTT_FORMAT(消息格式:json、text、raw,默认 json)--ca / 环境变量 PLUGIN_MQTT_CA_PATH(CA 根证书路径)--cert / 环境变量 PLUGIN_MQTT_CERT_PATH(客户端证书路径,可选)--key / 环境变量 PLUGIN_MQTT_KEY_PATH(客户端私钥路径,可选)--reject-unauthorized / 环境变量 PLUGIN_MQTT_REJECT_UNAUTHORIZED(设置为 false 可跳过证书校验,默认启用校验)--debug / 环境变量 PLUGIN_MQTT_DEBUG(启用调试模式,打印连接信息和消息体)EMQX 专享实例提供以下连接信息:
d5faae31.ala.cn-hangzhou.emqxsl.cn88838084# 下载 EMQX 提供的 ca.crt 证书文件并放在当前目录
export PLUGIN_MQTT_URL="mqtts://d5faae31.ala.cn-hangzhou.emqxsl.cn:8883"
export PLUGIN_MQTT_TOPIC="demo/topic"
export PLUGIN_MQTT_MESSAGE="Hello TLS"
export PLUGIN_MQTT_USERNAME="你的用户名"
export PLUGIN_MQTT_PASSWORD="你的密码"
export PLUGIN_MQTT_CA_PATH="./ca.crt"
npm run publish
node src/index.js \
--url wss://d5faae31.ala.cn-hangzhou.emqxsl.cn:8084/mqtt \
--topic demo/topic \
--message "Hello via WSS" \
--username 你的用户名 \
--password 你的密码 \
--ca ./ca.crt
如果使用自签名证书且希望跳过校验,可额外传入
--reject-unauthorized false。生产环境不建议关闭校验。
启用调试模式可以打印 MQTT 连接信息和消息体内容,便于故障排查。
方式一:环境变量
PLUGIN_MQTT_URL="mqtt://localhost:1883" \
PLUGIN_MQTT_TOPIC="demo/topic" \
PLUGIN_MQTT_MESSAGE='{"key":"value"}' \
PLUGIN_MQTT_DEBUG=true \
npm run publish
方式二:命令行参数
node src/index.js \
--url mqtt://localhost:1883 \
--topic demo/topic \
--message '{"key":"value"}' \
--debug
启用调试模式后会输出以下信息:
[mqtt-plugin] 调试模式已启用 [mqtt-plugin] ========== 调试信息 ========== [mqtt-plugin] URL: mqt*********883 [mqtt-plugin] 用户名: use***ame [mqtt-plugin] 密码: pas***ord [mqtt-plugin] Topic: demo/topic [mqtt-plugin] 消息格式: json [mqtt-plugin] 原始消息: Hello World [mqtt-plugin] 格式化后: {"message":"Hello World","timestamp":"2024-10-22T10:30:00.000Z"} [mqtt-plugin] QoS: 0 [mqtt-plugin] Retain: false [mqtt-plugin] ================================
注意:敏感信息(URL、用户名、密码)会被部分隐藏,只显示头尾 3 个字符,中间用
*表示,以保护安全。
# 构建镜像
docker build -t mqtt-plugin .
# 运行容器并通过环境变量注入配置
docker run --rm \
-e PLUGIN_MQTT_URL=mqtt://host.docker.internal:1883 \
-e PLUGIN_MQTT_TOPIC=demo/topic \
-e PLUGIN_MQTT_MESSAGE="Hello from Docker" \
mqtt-plugin
如果你的 Broker 运行在宿主机,请根据系统调整
PLUGIN_MQTT_URL。在 Linux 上可以将其指向宿主机 IP。
若要在容器中使用 TLS 证书,可将证书目录挂载进容器:
docker run --rm \
-e PLUGIN_MQTT_URL=mqtts://d5faae31.ala.cn-hangzhou.emqxsl.cn:8883 \
-e PLUGIN_MQTT_TOPIC=demo/topic \
-e PLUGIN_MQTT_MESSAGE="Hello TLS from Docker" \
-e PLUGIN_MQTT_USERNAME=你的用户名 \
-e PLUGIN_MQTT_PASSWORD=你的密码 \
-e PLUGIN_MQTT_CA_PATH=/certs/ca.crt \
-v $(pwd)/certs:/certs:ro \
mqtt-plugin
. ├── Dockerfile ├── README.md ├── scripts │ └── build.js ├── package-lock.json ├── package.json ├── src │ └── index.js └── dist └── index.js
插件支持多种消息格式,通过 --format 参数或 PLUGIN_MQTT_FORMAT 环境变量配置:
JSON格式(默认):
# 普通文本会被包装为JSON对象
PLUGIN_MQTT_FORMAT="json" \
PLUGIN_MQTT_MESSAGE="Build completed" \
npm run publish
# 发送: {"message":"Build completed","timestamp":"2024-10-22T10:30:00.000Z"}
# 已有的JSON字符串保持不变
PLUGIN_MQTT_FORMAT="json" \
PLUGIN_MQTT_MESSAGE='{"status":"success","buildId":"123"}' \
npm run publish
# 发送: {"status":"success","buildId":"123"}
文本格式:
PLUGIN_MQTT_FORMAT="text" \
PLUGIN_MQTT_MESSAGE="Simple text message" \
npm run publish
# 发送: Simple text message
原始格式:
PLUGIN_MQTT_FORMAT="raw" \
PLUGIN_MQTT_MESSAGE="<xml><status>ok</status></xml>" \
npm run publish
# 发送: <xml><status>ok</status></xml>
命令行参数方式:
node src/index.js \
--url mqtt://localhost:1883 \
--topic demo/topic \
--message "Hello World" \
--format json