diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/IotWebSocketDataRuleAction.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/IotWebSocketDataRuleAction.java index ebfe1f8..7471642 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/IotWebSocketDataRuleAction.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/IotWebSocketDataRuleAction.java @@ -97,6 +97,7 @@ public class IotWebSocketDataRuleAction extends } } + // TODO @puhui999:为什么这里要加锁呀? /** * 使用锁进行重连,保证同一服务器地址的重连操作线程安全 * diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/websocket/IotWebSocketClient.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/websocket/IotWebSocketClient.java index e898f61..8eba723 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/websocket/IotWebSocketClient.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/data/action/websocket/IotWebSocketClient.java @@ -67,7 +67,6 @@ public class IotWebSocketClient { // 使用 CountDownLatch 等待连接完成 CountDownLatch connectLatch = new CountDownLatch(1); AtomicBoolean connectSuccess = new AtomicBoolean(false); - // 创建 WebSocket 连接 webSocket = okHttpClient.newWebSocket(request, new IotWebSocketListener(connectLatch, connectSuccess)); @@ -77,7 +76,6 @@ public class IotWebSocketClient { close(); throw new Exception("WebSocket 连接超时或失败,服务器地址: " + serverUrl); } - log.info("[connect][WebSocket 客户端连接成功,服务器地址: {}]", serverUrl); } catch (Exception e) { close(); @@ -126,6 +124,7 @@ public class IotWebSocketClient { try { if (webSocket != null) { // 发送正常关闭帧,状态码 1000 表示正常关闭 + // TODO @puhui999:有没 1000 的枚举哈?在 okhttp 里 webSocket.close(1000, "客户端主动关闭"); webSocket = null; } @@ -163,6 +162,7 @@ public class IotWebSocketClient { /** * OkHttp WebSocket 监听器 */ + @SuppressWarnings("NullableProblems") private class IotWebSocketListener extends WebSocketListener { private final CountDownLatch connectLatch; diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java index 8d1c1f6..df1ac23 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java @@ -4,6 +4,8 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.text.CharPool; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionOperatorEnum; +import cn.iocoder.yudao.module.iot.service.rule.scene.matcher.condition.IotCurrentTimeConditionMatcher; +import cn.iocoder.yudao.module.iot.service.rule.scene.timer.IotTimerConditionEvaluator; import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; @@ -15,8 +17,7 @@ import java.util.List; /** * IoT 场景规则时间匹配工具类 *
- * 提供时间条件匹配的通用方法,供 {@link cn.iocoder.yudao.module.iot.service.rule.scene.matcher.condition.IotCurrentTimeConditionMatcher}
- * 和 {@link cn.iocoder.yudao.module.iot.service.rule.scene.timer.IotTimerConditionEvaluator} 共同使用。
+ * 提供时间条件匹配的通用方法,供 {@link IotCurrentTimeConditionMatcher} 和 {@link IotTimerConditionEvaluator} 共同使用。
*
* @author HUIHUI
*/
@@ -33,6 +34,7 @@ public class IotSceneRuleTimeHelper {
*/
private static final DateTimeFormatter TIME_FORMATTER_SHORT = DateTimeFormatter.ofPattern("HH:mm");
+ // TODO @puhui999:可以使用 lombok 简化
private IotSceneRuleTimeHelper() {
// 工具类,禁止实例化
}
@@ -94,6 +96,7 @@ public class IotSceneRuleTimeHelper {
* @param param 参数值
* @return 是否匹配
*/
+ @SuppressWarnings("EnhancedSwitchMigration")
public static boolean matchDateTime(long currentTimestamp, IotSceneRuleConditionOperatorEnum operatorEnum,
String param) {
try {
@@ -133,6 +136,7 @@ public class IotSceneRuleTimeHelper {
}
long startTimestamp = Long.parseLong(timestampRange.get(0).trim());
long endTimestamp = Long.parseLong(timestampRange.get(1).trim());
+ // TODO @puhui999:hutool 里,看看有没 between 方法
return currentTimestamp >= startTimestamp && currentTimestamp <= endTimestamp;
}
@@ -144,6 +148,7 @@ public class IotSceneRuleTimeHelper {
* @param param 参数值
* @return 是否匹配
*/
+ @SuppressWarnings("EnhancedSwitchMigration")
public static boolean matchTime(LocalTime currentTime, IotSceneRuleConditionOperatorEnum operatorEnum,
String param) {
try {
@@ -183,6 +188,7 @@ public class IotSceneRuleTimeHelper {
}
LocalTime startTime = parseTime(timeRange.get(0).trim());
LocalTime endTime = parseTime(timeRange.get(1).trim());
+ // TODO @puhui999:hutool 里,看看有没 between 方法
return !currentTime.isBefore(startTime) && !currentTime.isAfter(endTime);
}
diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceServiceInvokeTriggerMatcher.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceServiceInvokeTriggerMatcher.java
index ba31900..642fb5e 100644
--- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceServiceInvokeTriggerMatcher.java
+++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/matcher/trigger/IotDeviceServiceInvokeTriggerMatcher.java
@@ -31,13 +31,11 @@ public class IotDeviceServiceInvokeTriggerMatcher implements IotSceneRuleTrigger
IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "触发器基础参数无效");
return false;
}
-
// 1.2 检查消息方法是否匹配
if (!IotDeviceMessageMethodEnum.SERVICE_INVOKE.getMethod().equals(message.getMethod())) {
IotSceneRuleMatcherHelper.logTriggerMatchFailure(message, trigger, "消息方法不匹配,期望: " + IotDeviceMessageMethodEnum.SERVICE_INVOKE.getMethod() + ", 实际: " + message.getMethod());
return false;
}
-
// 1.3 检查标识符是否匹配
String messageIdentifier = IotDeviceMessageUtils.getIdentifier(message);
if (!IotSceneRuleMatcherHelper.isIdentifierMatched(trigger.getIdentifier(), messageIdentifier)) {
@@ -73,21 +71,21 @@ public class IotDeviceServiceInvokeTriggerMatcher implements IotSceneRuleTrigger
* @return 是否匹配
*/
private boolean matchParameterCondition(IotDeviceMessage message, IotSceneRuleDO.Trigger trigger) {
- // 从消息中提取服务调用的输入参数
+ // 1.1 从消息中提取服务调用的输入参数
Map
* 对于不同消息类型的处理:
* - EVENT_POST/SERVICE_INVOKE:检查 params.identifier 是否匹配
* - STATE_UPDATE:检查 params.state 是否匹配
@@ -212,8 +212,8 @@ public class IotDeviceMessageUtils {
*
* 服务调用消息的 params 结构通常为:
* {
- * "identifier": "serviceIdentifier",
- * "inputData": { ... } 或 "inputParams": { ... }
+ * "identifier": "serviceIdentifier",
+ * "inputData": { ... } 或 "inputParams": { ... }
* }
*
* @param message 设备消息
@@ -221,6 +221,7 @@ public class IotDeviceMessageUtils {
*/
@SuppressWarnings("unchecked")
public static Map