|
@@ -2,6 +2,7 @@ package com.usky.cdi.service.util;
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
+import java.util.Random;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 固定水位生成器 - 为液位传感器(716)生成模拟数据
|
|
* 固定水位生成器 - 为液位传感器(716)生成模拟数据
|
|
@@ -15,6 +16,13 @@ import java.util.concurrent.ConcurrentHashMap;
|
|
|
* @email yuchuan.fu@chinausky.com
|
|
* @email yuchuan.fu@chinausky.com
|
|
|
* @date 2026/4/28
|
|
* @date 2026/4/28
|
|
|
*/
|
|
*/
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 固定水位值生成器:
|
|
|
|
|
+ * 1. 每台设备首次调用时基于设备ID生成一个随机水位值
|
|
|
|
|
+ * 2. 同一设备后续调用直接取缓存,保持一致
|
|
|
|
|
+ * 3. 不同设备之间数值随机分散
|
|
|
|
|
+ */
|
|
|
public class FixedWaterLevelGenerator {
|
|
public class FixedWaterLevelGenerator {
|
|
|
|
|
|
|
|
private static final Map<String, Double> DEVICE_LEVEL_MAP = new ConcurrentHashMap<>();
|
|
private static final Map<String, Double> DEVICE_LEVEL_MAP = new ConcurrentHashMap<>();
|
|
@@ -23,21 +31,13 @@ public class FixedWaterLevelGenerator {
|
|
|
private static final double MAX_VALUE = 0.05;
|
|
private static final double MAX_VALUE = 0.05;
|
|
|
|
|
|
|
|
public static double getSensorValue(String deviceId) {
|
|
public static double getSensorValue(String deviceId) {
|
|
|
- return DEVICE_LEVEL_MAP.computeIfAbsent(deviceId, FixedWaterLevelGenerator::generateValue);
|
|
|
|
|
|
|
+ return DEVICE_LEVEL_MAP.computeIfAbsent(deviceId, FixedWaterLevelGenerator::computeFixedValue);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private static double generateValue(String deviceId) {
|
|
|
|
|
- // 稳定、均匀的哈希
|
|
|
|
|
- int hash = deviceId.hashCode();
|
|
|
|
|
- int positiveHash = hash & 0x7FFFFFFF;
|
|
|
|
|
-
|
|
|
|
|
- // 映射到 0~99,共 100 个台阶
|
|
|
|
|
- int step = positiveHash % 100;
|
|
|
|
|
-
|
|
|
|
|
- // 均匀分布在 0.02 ~ 0.05
|
|
|
|
|
- double value = MIN_VALUE + (step / 100.0) * (MAX_VALUE - MIN_VALUE);
|
|
|
|
|
-
|
|
|
|
|
- // 保留 2 位小数
|
|
|
|
|
- return Math.round(value * 100) / 100.0;
|
|
|
|
|
|
|
+ private static double computeFixedValue(String deviceId) {
|
|
|
|
|
+ long seed = deviceId.hashCode() & 0xFFFFFFFFL;
|
|
|
|
|
+ Random random = new Random(seed);
|
|
|
|
|
+ double value = MIN_VALUE + random.nextDouble() * (MAX_VALUE - MIN_VALUE);
|
|
|
|
|
+ return Math.round(value * 1000) / 1000.0;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|