把网关数据送到云端,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 | 如未配置证书,保持不勾选 |
⚠️ 三个最容易踩的坑:
- Client ID 重复:两台设备用同一个 Client ID 连接 EMQX,后连的会把先连的踢下线,导致设备频繁掉线。每台设备的 Client ID 必须唯一。
- Keepalive 时间 < 重连间隔:如果 Keepalive 时间短于重连间隔,设备还没来得及重连就被 Broker 判定为离线了。Keepalive 必须 ≥ 重连间隔。
- 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:字符串(设备型号、状态描述等)
数值范围
合理设置最高/最低值及变化阈值。如果范围设置不当,可能导致:
- 频繁触发变化上传,浪费带宽
- 或该上传的不上传,丢失重要数据
排错方法
如果保存时报错”页面中有输入错误”,按以下步骤排查:
- 清空 Tag 列表,逐个添加,每次保存后验证
- 重点关注 Tag 名称是否符合命名规则
- 检查点类型是否有效选择
- 检查数值范围设置是否合理
五、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[].tag | Tag 名称 |
d[].value | Tag 当前值 |
d[].quality | Tag 质量值(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
六、发布参数优化建议
| 参数 | 推荐值 | 理由 |
|---|---|---|
| QoS | 1 | 保证消息至少送达一次,开销适中;QoS 2 延迟明显增加 |
| Payload Type | Simple 或 Compact | 按需选择,带宽受限用 Compact |
| Timestamp | UTC Time (ISO-8601) | 避免时区混淆,推荐统一 UTC |
| Compress Payload | No Compression | 除非云平台支持 GZIP 解压,否则保持不压缩 |
| RETAIN flag | None | 普通数据上报不需要保留消息 |
| 定期上传 | 启用,周期 ≥ 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 客户端
- 登录 EMQX Dashboard(默认端口 18083)
- 打开”工具” → “WebSocket 客户端”
- 填写连接信息:
- 端口:
8083 - Path:
/mqtt - 用户名/密码:与设备相同
- 端口:
- 连接成功后,订阅主题
data/test - 观察是否收到实时消息
方法三:第三方工具 MQTTX
- 下载 MQTTX(跨平台 MQTT 客户端)
- 连接至 EMQX 公网 IP:1883,使用与设备相同的认证凭证
- 订阅
data/test或data/#(通配符订阅所有子主题) - 观察实时消息
🔧 验证技巧:如果以上三种方法都收不到数据,但 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 的重要特性,在网络不稳定时保证数据不丢。
工作原理
- 网络断开时,网关将采集到的数据写入本地存储
- 网络恢复后,网关将缓存数据通过 Resume Topic 发布到 Broker
- 缓存数据的时间戳是采集时的历史时间,不是发送时的当前时间
配置要点
| 配置项 | 说明 |
|---|---|
| Resume Topic | 如不设置,断点续传数据会使用 Data Topic 发布 |
| 存储空间 | 确保网关有足够的存储空间缓存数据(取决于断网时长和 Tag 数量) |
| 续传延时 | 网络恢复后不要立即全量发送,设置适当延时避免拥塞 |
🔧 建议为 Resume Topic 设置独立主题(如
data/ECU001/r),这样云平台可以区分实时数据和历史续传数据,分别处理。
小结
SimpleMQTT 配置的核心要点:
- Client ID 唯一——否则设备互相踢下线
- Tag 名称合规——只允许字母、数字、下划线,不以数字开头
- SSL 选项一致——不用 SSL 时清空所有 SSL 相关配置
- Keepalive ≥ 重连间隔——否则来不及重连就被判定离线
- 主题包含设备标识——便于云平台区分数据来源
- QoS 1 + 幂等处理——平衡可靠性和性能
把这些要点记住,MQTT 连接的基本功就扎实了。
上一篇:[EdgeLink VCOM 虚拟串口:远程调试的利器与陷阱] 下一篇:[EdgeLink RESTful API 与远程运维:让网关触手可及]
