logo
0
0
Login

MQTT 消息发送插件

一个基于 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(消息格式:jsontextraw,默认 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(启用调试模式,打印连接信息和消息体)

TLS 配置示例(以 EMQX Cloud 为例)

EMQX 专享实例提供以下连接信息:

  • 连接地址:d5faae31.ala.cn-hangzhou.emqxsl.cn
  • MQTT over TLS/SSL 端口:8883
  • WebSocket over TLS/SSL 端口:8084

MQTT/TCP + TLS

# 下载 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

WebSocket + TLS

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 构建与运行

# 构建镜像 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

后续扩展建议

  • 根据业务封装为可复用的 npm 包或将消息体序列化为 JSON。
  • 新增单元测试确保参数解析及重试逻辑正确。
  • 针对 IoT Hub / EMQX 等平台添加 TLS 证书配置支持。

消息格式配置

插件支持多种消息格式,通过 --format 参数或 PLUGIN_MQTT_FORMAT 环境变量配置:

支持的格式

  • json(默认):自动将消息包装为JSON格式,如果原消息已是有效JSON则保持不变
  • text:将消息转换为纯文本字符串
  • raw:保持消息原始格式不变

使用示例

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

About

No description, topics, or website provided.
Language
JavaScript86.3%
Dockerfile11.2%
Shell2.6%