From fa40ae1dbd368628a9e8a0ef0b6e0636be61ee45 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 22 Feb 2025 18:21:18 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E8=AF=84=E5=AE=A1?= =?UTF-8?q?=E3=80=91IoT=EF=BC=9AMQTT=20=E8=BF=9E=E6=8E=A5=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/iot/api/device/IotDeviceUpstreamApi.java | 1 + .../control/upstream/IotDeviceEmqxAuthReqDTO.java | 1 + .../controller/admin/device/IotDeviceController.java | 1 + .../iot/service/device/IotDeviceServiceImpl.java | 4 +--- .../device/control/IotDeviceUpstreamServiceImpl.java | 2 ++ .../iocoder/yudao/module/iot/util/MqttSignUtils.java | 12 +++++++++--- 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java index c43a0f2b23..e88706ac59 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java @@ -71,6 +71,7 @@ public interface IotDeviceUpstreamApi { @PostMapping(PREFIX + "/add-topology") CommonResult addDeviceTopology(@Valid @RequestBody IotDeviceTopologyAddReqDTO addReqDTO); + // TODO @芋艿:考虑 http 认证 /** * 认证 Emqx 连接 * diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEmqxAuthReqDTO.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEmqxAuthReqDTO.java index 365552db0f..2fb10a0765 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEmqxAuthReqDTO.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEmqxAuthReqDTO.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream; import jakarta.validation.constraints.NotEmpty; import lombok.Data; +// TODO @芋艿:要不要继承 IotDeviceUpstreamAbstractReqDTO /** * IoT 认证 Emqx 连接 Request DTO * diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java index 18aa5a34fa..2add4ee133 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java @@ -177,6 +177,7 @@ public class IotDeviceController { return success(true); } + // TODO @haohao:是不是默认详情接口,不返回 secret,然后这个接口,用于统一返回。然后接口名可以更通用一点。 @GetMapping("/mqtt-connection-params") @Operation(summary = "获取 MQTT 连接参数") @PreAuthorize("@ss.hasPermission('iot:device:mqtt-connection-params')") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java index 847581512b..66d3cf861d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java @@ -123,9 +123,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { private void initDevice(IotDeviceDO device, IotProductDO product) { device.setProductId(product.getId()).setProductKey(product.getProductKey()) .setDeviceType(product.getDeviceType()); - // 生成并设置必要的字段 - // TODO @芋艿:各种 mqtt 是不是可以简化! - // clientId、username、password 根据规则实时生成 + // 生成密钥 device.setDeviceSecret(generateDeviceSecret()); // 设置设备状态为未激活 device.setState(IotDeviceStateEnum.INACTIVE.getState()); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java index 93b4ea3888..9ce0efbb1e 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java @@ -280,6 +280,7 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService { sendDeviceMessage(message, device); } + // TODO @haohao:建议返回 boolean; @Override public Boolean authenticateEmqxConnection(IotDeviceEmqxAuthReqDTO authReqDTO) { log.info("[authenticateEmqxConnection][认证 Emqx 连接: {}]", authReqDTO); @@ -303,6 +304,7 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService { String deviceSecret = device.getDeviceSecret(); String clientId = authReqDTO.getClientId(); MqttSignResult sign = MqttSignUtils.calculate(productKey, deviceName, deviceSecret, clientId); + // TODO @haohao:notEquals,尽量不走取反逻辑哈 if (!StrUtil.equals(sign.getPassword(), authReqDTO.getPassword())) { log.error("[authenticateEmqxConnection][认证失败,密码不正确]"); return Boolean.FALSE; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/util/MqttSignUtils.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/util/MqttSignUtils.java index 40213e3aee..bf364c53ea 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/util/MqttSignUtils.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/util/MqttSignUtils.java @@ -8,12 +8,15 @@ import java.nio.charset.StandardCharsets; /** * MQTT 签名工具类 - * 提供静态方法来计算 MQTT 连接参数。 + * + * 提供静态方法来计算 MQTT 连接参数 */ public class MqttSignUtils { private static final String SIGN_METHOD = "hmacsha256"; + // TODO @haohao:calculate 方法,可以融合么? + /** * 计算 MQTT 连接参数 * @@ -25,11 +28,11 @@ public class MqttSignUtils { public static MqttSignResult calculate(String productKey, String deviceName, String deviceSecret) { String clientId = productKey + "." + deviceName; String username = deviceName + "&" + productKey; + // 生成 password + // TODO @haohao:signContent 和 signContentBuilder 风格保持统一的实现哈 String signContent = String.format("clientId%sdeviceName%sdeviceSecret%sproductKey%s", clientId, deviceName, deviceSecret, productKey); - String password = sign(signContent, deviceSecret); - return new MqttSignResult(clientId, username, password); } @@ -54,6 +57,7 @@ public class MqttSignUtils { return new MqttSignResult(clientId, username, password); } + // TODO @haohao:hutool 貌似有工具类可以用哈。 private static String sign(String content, String key) { try { Mac mac = Mac.getInstance(SIGN_METHOD); @@ -81,7 +85,9 @@ public class MqttSignUtils { * MQTT 签名结果类 */ @Getter + // TODO @haohao:可以用 lombok 哈 public static class MqttSignResult { + private final String clientId; private final String username; private final String password;