EdgeLink SimpleMQTT 连接 EMQX:从配置到验证全流程
EdgeLink SimpleMQTT 连接 EMQX:从配置到验证全流程

EdgeLink SimpleMQTT 连接 EMQX:从配置到验证全流程

把网关数据送到云端,MQTT 是绕不开的协议。EdgeLink Studio 内置了 SimpleMQTT 插件,配置不算复杂,但坑不少,SSL 选项没清空就连不上 Broker,Client ID 重复导致设备频繁掉线……

这篇以 EdgeLink Studio 连接 EMQX 5.x 为例,把从配置到验证的完整流程走一遍,每个容易出错的地方都标出来。照着做,一次就能通。

一、SimpleMQTT 是什么?

SimpleMQTT 是 EdgeLink 提供的一种简单 MQTT 主题/载荷方案。它支持:

  • Tag 数据上传:将网关采集的 Tag 点位数据以 JSON 格式发布到 MQTT 主题
  • Tag 数据下发:云平台通过 MQTT 主题下发 JSON 指令,修改网关上的 Tag 值
  • 断点续传:网络断开时数据缓存到本地,恢复后自动重传
  • 外部命令执行:收到特定主题消息时执行系统命令(谨慎使用)

“Simple” 是相对于阿里云物联网平台等专用云插件而言的——SimpleMQTT 不绑定特定云平台,任何标准 MQTT Broker 都能对接。

二、基础连接参数配置

在 EdgeLink Studio 的”云服务”中添加 SimpleMQTT 连接,配置项如下:

配置项推荐值 / 注意事项
启用此连接必须勾选
主机 (Host)EMQX 服务器的公网 IP 或域名,如 123.56.133.131
端口号MQTT 默认明文端口 1883;启用 SSL 则为 8883
MQTT 版本号选择 3.1.1(与 EMQX 5.x 完全兼容)
客户端标识符 (Client ID)必须全局唯一,建议使用有意义的 ID 如 ECU1051_001
用户名 / 密码在 EMQX Dashboard 中已创建的认证凭据
保持连接 (Keepalive)默认 60 秒
重连间隔默认 60 秒
超时时间默认 30 秒
启用 SSL如未配置证书,保持不勾选

⚠️ 三个最容易踩的坑

  1. Client ID 重复:两台设备用同一个 Client ID 连接 EMQX,后连的会把先连的踢下线,导致设备频繁掉线。每台设备的 Client ID 必须唯一。
  2. Keepalive 时间 < 重连间隔:如果 Keepalive 时间短于重连间隔,设备还没来得及重连就被 Broker 判定为离线了。Keepalive 必须 ≥ 重连间隔。
  3. SSL 选项残留:即使你没有勾选”启用 SSL”,如果下方的”SSL 验证方式”没有被清空或设为”无”,设备也会尝试 SSL 握手并失败。不使用 SSL 时,务必同步清空 SSL 验证方式。

三、主题(Topic)命名规范

SimpleMQTT 有四个主题配置项,每个都有特定用途:

主题类型配置项推荐格式是否必填说明
Data Topic数据上报主题data/<设备标识>✅ 必填设备发布实时数据的主题
Command Topic命令接收主题cmd/<设备标识>选填服务器下发 JSON 指令修改 Tag 值
Resume Topic断点续传主题data/<标识>/r选填发布断线缓存数据,不填则复用 Data Topic
External Topic外部命令主题按需设置选填收到消息时执行系统命令

主题命名注意事项

  • 不要使用特殊字符:主题中不要使用 +# 等 MQTT 通配符(这些是订阅端用的,发布端不能用)
  • 包含设备唯一标识:建议在主题中包含设备 ID(如 data/ECU1051_001),便于云平台区分不同设备
  • 层级用 / 分隔:如 data/factory_A/line_1/temp_sensor
  • 不要以 / 开头:虽然 MQTT 协议允许,但会导致主题层级多一个空的首层,容易混淆

💡 实用建议:为每个设备分配唯一的 Data Topic 和 Client ID。比如 10 台 ECU 分别用 data/ECU001 ~ data/ECU010,云平台通过主题就能区分数据来源,不需要解析 Payload 里的设备标识。

四、Tag 点列表配置(极易出错)

这是整个配置过程中最容易翻车的地方。Tag 配置不合规,保存时就会报错”页面中有输入错误”,而且不会告诉你具体哪个 Tag 有问题。

Tag 命名规则

规则说明
允许的字符只允许字母、数字、下划线、可以中文
不能包含冒号tag:1 ❌ → tag_1 ✅
不能包含空格tag 1 ❌ → tag_1 ✅
区分大小写Temp 和 temp 是两个不同的 Tag

别名

可以包含中文,用于 EdgeLink Studio 界面显示,比如 Tag 名为 temperature_a,可以设为”A相温度”。

点类型

必须正确选择,不能留空或无效:

  • analog:模拟量(温度、压力、电压等数值)
  • digital:数字量(开关状态、报警标志等)
  • string:字符串(设备型号、状态描述等)

数值范围

合理设置最高/最低值及变化阈值。如果范围设置不当,可能导致:

  • 频繁触发变化上传,浪费带宽
  • 或该上传的不上传,丢失重要数据

排错方法

如果保存时报错”页面中有输入错误”,按以下步骤排查:

  1. 清空 Tag 列表,逐个添加,每次保存后验证
  2. 重点关注 Tag 名称是否符合命名规则
  3. 检查点类型是否有效选择
  4. 检查数值范围设置是否合理

五、Payload 格式详解

SimpleMQTT 支持三种 Payload 格式,通过 Payload Type 选项控制:

5.1 Simple(默认格式)

不带质量值的标准 JSON 格式:

json

{
    "d": [
        {
            "tag": "AI.0",
            "value": 12,
            "quality": 0
        },
        {
            "tag": "AI.1",
            "value": 12,
            "quality": 0
        }
    ],
    "ts": "2017-12-22T08:05:20+0000"
}
字段说明
d数据数组,包含所有上报的 Tag 点信息
d[].tagTag 名称
d[].valueTag 当前值
d[].qualityTag 质量值(0 = Good)
ts时间戳,遵循 ISO 8601 标准

5.2 Simple with quality

与 Simple 格式相同,但质量值字段始终包含有效数据。当 quality 不为 0 时表示数据异常(如通信中断、值超范围等)。

5.3 Compact(精简模式)

不含质量值的精简格式,适合带宽受限的场景:

json

{
    "ts": 1451649600512,
    "values": {
        "tag1": "value1",
        "tag2": "value2"
    }
}

Compact 模式的优势:

  • 报文体积更小,节省带宽
  • 键值对结构更简洁,云平台解析更方便
  • 时间戳使用 UNIX 毫秒时间戳,数字处理更高效

🔧 选型建议:如果带宽充足且需要监控数据质量,用 Simple with quality;如果带宽受限或只关心数值,用 Compact。

5.4 下发命令格式(Command Topic)

云平台通过 Command Topic 下发 JSON 指令修改 Tag 值,格式与发布格式类似,但数组键名从 d 改为 w(write):

json

{
    "w": [
        {
            "tag": "AO_1",
            "value": 12.88
        },
        {
            "tag": "AO_2",
            "value": 18.76
        }
    ],
    "ts": "2017-12-28T12:22:21+0000"
}

以上封包会将 AO_1 的值写为 12.88,AO_2 的值写为 18.76。ts 字段可以省略。

5.5 断点续传格式

断线重传的数据封包与实时数据格式完全一样,区别在于:

  • 时间戳 ts 是从数据记录中获取的历史时间,而不是当前时间
  • 发布到 Resume Topic(如果配置了的话),而不是 Data Topic

六、发布参数优化建议

参数推荐值理由
QoS1保证消息至少送达一次,开销适中;QoS 2 延迟明显增加
Payload TypeSimple 或 Compact按需选择,带宽受限用 Compact
TimestampUTC Time (ISO-8601)避免时区混淆,推荐统一 UTC
Compress PayloadNo Compression除非云平台支持 GZIP 解压,否则保持不压缩
RETAIN flagNone普通数据上报不需要保留消息
定期上传启用,周期 ≥ 1s保证数据持续上报
变化上传按需启用值变化时触发上传,可减少带宽,但需正确设置变化阈值

QoS 选择指南

QoS 级别语义开销适用场景
QoS 0最多一次(可能丢失)最小实时性要求高、允许丢数据的场景
QoS 1至少一次(可能重复)中等推荐默认,适合大多数工业数据上报
QoS 2恰好一次(不丢不重)最大对数据准确性要求极高的场景

⚠️ QoS 1 的重复问题:QoS 1 保证”至少一次”,意味着同一消息可能被送达多次。云平台需要做幂等处理——根据时间戳或消息 ID 去重,避免重复数据影响统计结果。

定期上传 vs 变化上传

模式触发条件优点缺点
定期上传固定时间间隔数据连续,不遗漏带宽消耗稳定,即使数据没变化也上传
变化上传Tag 值变化超过阈值节省带宽快速变化的 Tag 会频繁触发上传

推荐组合:定期上传作为基础(如每 10 秒一次),变化上传作为补充(设置合理的死区阈值)。这样既保证数据连续性,又能在数据突变时及时上报。

七、版本兼容性

组件版本兼容性说明
EdgeLink Studio SimpleMQTT基于 MQTT 3.1.1
EMQX 5.x完全向下兼容 MQTT 3.1.1✅ 无缝连接
EMQX 4.x支持 MQTT 3.1.1✅ 兼容
Mosquitto支持 MQTT 3.1.1✅ 兼容

无需强制升级设备协议,MQTT 3.1.1 的特性已完全满足数据上报 + 命令下发需求。如果未来需要 MQTT 5.0 的高级特性(如共享订阅、消息过期时间),需要确认 EdgeLink 版本是否支持。

八、常见错误及解决方法

错误现象可能原因解决方案
保存时提示”页面中有输入错误”Tag 名称含非法字符修改 Tag 名为纯英文/数字/下划线,不以数字开头
连接失败(设备日志报错)用户名/密码错误,或 EMQX 未创建该用户检查 Dashboard 中的认证配置,确认用户存在且密码正确
连接成功但收不到数据Data Topic 订阅错误 / 定期上传未启用确认订阅主题与设备发布的 Topic 完全一致;检查是否勾选”定期上传”
SSL 相关校验警告未启用 SSL 但 SSL 验证方式被设置清空 SSL 验证方式或设为”无”
设备上线后频繁掉线Client ID 冲突 / Keepalive 时间过短确保 Client ID 唯一;Keepalive ≥ 重连间隔
数据有重复QoS 1 的”至少一次”导致重复云平台做幂等处理(按时间戳去重)
断线续传数据丢失Resume Topic 未配置 / 存储空间不足配置 Resume Topic,检查网关存储空间
命令下发无效Command Topic 未配置 / Tag 名不匹配配置 Command Topic,确保 JSON 中的 Tag 名与网关中一致

九、快速验证链路是否通畅

配置完成后,按以下三步验证数据链路:

方法一:服务器端命令行订阅

在 EMQX 服务器上用 mosquitto_sub 订阅数据主题:

bash

mosquitto_sub -h 127.0.0.1 -p 1883 -u <用户名> -P <密码> -t "data/test" -v

如果能看到 JSON 格式的数据持续输出,说明链路正常。

方法二:EMQX Dashboard → WebSocket 客户端

  1. 登录 EMQX Dashboard(默认端口 18083)
  2. 打开”工具” → “WebSocket 客户端”
  3. 填写连接信息:
    • 端口:8083
    • Path:/mqtt
    • 用户名/密码:与设备相同
  4. 连接成功后,订阅主题 data/test
  5. 观察是否收到实时消息

方法三:第三方工具 MQTTX

  1. 下载 MQTTX(跨平台 MQTT 客户端)
  2. 连接至 EMQX 公网 IP:1883,使用与设备相同的认证凭证
  3. 订阅 data/test 或 data/#(通配符订阅所有子主题)
  4. 观察实时消息

🔧 验证技巧:如果以上三种方法都收不到数据,但 EMQX Dashboard 的”客户端”页面能看到设备在线,说明设备连接成功但发布主题不对。检查 Data Topic 配置是否与订阅主题完全一致(注意大小写、多余的空格)。

验证命令下发

用 MQTTX 向 Command Topic 发布 JSON 指令:

json

{
    "w": [
        {
            "tag": "test_tag",
            "value": 100
        }
    ]
}

然后在 EdgeLink 在线监控中查看 test_tag 的值是否变为 100。如果没变,检查:

  • Command Topic 是否已配置
  • Tag 名是否完全一致(区分大小写)
  • 该 Tag 是否允许写入(有些只读 Tag 无法通过命令修改)

十、安全注意事项

安全项说明
认证务必在 EMQX 中启用用户名/密码认证,不要允许匿名连接
SSL/TLS如果数据涉及敏感信息,启用 SSL 加密(端口 8883)
ACL 规则在 EMQX 中配置 ACL,限制每个客户端只能发布/订阅自己的主题
External Command谨慎使用!支持 %p(载荷)、%t(主题)、%pf(载荷文件)通配符
命令注入防护External Command 的命令行中禁止使用 |&;<>(){} 等字符
非 root 执行MQTT 主程序以非 root 用户身份运行,只能执行该用户权限范围内的命令

⚠️ External Command 安全警告:这个功能允许通过 MQTT 消息触发网关上的系统命令执行。如果配置不当,可能被利用执行恶意命令。除非你完全理解风险并有严格的访问控制,否则不要启用此功能。

十一、断点续传配置

断点续传是 SimpleMQTT 的重要特性,在网络不稳定时保证数据不丢。

工作原理

  1. 网络断开时,网关将采集到的数据写入本地存储
  2. 网络恢复后,网关将缓存数据通过 Resume Topic 发布到 Broker
  3. 缓存数据的时间戳是采集时的历史时间,不是发送时的当前时间

配置要点

配置项说明
Resume Topic如不设置,断点续传数据会使用 Data Topic 发布
存储空间确保网关有足够的存储空间缓存数据(取决于断网时长和 Tag 数量)
续传延时网络恢复后不要立即全量发送,设置适当延时避免拥塞

🔧 建议为 Resume Topic 设置独立主题(如 data/ECU001/r),这样云平台可以区分实时数据和历史续传数据,分别处理。

小结

SimpleMQTT 配置的核心要点:

  1. Client ID 唯一——否则设备互相踢下线
  2. Tag 名称合规——只允许字母、数字、下划线,不以数字开头
  3. SSL 选项一致——不用 SSL 时清空所有 SSL 相关配置
  4. Keepalive ≥ 重连间隔——否则来不及重连就被判定离线
  5. 主题包含设备标识——便于云平台区分数据来源
  6. QoS 1 + 幂等处理——平衡可靠性和性能

把这些要点记住,MQTT 连接的基本功就扎实了。


上一篇:[EdgeLink VCOM 虚拟串口:远程调试的利器与陷阱] 下一篇:[EdgeLink RESTful API 与远程运维:让网关触手可及]