设备接入(自定义协议)
这篇解决什么
设备报文不是现成 JSON / MQTT 时,该改哪一层,不要去找一个不存在的 protocol: custom。读完能对上 IotProtocol、序列化和 TCP 拆包三个扩展点。
IotProtocolTypeEnum 只有 tcp / udp / websocket / http / mqtt / emqx / coap / modbus_tcp_client / modbus_tcp_server。IotProtocolManager.createProtocol 的 switch 没有 custom 分支。先看 设备接入(概述)。
示意图:先选已有传输协议,再换序列化或拆包。没有独立 custom 类型。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 协议接口 | getId / getType / start / stop | ruoyi-office/yudao-module-iot/yudao-module-iot-gateway/.../protocol/IotProtocol.java |
| 工厂 | 按 yaml protocol 建实例 | IotProtocolManager.java |
| 序列化 | json / binary | IotSerializeTypeEnum、IotMessageSerializer |
| 拆包 | 仅 TCP:delimiter / length_field / fixed_length | IotTcpCodecTypeEnum |
| 产品字段 | protocolType 必须是枚举字符串 | IotProductSaveReqVO |
多数私有设备先走现成传输,再换报文格式。
- 换序列化:yaml
serialize填json或binary。HTTP / CoAP 强制 JSON。EMQX 可按产品配置解析。二进制帧是魔术字 + 版本 + 类型 + 长度 + method + body,见IotBinarySerializer。 - 换 TCP 拆包:
tcp.codec.type选三种之一。分隔符支持\n/\r\n。长度字段要配 offset / length。 - 加一种传输:实现
IotProtocol,枚举加一项,再在IotProtocolManager加 case。只改进 yaml 不会凭空出现新协议。
Modbus Server 的认证帧用自定义功能码(样例 65),那是 Modbus 扩展,不是新的 protocolType。见 设备接入(Modbus Server)。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
protocol | 实例类型,必须能 IotProtocolTypeEnum.of | ProtocolProperties |
serialize | 可选;json / binary | IotSerializeTypeEnum |
tcp.codec.type | TCP 拆包 | IotTcpConfig.CodecConfig |
产品不要填 custom
管理端产品 protocolType 用 @InEnum(IotProtocolTypeEnum)。填 custom 校验失败,网关 of() 也会得到 null,实例直接跳过。
先改报文,再改传输
只是 JSON 字段不同,写 IotMessageSerializer 即可。只有端口、会话、认证模型都对不上时,才新写 IotProtocol。
switch (protocolType) {
case HTTP: return createHttpProtocol(config);
case TCP: return createTcpProtocol(config);
// 没有 custom
default:
throw new IllegalArgumentException("暂不支持");
}摘自 IotProtocolManager.createProtocol。未知类型会打日志并返回 null。
配置与操作
没有 protocol: custom。IotProtocolManager 的 switch 只有现成传输类型。私有报文先选 tcp / udp 等,再改 serialize(json / binary)或 TCP codec。要加新传输:实现 IotProtocol、枚举加项、工厂加 case,只改 yaml 不会出现新协议。
HTTP / CoAP 强制 JSON。Modbus Server 的 FC65 仍是 modbus_tcp_server。开启见 IoT 功能设计。

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