Ver código fonte

feate: 数据上报

jackzhou 6 meses atrás
pai
commit
634f4c8b20
20 arquivos alterados com 505 adições e 13 exclusões
  1. 5 0
      snowy-plugin/snowy-plugin-coldchain/pom.xml
  2. 62 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bean/influxdb/SensorData.java
  3. 34 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/config/ColdChainAsyncConfig.java
  4. 25 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/event/SensorDataEvent.java
  5. 36 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/event/SensorDataEventListener.java
  6. 2 2
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/RKService.java
  7. 4 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/config/JfcloudColdChainServerAutoConfiguration.java
  8. 16 6
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/listener/JfcloudColdChainRenKeDefaultDataListener.java
  9. 44 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/AbstractColdChainDataHandler.java
  10. 30 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/ColdChainDataHandler.java
  11. 33 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/ColdChainHandlerRegistry.java
  12. 29 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/DataHandlerFactory.java
  13. 43 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/beanprocessor/ColdChainDataHandlerBeanPostProcessor.java
  14. 24 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/impl/HaierColdChainDataHandler.java
  15. 63 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/impl/RenKeColdChainDataHandler.java
  16. 17 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/model/ColdChainMessageData.java
  17. 14 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/model/HaierColdChainMessageData.java
  18. 16 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/model/RenKeColdChainMessageData.java
  19. 1 1
      snowy-web-app/src/main/java/vip/xiaonuo/Application.java
  20. 7 1
      snowy-web-app/src/main/resources/application.properties

+ 5 - 0
snowy-plugin/snowy-plugin-coldchain/pom.xml

@@ -56,5 +56,10 @@
             <groupId>vip.xiaonuo</groupId>
             <artifactId>snowy-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.github.jfcloud</groupId>
+            <artifactId>jfcloud-boot-starter-influxdb</artifactId>
+            <version>K6.6.8</version>
+        </dependency>
     </dependencies>
 </project>

+ 62 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bean/influxdb/SensorData.java

@@ -0,0 +1,62 @@
+package vip.xiaonuo.coldchain.modular.bean.influxdb;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 14:02:51
+ */
+
+import com.github.jfcloud.influxdb.model.JfcloudInFluxEntity;
+import com.influxdb.annotations.Column;
+import com.influxdb.annotations.Measurement;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Measurement(name = "sensor_data")
+public class SensorData extends JfcloudInFluxEntity {
+    /**
+     * 设备ID标签
+     */
+    @Column(name = "device_id",tag = true)
+    private String deviceId;
+    /**
+     * 位置标签
+     */
+    @Column(name = "location")
+    private String location;
+    /**
+     * 温度字段
+     */
+    @Column(name = "temperature")
+    private double temperature;
+    /**
+     * 湿度字段
+     */
+    @Column(name = "humidity")
+    private double humidity;
+
+    /**
+     * 二氧化碳浓度字段
+     */
+    @Column(name = "co2")
+    private double co2;
+    /**
+     * 经度字段
+     */
+    @Column(name = "longitude")
+    private double lng;
+
+    /**
+     * 纬度字段
+     */
+    @Column(name = "latitude")
+    private double lat;
+
+
+}

+ 34 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/config/ColdChainAsyncConfig.java

@@ -0,0 +1,34 @@
+package vip.xiaonuo.coldchain.modular.config;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 15:13:41
+ */
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+@Configuration
+@EnableAsync //(proxyTargetClass = true)
+public class ColdChainAsyncConfig {
+    /**
+     * 创建自定义的线程池配置
+     * 线程池会根据实际需求调整线程数量,但不会超过最大线程数
+     */
+    @Bean
+    public ThreadPoolTaskExecutor coldChainAsyncTask() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(200);  // 设置核心线程数,假设并发的最小线程数为200
+        executor.setMaxPoolSize(1000);  // 设置最大线程数,允许最多1000个线程并行处理
+        executor.setQueueCapacity(10000);  // 设置队列容量,临时保存10000个请求
+        executor.setKeepAliveSeconds(60);  // 设置线程空闲60秒后销毁
+        executor.setThreadNamePrefix("coldchain-async-");  // 设置线程名称的前缀
+        executor.initialize();
+        return executor;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/event/SensorDataEvent.java

@@ -0,0 +1,25 @@
+package vip.xiaonuo.coldchain.modular.event;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 15:31:05
+ */
+
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+import vip.xiaonuo.coldchain.modular.bean.influxdb.SensorData;
+
+@Getter
+public class SensorDataEvent extends ApplicationEvent {
+
+    private final SensorData sensorData;
+
+    public SensorDataEvent(Object source, SensorData sensorData) {
+        super(source);
+        this.sensorData = sensorData;
+    }
+
+}

+ 36 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/event/SensorDataEventListener.java

@@ -0,0 +1,36 @@
+package vip.xiaonuo.coldchain.modular.event;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 15:31:43
+ */
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.coldchain.modular.bean.influxdb.SensorData;
+import com.github.jfcloud.influxdb.service.JfcloudInfluxDBService;
+
+@Slf4j
+@RequiredArgsConstructor
+@Component
+public class SensorDataEventListener {
+    private final JfcloudInfluxDBService jfcloudInfluxDBService;
+
+    @Async
+    @EventListener
+    public void handleSensorDataEvent(SensorDataEvent event) {
+        SensorData sensorData = event.getSensorData();
+        try {
+            jfcloudInfluxDBService.writePojo(sensorData);
+            log.info("成功写入数据到 InfluxDB: {}", sensorData);
+        } catch (Exception e) {
+            log.error("写入数据到 InfluxDB 时出错: {}", e.getMessage());
+        }
+    }
+}

+ 2 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/RKService.java

@@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 import rk.netDevice.sdk.p2.ParamIdsData;
 import rk.netDevice.sdk.p2.RSServer;
-import vip.xiaonuo.coldchain.modular.renke.listener.JfcloudColdChainDefaultDataListener;
+import vip.xiaonuo.coldchain.modular.renke.listener.JfcloudColdChainRenKeDefaultDataListener;
 
 /**
  * @author jackzhou
@@ -23,7 +23,7 @@ public class RKService {
     }
 
     public void paramIdsData() {
-        ParamIdsData paramIdsData = JfcloudColdChainDefaultDataListener.paramIdsData;
+        ParamIdsData paramIdsData = JfcloudColdChainRenKeDefaultDataListener.paramIdsData;
         rsServer.callParam(30067080, paramIdsData.getPararmIdList());
     }
 

+ 4 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/config/JfcloudColdChainServerAutoConfiguration.java

@@ -10,8 +10,9 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
 import rk.netDevice.sdk.p2.IDataListener;
 import rk.netDevice.sdk.p2.RSServer;
-import vip.xiaonuo.coldchain.modular.renke.listener.JfcloudColdChainDefaultDataListener;
+import vip.xiaonuo.coldchain.modular.renke.listener.JfcloudColdChainRenKeDefaultDataListener;
 import vip.xiaonuo.coldchain.modular.renke.util.IPUtils;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.impl.RenKeColdChainDataHandler;
 
 import javax.annotation.PreDestroy;
 import java.util.concurrent.ExecutorService;
@@ -34,9 +35,9 @@ public class JfcloudColdChainServerAutoConfiguration {
      */
     @Bean
     @ConditionalOnMissingBean
-    public IDataListener defaultRkDataListener() {
+    public IDataListener defaultRkDataListener(RenKeColdChainDataHandler renKeColdChainDataHandler) {
         // 使用默认实现 DefaultRKDataListener,便于处理数据
-        return new JfcloudColdChainDefaultDataListener();
+        return new JfcloudColdChainRenKeDefaultDataListener(renKeColdChainDataHandler);
     }
 
     /**

+ 16 - 6
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/listener/JfcloudColdChainDefaultDataListener.java → snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/renke/listener/JfcloudColdChainRenKeDefaultDataListener.java

@@ -3,6 +3,8 @@ package vip.xiaonuo.coldchain.modular.renke.listener;
 import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
 import rk.netDevice.sdk.p2.*;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.impl.RenKeColdChainDataHandler;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.RenKeColdChainMessageData;
 
 /**
  * 默认的 RK 数据监听器,用于处理设备通信中的各种事件。
@@ -15,8 +17,13 @@ import rk.netDevice.sdk.p2.*;
  * @date 2024/11/1 15:06:18
  */
 @Slf4j
-public class JfcloudColdChainDefaultDataListener implements IDataListener {
+public class JfcloudColdChainRenKeDefaultDataListener implements IDataListener {
     public static ParamIdsData paramIdsData;
+    private final RenKeColdChainDataHandler renKeColdChainDataHandler;
+
+    public JfcloudColdChainRenKeDefaultDataListener(RenKeColdChainDataHandler renKeColdChainDataHandler) {
+        this.renKeColdChainDataHandler = renKeColdChainDataHandler;
+    }
 
     @Override
     public void receiveTimmingAck(TimmingAck data) {
@@ -39,11 +46,14 @@ public class JfcloudColdChainDefaultDataListener implements IDataListener {
 
     @Override
     public void receiveRealtimeData(RealTimeData data) {
-        log.info("接收到实时数据: 设备ID = {}", data.getDeviceId());
-        data.getNodeList().forEach(nodeData ->
-                log.info("记录ID: {}, 记录时间: {}, 温度: {}, 湿度: {}",
-                        nodeData.getNodeId(),nodeData.getRecordTime(), nodeData.getTem(), nodeData.getHum())
-        );
+//        log.info("接收到实时数据: 设备ID = {}", data.getDeviceId());
+//        data.getNodeList().forEach(nodeData ->
+//                log.info("记录ID: {}, 记录时间: {}, 温度: {}, 湿度: {}",
+//                        nodeData.getNodeId(),nodeData.getRecordTime(), nodeData.getTem(), nodeData.getHum())
+//        );
+        RenKeColdChainMessageData renKeColdChainMessageData = new RenKeColdChainMessageData();
+        renKeColdChainMessageData.setRealTimeData(data);
+        renKeColdChainDataHandler.handleRealTimeData(renKeColdChainMessageData);
     }
 
     @Override

+ 44 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/AbstractColdChainDataHandler.java

@@ -0,0 +1,44 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler;
+
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.ColdChainMessageData;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 13:40:41
+ */
+public abstract class AbstractColdChainDataHandler<T extends ColdChainMessageData> implements ColdChainDataHandler<T> {
+
+    /**
+     * 处理实时数据
+     */
+    public abstract boolean handleRealTimeData(T data);
+
+    /**
+     * 注册处理器到 HandlerRegistry
+     */
+    public void registerHandler() {
+        ColdChainHandlerRegistry.registerHandler(getDataClass(), this);
+    }
+
+    /**
+     * 获取处理的数据类型,使用泛型反射来获取实际类型
+     */
+    public Class<T> getDataClass() {
+        // 获取父类的泛型类型
+        Type superClass = getClass().getGenericSuperclass();
+        if (superClass instanceof ParameterizedType) {
+            ParameterizedType parameterizedType = (ParameterizedType) superClass;
+            Type[] typeArguments = parameterizedType.getActualTypeArguments();
+            // 返回泛型类型的第一个参数
+            return (Class<T>) typeArguments[0];
+        } else {
+            throw new IllegalStateException("无法解析泛型类型");
+        }
+    }
+}

+ 30 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/ColdChainDataHandler.java

@@ -0,0 +1,30 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler;
+
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.ColdChainMessageData;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 13:02:41
+ */
+public interface ColdChainDataHandler<T extends ColdChainMessageData> {
+
+    /**
+     * 处理实时数据
+     */
+    boolean handleRealTimeData(T data);
+
+    /**
+     * 注册处理器到 HandlerRegistry
+     */
+    default void registerHandler() {
+        ColdChainHandlerRegistry.registerHandler(getDataClass(), this);
+    }
+
+    /**
+     * 获取处理的数据类型,使用泛型反射来获取实际类型
+     */
+    Class<T> getDataClass();
+}

+ 33 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/ColdChainHandlerRegistry.java

@@ -0,0 +1,33 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler;
+
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.ColdChainMessageData;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 13:15:10
+ */
+public class ColdChainHandlerRegistry {
+
+    // 使用线程安全的 ConcurrentHashMap 来存储处理器
+    private static final ConcurrentMap<Class<? extends ColdChainMessageData>, ColdChainDataHandler> handlerMap = new ConcurrentHashMap<>();
+
+    // 注册处理器
+    public static void registerHandler(Class<? extends ColdChainMessageData> dataClass, ColdChainDataHandler handler) {
+        handlerMap.put(dataClass, handler);
+    }
+
+    // 获取处理器
+    public static ColdChainDataHandler getHandler(Class<? extends ColdChainMessageData> dataClass) {
+        return handlerMap.get(dataClass);
+    }
+    // 检查处理器是否已经注册
+    public static boolean isHandlerRegistered(Class<?> dataClass) {
+        return handlerMap.containsKey(dataClass);
+    }
+}

+ 29 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/DataHandlerFactory.java

@@ -0,0 +1,29 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler;
+
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.ColdChainMessageData;
+
+/**
+ * DataHandlerFactory - 工厂类通过 Map 注册并返回适合的处理器
+ */
+@Component
+public class DataHandlerFactory {
+
+    /**
+     * 根据数据类型返回相应的处理器
+     *
+     * @param data ColdChain 消息数据
+     * @return 对应的 ColdChainDataHandler
+     */
+    public ColdChainDataHandler<? extends ColdChainMessageData> getDataHandler(ColdChainMessageData data) {
+        // 从 HandlerRegistry 获取相应的处理器
+        ColdChainDataHandler handler = ColdChainHandlerRegistry.getHandler(data.getClass());
+        if (handler == null) {
+            throw new IllegalArgumentException("无法处理该类型的数据: " + data.getClass().getSimpleName());
+        }
+        return handler;
+    }
+}
+
+
+

+ 43 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/beanprocessor/ColdChainDataHandlerBeanPostProcessor.java

@@ -0,0 +1,43 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler.beanprocessor;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.AbstractColdChainDataHandler;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.ColdChainDataHandler;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.ColdChainHandlerRegistry;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description 注册非AbstractColdChainDataHandler的数据处理器
+ * @date 2024/11/12 13:21:44
+ */
+
+@Component
+@Slf4j
+public class ColdChainDataHandlerBeanPostProcessor implements BeanPostProcessor {
+
+    @Override
+    public Object postProcessAfterInitialization(Object bean, String beanName) {
+        // 判断 Bean 是否实现了 ColdChainDataHandler 接口,并且不是 AbstractColdChainDataHandler 的子类
+        if (bean instanceof ColdChainDataHandler && !(bean instanceof AbstractColdChainDataHandler)) {
+            ColdChainDataHandler handler = (ColdChainDataHandler) bean;
+            // 防止重复注册
+            if (!ColdChainHandlerRegistry.isHandlerRegistered(handler.getDataClass())) {
+                handler.registerHandler();  // 自动注册
+                log.info("冷链数据自动注册处理器: {}", handler.getDataClass().getSimpleName());
+            } else {
+                log.warn("冷链数据处理器已经注册: {}", handler.getDataClass().getSimpleName());
+            }
+        }
+        return bean;
+    }
+
+    @Override
+    public Object postProcessBeforeInitialization(Object bean, String beanName) {
+        return bean;  // 不做修改,直接返回
+    }
+}
+

+ 24 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/impl/HaierColdChainDataHandler.java

@@ -0,0 +1,24 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.AbstractColdChainDataHandler;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.HaierColdChainMessageData;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 13:03:45
+ */
+@Component
+@Slf4j
+public class HaierColdChainDataHandler extends AbstractColdChainDataHandler<HaierColdChainMessageData> {
+
+    @Override
+    public boolean handleRealTimeData(HaierColdChainMessageData data) {
+        log.info("海尔数据处理器正在实时处理时间,{}");
+        return false;
+    }
+}

+ 63 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/handler/impl/RenKeColdChainDataHandler.java

@@ -0,0 +1,63 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.handler.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+import rk.netDevice.sdk.p2.RealTimeData;
+import vip.xiaonuo.coldchain.modular.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.modular.event.SensorDataEvent;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.handler.AbstractColdChainDataHandler;
+import vip.xiaonuo.coldchain.modular.service.dataprocess.model.RenKeColdChainMessageData;
+
+import java.time.Instant;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 13:03:45
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class RenKeColdChainDataHandler extends AbstractColdChainDataHandler<RenKeColdChainMessageData> {
+    private final ApplicationEventPublisher eventPublisher;  // To publish events
+
+    @Override
+    public boolean handleRealTimeData(RenKeColdChainMessageData renKeColdChainMessageData) {
+        RealTimeData data = renKeColdChainMessageData.getRealTimeData();
+        final int deviceId = data.getDeviceId();
+        data.getNodeList().forEach(nodeData -> {
+            SensorData sensorData = new SensorData();
+            // 如果记录时间为空,使用当前时间
+            if (nodeData.getRecordTime() == null) {
+                Instant defaultTime = Instant.now();
+                sensorData.setTime(defaultTime);
+            } else {
+                sensorData.setTime(nodeData.getRecordTime().toInstant());
+            }
+            // 只处理有效数据:温度和湿度不为0
+            if (nodeData.getTem() != 0.0 || nodeData.getHum() != 0.0) {
+                log.info("记录ID: {}, 记录时间: {}, 温度: {}, 湿度: {}", deviceId + " : " + nodeData.getNodeId(), nodeData.getRecordTime(), nodeData.getTem(), nodeData.getHum());
+                sensorData.setTemperature(nodeData.getTem());
+                sensorData.setHumidity(nodeData.getHum());
+                sensorData.setLat(nodeData.getLat());
+                sensorData.setLng(nodeData.getLng());
+                sensorData.putTag("name","周小杰");
+                writeData(sensorData);
+            }
+        });
+        return Boolean.TRUE;
+    }
+
+    /**
+     * 异步将处理后的数据写入 InfluxDB
+     *
+     * @param sensorData 传感器数据
+     */
+    public void writeData(SensorData sensorData) {
+        eventPublisher.publishEvent(new SensorDataEvent(this, sensorData));
+    }
+}

+ 17 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/model/ColdChainMessageData.java

@@ -0,0 +1,17 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.model;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/12 13:00:25
+ */
+public interface ColdChainMessageData extends java.io.Serializable {
+    // 默认的时间字段,返回当前时间
+    default LocalDateTime getTimestamp() {
+        return LocalDateTime.now();
+    }
+}

+ 14 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/model/HaierColdChainMessageData.java

@@ -0,0 +1,14 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.model;
+
+import lombok.Data;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description 海尔
+ * @date 2024/11/12 13:00:46
+ */
+@Data
+public class HaierColdChainMessageData implements ColdChainMessageData{
+}

+ 16 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/service/dataprocess/model/RenKeColdChainMessageData.java

@@ -0,0 +1,16 @@
+package vip.xiaonuo.coldchain.modular.service.dataprocess.model;
+
+import lombok.Data;
+import rk.netDevice.sdk.p2.RealTimeData;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description 仁科
+ * @date 2024/11/12 13:00:46
+ */
+@Data
+public class RenKeColdChainMessageData implements ColdChainMessageData{
+    private RealTimeData realTimeData;
+}

+ 1 - 1
snowy-web-app/src/main/java/vip/xiaonuo/Application.java

@@ -32,7 +32,7 @@ import vip.xiaonuo.coldchain.modular.renke.RKService;
  */
 @Slf4j
 @RestController
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = {"vip.xiaonuo","com.github.jfcloud"})
 public class Application {
     @Autowired
     RKService service;

+ 7 - 1
snowy-web-app/src/main/resources/application.properties

@@ -1,7 +1,7 @@
 #########################################
 # server configuration
 #########################################
-server.port=82
+server.port=51182
 
 #########################################
 # spring allow-circular-references
@@ -32,6 +32,12 @@ spring.datasource.dynamic.datasource.master.username=root
 spring.datasource.dynamic.datasource.master.password=Root123...
 spring.datasource.dynamic.strict=true
 
+# influxdb
+spring.data.influxdb.url=${INFLUXDB_URL:http://192.168.67.228:8086}
+spring.data.influxdb.token=${INFLUXDB_TOKEN:1NdDyN3LCKIEBFkQ1AqAmRSitZGfdCs0nuF11nLQbTcnN_5mp_asnfFnmAXTvDDQXGr83llxuXJu5wNTPtrsIw==}
+spring.data.influxdb.org=${INFLUXDB_ORG:jfcloud}
+spring.data.influxdb.bucket=${INFLUXDB_BUCKET:jfcloud}
+
 # postgres
 #spring.datasource.dynamic.datasource.master.driver-class-name=org.postgresql.Driver
 #spring.datasource.dynamic.datasource.master.url=jdbc:postgresql://localhost:5432/snowy