Bladeren bron

fix: substring 越界防护 + Redis key 解析修正

- VehicleSyncTask: 改用前缀精确切割解析 Redis key,避免 split 对含下划线 ID 的误解析
- VehicleSyncTask/MqttChargeStationConsumer/MqttDynamicConsumer: substring(0, 2) 增加长度校验
mqy20260511
humanleft 2 weken geleden
bovenliggende
commit
f36730933d

+ 2
- 1
iot-platform/src/main/java/com/iot/platform/mqtt/MqttChargeStationConsumer.java Bestand weergeven

@@ -70,7 +70,8 @@ public class MqttChargeStationConsumer extends AbstractDynamicMqttConsumer {
70 70
         }
71 71
 
72 72
         String dbName = topicParts[1];
73
-        String dbNamePrefix = "pe_iot_"+dbName.substring(0, 2);
73
+        String dbPrefix = dbName.length() >= 2 ? dbName.substring(0, 2) : dbName;
74
+        String dbNamePrefix = "pe_iot_" + dbPrefix;
74 75
         //先传输为deviceid,到后面进行优化
75 76
         String superTable = topicParts[3];
76 77
 //        String tableName = superTable + "_" + date.getYear() + String.format("%02d", date.getMonthValue());

+ 2
- 1
iot-platform/src/main/java/com/iot/platform/mqtt/MqttDynamicConsumer.java Bestand weergeven

@@ -105,7 +105,8 @@ public class MqttDynamicConsumer extends AbstractDynamicMqttConsumer {
105 105
         data.put("device_id", ctx.deviceId);
106 106
         List<Map<String, Object>> batch = Collections.singletonList(data);
107 107
 
108
-        String dbNamePrefix = "pe_iot_"+ctx.controllerId.substring(0, 2);
108
+        String controllerPrefix = ctx.controllerId.length() >= 2 ? ctx.controllerId.substring(0, 2) : ctx.controllerId;
109
+        String dbNamePrefix = "pe_iot_" + controllerPrefix;
109 110
         String controllerId = ctx.controllerId;
110 111
         tdengineService.insertBatch(dbNamePrefix, ctx.deviceId, controllerId, batch);
111 112
     }

+ 12
- 6
iot-platform/src/main/java/com/iot/platform/task/VehicleSyncTask.java Bestand weergeven

@@ -77,15 +77,21 @@ public class VehicleSyncTask {
77 77
                 }
78 78
 
79 79
                 // redisKey 格式: pe_iot_<controllerId>_<deviceId>
80
-                // 从右往左取,避免 id 本身含下划线的问题
81
-                String[] parts = redisKey.split("_");
82
-                if (parts.length < 3) {
80
+                String prefix = "pe_iot_";
81
+                if (!redisKey.startsWith(prefix) || redisKey.length() <= prefix.length()) {
83 82
                     log.warn("跳过非法 redis key: {}", redisKey);
84 83
                     continue;
85 84
                 }
86
-                String controllerId = parts[parts.length - 2];
87
-                String deviceId = parts[parts.length - 1];
88
-                String tableName = "pe_iot_" + controllerId.substring(0, 2);
85
+                String remainder = redisKey.substring(prefix.length());
86
+                int lastUnderscore = remainder.lastIndexOf('_');
87
+                if (lastUnderscore <= 0 || lastUnderscore == remainder.length() - 1) {
88
+                    log.warn("跳过非法 redis key: {}", redisKey);
89
+                    continue;
90
+                }
91
+                String controllerId = remainder.substring(0, lastUnderscore);
92
+                String deviceId = remainder.substring(lastUnderscore + 1);
93
+                String dbPrefix = controllerId.length() >= 2 ? controllerId.substring(0, 2) : controllerId;
94
+                String tableName = "pe_iot_" + dbPrefix;
89 95
 
90 96
                 try {
91 97
                     sysrealtimeService.createRealtime(tableName);

Laden…
Annuleren
Opslaan