From eb9d27ae9e75a6093bc906a44d01623bb2693a3e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 4 Feb 2026 18:41:31 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=88iot=EF=BC=89=EF=BC=9A=E3=80=90?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E6=94=B9=E9=80=A0=E3=80=91SSL=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8=20SslCon?= =?UTF-8?q?fig=20=E6=9B=BF=E4=BB=A3=EF=BC=8C=E6=9B=B4=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/config/IotGatewayProperties.java | 60 ++++++++++++++++++- .../gateway/protocol/IotProtocolManager.java | 20 +++---- .../protocol/coap/IotCoapProtocol.java | 6 +- .../protocol/emqx/IotEmqxProtocol.java | 6 +- .../gateway/protocol/http/IotHttpConfig.java | 15 ----- .../protocol/http/IotHttpProtocol.java | 15 ++--- .../gateway/protocol/mqtt/IotMqttConfig.java | 16 ----- .../protocol/mqtt/IotMqttProtocol.java | 14 +++-- .../gateway/protocol/tcp/IotTcpConfig.java | 14 ----- .../gateway/protocol/tcp/IotTcpProtocol.java | 14 +++-- .../gateway/protocol/udp/IotUdpProtocol.java | 6 +- .../websocket/IotWebSocketConfig.java | 16 ----- .../websocket/IotWebSocketProtocol.java | 14 +++-- 13 files changed, 109 insertions(+), 107 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/config/IotGatewayProperties.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/config/IotGatewayProperties.java index d91a2f8041..6019b0f079 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/config/IotGatewayProperties.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/config/IotGatewayProperties.java @@ -35,7 +35,7 @@ public class IotGatewayProperties { /** * 协议实例列表 */ - private List protocols; + private List protocols; @Data public static class RpcProperties { @@ -78,7 +78,7 @@ public class IotGatewayProperties { * 协议实例配置 */ @Data - public static class ProtocolInstanceProperties { + public static class ProtocolProperties { /** * 协议实例 ID,如 "http-alink"、"tcp-binary" @@ -117,6 +117,14 @@ public class IotGatewayProperties { */ private String serialize; + // ========== SSL 配置 ========== + + /** + * SSL 配置(可选,配置文件中不配置则为 null) + */ + @Valid + private SslConfig ssl; + // ========== 各协议配置 ========== /** @@ -160,4 +168,52 @@ public class IotGatewayProperties { } + /** + * SSL 配置 + */ + @Data + public static class SslConfig { + + /** + * 是否启用 SSL + */ + @NotNull(message = "是否启用 SSL 不能为空") + private Boolean ssl = false; + + /** + * SSL 证书路径 + */ + @NotEmpty(message = "SSL 证书路径不能为空") + private String sslCertPath; + + /** + * SSL 私钥路径 + */ + @NotEmpty(message = "SSL 私钥路径不能为空") + private String sslKeyPath; + + /** + * 密钥库(KeyStore)路径 + *

+ * 包含客户端自己的证书和私钥,用于向服务端证明身份(双向认证) + */ + private String keyStorePath; + /** + * 密钥库密码 + */ + private String keyStorePassword; + + /** + * 信任库(TrustStore)路径 + *

+ * 包含服务端信任的 CA 证书,用于验证服务端的身份 + */ + private String trustStorePath; + /** + * 信任库密码 + */ + private String trustStorePassword; + + } + } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/IotProtocolManager.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/IotProtocolManager.java index 5d1b6c6d7f..3cd00c7573 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/IotProtocolManager.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/IotProtocolManager.java @@ -45,13 +45,13 @@ public class IotProtocolManager implements SmartLifecycle { if (running) { return; } - List protocolConfigs = gatewayProperties.getProtocols(); + List protocolConfigs = gatewayProperties.getProtocols(); if (CollUtil.isEmpty(protocolConfigs)) { log.info("[start][没有配置协议实例,跳过启动]"); return; } - for (IotGatewayProperties.ProtocolInstanceProperties config : protocolConfigs) { + for (IotGatewayProperties.ProtocolProperties config : protocolConfigs) { if (BooleanUtil.isFalse(config.getEnabled())) { log.info("[start][协议实例 {} 未启用,跳过]", config.getId()); continue; @@ -91,7 +91,7 @@ public class IotProtocolManager implements SmartLifecycle { * @return 协议实例 */ @SuppressWarnings({"EnhancedSwitchMigration"}) - private IotProtocol createProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotProtocol createProtocol(IotGatewayProperties.ProtocolProperties config) { IotProtocolTypeEnum protocolType = IotProtocolTypeEnum.of(config.getProtocol()); if (protocolType == null) { log.error("[createProtocol][协议实例 {} 的协议类型 {} 不存在]", config.getId(), config.getProtocol()); @@ -124,7 +124,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return HTTP 协议实例 */ - private IotHttpProtocol createHttpProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotHttpProtocol createHttpProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotHttpProtocol(config); } @@ -134,7 +134,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return TCP 协议实例 */ - private IotTcpProtocol createTcpProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotTcpProtocol createTcpProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotTcpProtocol(config); } @@ -144,7 +144,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return UDP 协议实例 */ - private IotUdpProtocol createUdpProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotUdpProtocol createUdpProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotUdpProtocol(config); } @@ -154,7 +154,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return CoAP 协议实例 */ - private IotCoapProtocol createCoapProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotCoapProtocol createCoapProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotCoapProtocol(config); } @@ -164,7 +164,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return WebSocket 协议实例 */ - private IotWebSocketProtocol createWebSocketProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotWebSocketProtocol createWebSocketProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotWebSocketProtocol(config); } @@ -174,7 +174,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return MQTT 协议实例 */ - private IotMqttProtocol createMqttProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotMqttProtocol createMqttProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotMqttProtocol(config); } @@ -184,7 +184,7 @@ public class IotProtocolManager implements SmartLifecycle { * @param config 协议实例配置 * @return EMQX 协议实例 */ - private IotEmqxProtocol createEmqxProtocol(IotGatewayProperties.ProtocolInstanceProperties config) { + private IotEmqxProtocol createEmqxProtocol(IotGatewayProperties.ProtocolProperties config) { return new IotEmqxProtocol(config); } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/IotCoapProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/IotCoapProtocol.java index ac348a2db5..14fe10dcd8 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/IotCoapProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/coap/IotCoapProtocol.java @@ -4,7 +4,7 @@ import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.coap.handler.downstream.IotCoapDownstreamSubscriber; import cn.iocoder.yudao.module.iot.gateway.protocol.coap.handler.upstream.IotCoapAuthHandler; @@ -43,7 +43,7 @@ public class IotCoapProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * 服务器 ID(用于消息追踪,全局唯一) */ @@ -66,7 +66,7 @@ public class IotCoapProtocol implements IotProtocol { */ private final IotCoapDownstreamSubscriber downstreamSubscriber; - public IotCoapProtocol(ProtocolInstanceProperties properties) { + public IotCoapProtocol(ProtocolProperties properties) { IotCoapConfig coapConfig = properties.getCoap(); Assert.notNull(coapConfig, "CoAP 协议配置(coap)不能为空"); this.properties = properties; diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/emqx/IotEmqxProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/emqx/IotEmqxProtocol.java index 0d64186aa5..a9e251736f 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/emqx/IotEmqxProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/emqx/IotEmqxProtocol.java @@ -7,7 +7,7 @@ import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.emqx.handler.downstream.IotEmqxDownstreamSubscriber; import cn.iocoder.yudao.module.iot.gateway.protocol.emqx.handler.upstream.IotEmqxAuthEventHandler; @@ -47,7 +47,7 @@ public class IotEmqxProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * EMQX 配置 */ @@ -92,7 +92,7 @@ public class IotEmqxProtocol implements IotProtocol { */ private final IotEmqxDownstreamSubscriber downstreamSubscriber; - public IotEmqxProtocol(ProtocolInstanceProperties properties) { + public IotEmqxProtocol(ProtocolProperties properties) { Assert.notNull(properties, "协议实例配置不能为空"); Assert.notNull(properties.getEmqx(), "EMQX 协议配置(emqx)不能为空"); this.properties = properties; diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpConfig.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpConfig.java index 968a9ae625..bc7f4dc8c5 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpConfig.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpConfig.java @@ -10,19 +10,4 @@ import lombok.Data; @Data public class IotHttpConfig { - /** - * 是否启用 SSL - */ - private Boolean sslEnabled = false; - - /** - * SSL 证书路径 - */ - private String sslCertPath; - - /** - * SSL 私钥路径 - */ - private String sslKeyPath; - } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpProtocol.java index 164c06f3e9..2f92419161 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/http/IotHttpProtocol.java @@ -4,7 +4,8 @@ import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.http.handler.downstream.IotHttpDownstreamSubscriber; import cn.iocoder.yudao.module.iot.gateway.protocol.http.handler.upstream.IotHttpAuthHandler; @@ -33,7 +34,7 @@ public class IotHttpProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * 服务器 ID(用于消息追踪,全局唯一) */ @@ -60,7 +61,7 @@ public class IotHttpProtocol implements IotProtocol { */ private IotHttpDownstreamSubscriber downstreamSubscriber; - public IotHttpProtocol(ProtocolInstanceProperties properties) { + public IotHttpProtocol(ProtocolProperties properties) { this.properties = properties; this.serverId = IotDeviceMessageUtils.generateServerId(properties.getPort()); @@ -104,12 +105,12 @@ public class IotHttpProtocol implements IotProtocol { router.post(IotHttpUpstreamHandler.PATH).handler(upstreamHandler); // 1.4 启动 HTTP 服务器 - IotHttpConfig httpConfig = properties.getHttp(); HttpServerOptions options = new HttpServerOptions().setPort(properties.getPort()); - if (httpConfig != null && Boolean.TRUE.equals(httpConfig.getSslEnabled())) { + IotGatewayProperties.SslConfig sslConfig = properties.getSsl(); + if (sslConfig != null && Boolean.TRUE.equals(sslConfig.getSsl())) { PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions() - .setKeyPath(httpConfig.getSslKeyPath()) - .setCertPath(httpConfig.getSslCertPath()); + .setKeyPath(sslConfig.getSslKeyPath()) + .setCertPath(sslConfig.getSslCertPath()); options = options.setSsl(true).setKeyCertOptions(pemKeyCertOptions); } try { diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttConfig.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttConfig.java index 416dcced66..afbdd93b36 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttConfig.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttConfig.java @@ -26,20 +26,4 @@ public class IotMqttConfig { @Min(value = 1, message = "连接超时时间不能小于 1 秒") private Integer connectTimeoutSeconds = 60; - /** - * 是否启用 SSL - */ - @NotNull(message = "是否启用 SSL 不能为空") - private Boolean sslEnabled = false; - - /** - * SSL 证书路径 - */ - private String sslCertPath; - - /** - * SSL 私钥路径 - */ - private String sslKeyPath; - } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttProtocol.java index 85d21853ef..1201fd1a42 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/mqtt/IotMqttProtocol.java @@ -8,7 +8,8 @@ import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.mqtt.handler.downstream.IotMqttDownstreamHandler; import cn.iocoder.yudao.module.iot.gateway.protocol.mqtt.handler.downstream.IotMqttDownstreamSubscriber; @@ -51,7 +52,7 @@ public class IotMqttProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * 服务器 ID(用于消息追踪,全局唯一) */ @@ -88,7 +89,7 @@ public class IotMqttProtocol implements IotProtocol { private final IotMqttRegisterHandler registerHandler; private final IotMqttUpstreamHandler upstreamHandler; - public IotMqttProtocol(ProtocolInstanceProperties properties) { + public IotMqttProtocol(ProtocolProperties properties) { IotMqttConfig mqttConfig = properties.getMqtt(); Assert.notNull(mqttConfig, "MQTT 协议配置(mqtt)不能为空"); this.properties = properties; @@ -136,10 +137,11 @@ public class IotMqttProtocol implements IotProtocol { .setPort(properties.getPort()) .setMaxMessageSize(mqttConfig.getMaxMessageSize()) .setTimeoutOnConnect(mqttConfig.getConnectTimeoutSeconds()); - if (Boolean.TRUE.equals(mqttConfig.getSslEnabled())) { + IotGatewayProperties.SslConfig sslConfig = properties.getSsl(); + if (sslConfig != null && Boolean.TRUE.equals(sslConfig.getSsl())) { PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions() - .setKeyPath(mqttConfig.getSslKeyPath()) - .setCertPath(mqttConfig.getSslCertPath()); + .setKeyPath(sslConfig.getSslKeyPath()) + .setCertPath(sslConfig.getSslCertPath()); options.setSsl(true).setKeyCertOptions(pemKeyCertOptions); } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpConfig.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpConfig.java index 16dd3b50e5..a8c21c8719 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpConfig.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpConfig.java @@ -27,20 +27,6 @@ public class IotTcpConfig { @Min(value = 1000, message = "心跳超时时间必须大于 1000 毫秒") private Long keepAliveTimeoutMs = 30000L; - /** - * 是否启用 SSL - */ - @NotNull(message = "是否启用 SSL 不能为空") - private Boolean sslEnabled = false; - /** - * SSL 证书路径 - */ - private String sslCertPath; - /** - * SSL 私钥路径 - */ - private String sslKeyPath; - /** * 拆包配置 */ diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpProtocol.java index 24660389b7..e864df543e 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/tcp/IotTcpProtocol.java @@ -5,7 +5,8 @@ import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.enums.IotSerializeTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.tcp.codec.IotTcpFrameCodec; import cn.iocoder.yudao.module.iot.gateway.protocol.tcp.codec.IotTcpFrameCodecFactory; @@ -36,7 +37,7 @@ public class IotTcpProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * 服务器 ID(用于消息追踪,全局唯一) */ @@ -76,7 +77,7 @@ public class IotTcpProtocol implements IotProtocol { */ private final IotTcpFrameCodec frameCodec; - public IotTcpProtocol(ProtocolInstanceProperties properties) { + public IotTcpProtocol(ProtocolProperties properties) { IotTcpConfig tcpConfig = properties.getTcp(); Assert.notNull(tcpConfig, "TCP 协议配置(tcp)不能为空"); Assert.notNull(tcpConfig.getCodec(), "TCP 拆包配置(tcp.codec)不能为空"); @@ -128,10 +129,11 @@ public class IotTcpProtocol implements IotProtocol { .setTcpNoDelay(true) .setReuseAddress(true) .setIdleTimeout((int) (tcpConfig.getKeepAliveTimeoutMs() / 1000)); // 设置空闲超时 - if (Boolean.TRUE.equals(tcpConfig.getSslEnabled())) { + IotGatewayProperties.SslConfig sslConfig = properties.getSsl(); + if (sslConfig != null && Boolean.TRUE.equals(sslConfig.getSsl())) { PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions() - .setKeyPath(tcpConfig.getSslKeyPath()) - .setCertPath(tcpConfig.getSslCertPath()); + .setKeyPath(sslConfig.getSslKeyPath()) + .setCertPath(sslConfig.getSslCertPath()); options.setSsl(true).setKeyCertOptions(pemKeyCertOptions); } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/udp/IotUdpProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/udp/IotUdpProtocol.java index 13cd85b0ed..bfed2d9c32 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/udp/IotUdpProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/udp/IotUdpProtocol.java @@ -4,7 +4,7 @@ import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.enums.IotSerializeTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.udp.handler.downstream.IotUdpDownstreamHandler; import cn.iocoder.yudao.module.iot.gateway.protocol.udp.handler.downstream.IotUdpDownstreamSubscriber; @@ -33,7 +33,7 @@ public class IotUdpProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * 服务器 ID(用于消息追踪,全局唯一) */ @@ -70,7 +70,7 @@ public class IotUdpProtocol implements IotProtocol { */ private final IotMessageSerializer serializer; - public IotUdpProtocol(ProtocolInstanceProperties properties) { + public IotUdpProtocol(ProtocolProperties properties) { IotUdpConfig udpConfig = properties.getUdp(); Assert.notNull(udpConfig, "UDP 协议配置(udp)不能为空"); this.properties = properties; diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketConfig.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketConfig.java index e64e11dc51..95f738d0a1 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketConfig.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketConfig.java @@ -35,20 +35,4 @@ public class IotWebSocketConfig { @NotNull(message = "空闲超时时间不能为空") private Integer idleTimeoutSeconds = 60; - /** - * 是否启用 SSL(wss://) - */ - @NotNull(message = "是否启用 SSL 不能为空") - private Boolean sslEnabled = false; - - /** - * SSL 证书路径 - */ - private String sslCertPath; - - /** - * SSL 私钥路径 - */ - private String sslKeyPath; - } diff --git a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketProtocol.java b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketProtocol.java index 10a57f9b99..b416900db5 100644 --- a/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketProtocol.java +++ b/yudao-module-iot/yudao-module-iot-gateway/src/main/java/cn/iocoder/yudao/module/iot/gateway/protocol/websocket/IotWebSocketProtocol.java @@ -6,7 +6,8 @@ import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.core.enums.IotSerializeTypeEnum; import cn.iocoder.yudao.module.iot.core.messagebus.core.IotMessageBus; import cn.iocoder.yudao.module.iot.core.util.IotDeviceMessageUtils; -import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolInstanceProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties; +import cn.iocoder.yudao.module.iot.gateway.config.IotGatewayProperties.ProtocolProperties; import cn.iocoder.yudao.module.iot.gateway.protocol.IotProtocol; import cn.iocoder.yudao.module.iot.gateway.protocol.websocket.handler.downstream.IotWebSocketDownstreamSubscriber; import cn.iocoder.yudao.module.iot.gateway.protocol.websocket.handler.downstream.IotWebSocketDownstreamHandler; @@ -35,7 +36,7 @@ public class IotWebSocketProtocol implements IotProtocol { /** * 协议配置 */ - private final ProtocolInstanceProperties properties; + private final ProtocolProperties properties; /** * 服务器 ID(用于消息追踪,全局唯一) */ @@ -71,7 +72,7 @@ public class IotWebSocketProtocol implements IotProtocol { */ private final IotMessageSerializer serializer; - public IotWebSocketProtocol(ProtocolInstanceProperties properties) { + public IotWebSocketProtocol(ProtocolProperties properties) { Assert.notNull(properties, "协议实例配置不能为空"); Assert.notNull(properties.getWebsocket(), "WebSocket 协议配置(websocket)不能为空"); this.properties = properties; @@ -120,10 +121,11 @@ public class IotWebSocketProtocol implements IotProtocol { .setIdleTimeout(wsConfig.getIdleTimeoutSeconds()) .setMaxWebSocketFrameSize(wsConfig.getMaxFrameSize()) .setMaxWebSocketMessageSize(wsConfig.getMaxMessageSize()); - if (Boolean.TRUE.equals(wsConfig.getSslEnabled())) { + IotGatewayProperties.SslConfig sslConfig = properties.getSsl(); + if (sslConfig != null && Boolean.TRUE.equals(sslConfig.getSsl())) { PemKeyCertOptions pemKeyCertOptions = new PemKeyCertOptions() - .setKeyPath(wsConfig.getSslKeyPath()) - .setCertPath(wsConfig.getSslCertPath()); + .setKeyPath(sslConfig.getSslKeyPath()) + .setCertPath(sslConfig.getSslCertPath()); options.setSsl(true).setKeyCertOptions(pemKeyCertOptions); }