创建 MQTT 产品
接入方式选 MQTT,联调期建议打开 allowInsert。
这页复用 MQTT 任意主题 / 第三方 Broker 接入说明,方便在当前目录下直接查看。
这条路(自建接入 / 外置 MQTT 网络组件)适合下面这类 MQTT 设备:
要先说明一件很容易误解的事:
"任意主题设备"不等于"只能透传"。
在自建接入模式里,你仍然可以把主题类型配置成:
THING_MODEL:消息体已经是标准物模型 JSON。PASSTHROUGH:消息体还是厂商自定义格式,需要编解码。接入方式选 MQTT,联调期建议打开 allowInsert。
填 host、port、username、password、clientIdPrefix。
每条映射填 topicPattern + topicCategory + productKey + qos。
产品详情 → 连接信息 → 管理自建接入,切到自建接入模式,再添加设备。
进入设备详情 → 设备连接信息,直接复制自建 host、账号、ClientID。
脚本里写 preDecode 提取 deviceId,透传再补 decode/encode。
任意主题模式里,最容易混的是"到底该在哪一层配"。
| 对象 | 你在哪里配 | 它负责什么 |
|---|---|---|
| 产品 | 产品管理 | 定义 productKey、物模型、编解码、自动注册、产品级下行主题 |
| 连接信息 | 产品详情 → 连接信息 | 绑定自建 MQTT 网络组件,查看当前接入模式 |
| MQTT 网络组件 | 网络组件 → MQTT | 连接第三方 Broker,订阅任意 Topic,做主题映射 |
| 协议脚本 | 产品驱动 / IDE 调试器 | 处理 preDecode、decode、encode |
任意主题模式下,平台大致按这个顺序处理:
topicPattern 订阅消息。preDecode,拿 deviceId。THING_MODEL,平台按标准 JSON 继续处理;如果是 PASSTHROUGH,继续走 decode / encode。这里有两个关键细节:
productKey 识别优先看主题映射里是否显式配置,第一次联调建议直接填上。topicCategory = THING_MODEL,通常也要考虑 deviceId 怎么识别,因为这时已经没有标准 Topic 可用。在产品管理里新建产品时,接入方式还是选 MQTT。
第一次联调时,产品层最值得先看一眼的 3 个配置是:
allowInsert:联调期设备可能还没预创建,建议先打开。decoderType / encoderType:上报和下发不是普通字符串时,需要确认编码方式。downTopic:如果设备订阅的是固定主题,建议先在产品里把下行 Topic 固定住。
网络组件负责的是"平台怎么去连 Broker",不是"设备怎么连平台"。
第一次联调时,先把这些基础连接参数填好:
| 字段 | 作用 |
|---|---|
host | 第三方 Broker 地址 |
port | Broker 端口 |
username | Broker 账号 |
password | Broker 密码 |
clientIdPrefix | 平台作为客户端连上去的 ClientID 前缀 |
connectTimeout | 连接超时时间(毫秒) |

进入网络组件详情 → 主题订阅,逐条添加要订阅的 Topic。
每一条主题映射,最关键的字段是这几个:
| 字段 | 作用 | 第一次联调建议 |
|---|---|---|
topicPattern | 实际订阅的主题模式,支持 + 和 # | 先用最小范围,不要一上来订 # |
topicCategory | 按物模型还是透传处理 | 必填 |
qos | MQTT QoS | 一般先用 1 |
productKey | 把这条 Topic 明确归属到哪个产品 | 建议显式填上 |
enabled | 是否启用 | 联调时保持启用 |
topicCategory 选择规则:
| 选项 | 什么时候选 |
|---|---|
THING_MODEL | payload 已经是标准物模型 JSON |
PASSTHROUGH | payload 还是私有协议,需要编解码 |

用主题模式测试工具
网络组件详情页有一个"主题模式测试工具",输入设备实际 Topic,立刻告诉你能否匹配、匹配到了哪个产品。联调时强烈推荐先在这里自测一次。

路径就在 产品详情 → 连接信息:
自建接入。新版本推荐直接从 设备详情 拿连接信息,不用再回产品详情翻。
路径:设备管理 → 新增设备 → 设备详情 → 设备连接信息。
自建接入模式下,页面会直接给出:
host / portUsername / Password:来自网络组件配置ClientID:按下面规则拼好并支持一键复制自建接入 ClientID 规则
ClientID = ProductKey.DeviceIdhost、用户名、密码都来自产品绑定的 MQTT 网络组件。
任意主题模式下,真正最容易卡住的是 deviceId。
平台会执行产品脚本里的 preDecode 去识别设备号。识别来源可以是:
下面这个例子演示"从 Topic 最后一段取设备号":
var preDecode = (payload, context) => {
var result = {};
var topic = "";
if (context && context.upTopic) {
topic = context.upTopic;
} else if (context && context.topic) {
topic = context.topic;
}
var parts = topic.split("/");
if (parts.length > 0) {
result.deviceId = parts[parts.length - 1];
}
return result;
};如果消息是透传模式,还要继续补:
decode:把设备上报转成属性或事件。encode:把平台下发转成设备能识别的报文。如果设备订阅的下行 Topic 不是平台默认主题,第一次联调建议先在产品里把 downTopic 固定住。
常用占位符至少支持:
#{productKey} / / ${productKey} / {productKey}#{deviceId} / / ${deviceId} / {deviceId}
如果你在 decode 结果里返回了 replyPayload,平台会自动尝试回复。
自动回复踩坑提醒
replyPayload 的结果,平台就回 1 次。replyPayload,平台就会回 10 次。联调期通常只建议保留一条回复。

建议按这个顺序来:
productKey。topicCategory 选对。preDecode,确认能稳定拿到 deviceId。decode 和 encode。topicPattern 能匹配,但 productKey 没配,自动提取又没成功。topicCategory 选错,导致 JSON 被当透传,或者透传被当 JSON。preDecode 没返回稳定的 deviceId。继续排查可以直接看 MQTT 常见问题。