设备接入(MQTT 协议)
这篇解决什么
内置 MQTT Broker 听哪个端口、CONNECT 怎么认证。读完能对上 protocol: mqtt 和 IotMqttProtocol,不要和外接 EMQX 那条搞混。
产品 protocolType 填 mqtt。先看 设备接入(概述)。外接 Broker 见 设备接入(EMQX 协议)。
示意图:网关自己起 Broker。CONNECT 先认证,再收 /sys/... 上行。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 协议 | IotMqttProtocol | ruoyi-office/yudao-module-iot/yudao-module-iot-gateway/.../mqtt/IotMqttProtocol.java |
| 认证 | CONNECT | IotMqttAuthHandler |
| 注册 | clientId 带 |authType=register| | IotMqttRegisterHandler |
| 样例 | id: mqtt-json,默认关,端口 1883 | application.yaml |
yaml:protocol: mqtt,serialize: json,mqtt.max-message-size 默认 8192,connect-timeout-seconds 默认 60。enabled 改 true 才会 listen。
CONNECT 要带 clientId / username / password。格式见概述:productKey.deviceName、deviceName&productKey、HMAC。通过后登记连接并报上线。
Topic 必须落在 /sys/{productKey}/{deviceName}/ 下。方法名点号转斜杠,例如 thing.property.post → /sys/{pk}/{dn}/thing/property/post。回复带 _reply,网关会剥后缀,靠 code 认回复。
订阅只允许该设备前缀,或 /sys/{pk}/{dn}/#。发布不允许 + / #。
动态注册:clientId 含 |authType=register|,走注册 Handler,不走一机一密。Topic 常见 /sys/{pk}/{dn}/thing/auth/register。
下行:IotMqttDownstreamSubscriber 从消息总线取指令,再 publish 回设备。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
port | 默认样例 1883 | ProtocolProperties |
mqtt.max-message-size | 单帧上限 | IotMqttConfig |
clientId / username / password | CONNECT 三件 | IotDeviceAuthUtils |
不要和 EMQX 抢 1883
mqtt 是网关内嵌 Broker。emqx 是连外部 Broker。两套都开、都写 1883,端口必撞,或者设备连错家。
注册连接和业务连接分开
注册用特殊 clientId 标记。拿到 deviceSecret 后,再用正常三件套重连。混在一个 CONNECT 里会走错 Handler。
示意图:按本仓库实现画的时序。
配置与操作
yaml 开 id: mqtt-json,protocol: mqtt,enabled: true,默认口 1883。这是网关内嵌 Vert.x Broker,不是 EMQX。CONNECT 三件套:clientId={productKey}.{deviceName}、username={deviceName}&{productKey}、HMAC password。Topic 必须在 /sys/{pk}/{dn}/ 下。
不要和 emqx 抢 1883。注册用 clientId 含 |authType=register|,拿到 deviceSecret 后再用正常三件套重连。开启见 IoT 功能设计。

本系统截图:IoT 首页。协议实例在网关 yaml,没有「MQTT / HTTP」独立菜单。
