设备接入(EMQX 协议)
这篇解决什么
外接 EMQX 时网关扮演什么角色。读完能对上 protocol: emqx:网关是 HTTP Hook + MQTT 客户端,不是再起一个 Broker。
产品 protocolType 填 emqx。内嵌 Broker 见 设备接入(MQTT 协议)。总开关见 设备接入(概述)。
示意图:设备只连 EMQX。认证和上下线回调用 Hook。上行靠网关订阅 /sys/#。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 协议 | IotEmqxProtocol | ruoyi-office/yudao-module-iot/yudao-module-iot-gateway/.../emqx/IotEmqxProtocol.java |
| Hook | /mqtt/auth /mqtt/acl /mqtt/event | IotEmqxAuthEventHandler / IotMqttTopicUtils |
| 样例 | id: emqx-1,默认关 | application.yaml |
yaml:port: 8090 是 Hook HTTP,不是设备 MQTT 口。设备连 emqx.mqtt-host + mqtt-port(样例 127.0.0.1:1883)。网关自己再用 mqtt-username / mqtt-password / mqtt-client-id 当客户端连上 Broker,默认订 /sys/#,QoS 1。
EMQX 侧要把 HTTP 认证、ACL、Webhook 指到网关 8090 这三条路径。Hook 成功固定回 HTTP 200,body 里 allow / deny / ignore。
事件:client.connected / client.disconnected 用来刷设备在线。注册同样认 clientId 里的 |authType=register|。
Topic 规则与内嵌 MQTT 相同:/sys/{productKey}/{deviceName}/...。ACL Hook 拦跨设备订阅。
样例里 trust-all: true、默认账号只够本机。生产必须关信任全部证书,并改掉 Broker 账号。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
port | Hook 端口,样例 8090 | ProtocolProperties |
mqtt-host / mqtt-port | 外部 Broker | IotEmqxConfig |
mqtt-topics | 网关订阅,默认 /sys/# | 同上 |
will.topic | 网关异常下线遗嘱 | 同上 |
设备不要连 8090
8090 只有 Hook。设备连 EMQX 的 1883(或你改过的 Broker 口)。连错端口就是 HTTP 握手失败。
和内嵌 mqtt 不要同时抢同一套设备
同一产品只能选一个 protocolType。Broker 可以共用机器,产品行不能既写 mqtt 又当 emqx 用。
示意图:按本仓库实现画的时序。
配置与操作
yaml 开 id: emqx-1,protocol: emqx。port: 8090 是 Hook HTTP(/mqtt/auth /acl /event),设备连的是 emqx.mqtt-host:mqtt-port(样例 127.0.0.1:1883)。网关自己当 MQTT 客户端订 /sys/#。
设备不要连 8090。产品 protocolType 填 emqx,不要和内嵌 mqtt 混用同一产品。生产关掉 trust-all。开启见 IoT 功能设计。

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