From 8502fb2a1648d1453f96b4288d68c16dfcf5bae5 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期一, 12 五月 2025 16:19:49 +0800
Subject: [PATCH] feat(data): 新增mqtt电表数据解析和写入,新增opcua电表和温湿度计数据解析和写入

---
 src/main/java/com/zhitan/util/PowerDataMapper.java         |  114 ++++
 src/main/java/com/zhitan/model/entity/PowerEntity.java     |   50 +
 src/main/java/com/zhitan/controller/OpcController.java     |   73 ++
 src/main/java/com/zhitan/model/entity/DeviceData.java      |   45 +
 src/main/java/com/zhitan/service/IOpcService.java          |   56 ++
 src/main/java/com/zhitan/handler/OpcDataHandler.java       |   44 +
 src/main/java/com/zhitan/MQTTGatewayApplication.java       |    2 
 src/main/resources/application-prod.yml                    |  298 +++++++++++
 pom.xml                                                    |   43 +
 src/main/java/com/zhitan/service/IDataService.java         |    8 
 src/main/java/com/zhitan/config/opc/OpcConfig.java         |   48 +
 src/main/java/com/zhitan/service/impl/OpcServiceImpl.java  |  392 ++++++++++++++
 src/main/java/com/zhitan/influxdb/InfluxdbRepository.java  |   30 +
 src/main/java/com/zhitan/model/entity/OpcData.java         |   46 +
 src/main/java/com/zhitan/redis/RedisCache.java             |   35 
 src/main/resources/application-dev.yml                     |  244 ++++++++
 src/main/java/com/zhitan/service/impl/DataServiceImpl.java |   59 ++
 src/main/resources/application.yml                         |    4 
 src/main/java/com/zhitan/handler/MqttMessageHandler.java   |   15 
 19 files changed, 1,575 insertions(+), 31 deletions(-)

diff --git a/pom.xml b/pom.xml
index 9ccc7d2..8fd71d4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,13 +15,14 @@
     </parent>
 
     <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <integration.version>3.4.3</integration.version>
         <druid.version>1.2.20</druid.version>
         <mybatis-plus.version>3.5.6</mybatis-plus.version>
         <influxdb-client.version>6.6.0</influxdb-client.version>
+        <milo.version>0.6.13</milo.version>
     </properties>
 
     <dependencies>
@@ -93,7 +94,37 @@
             <version>26.0.2</version>
             <scope>compile</scope>
         </dependency>
+        <!-- Eclipse Milo OPC UA 瀹㈡埛绔� -->
+        <dependency>
+            <groupId>org.eclipse.milo</groupId>
+            <artifactId>sdk-client</artifactId>
+            <version>${milo.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.milo</groupId>
+            <artifactId>stack-core</artifactId>
+            <version>${milo.version}</version>
+        </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <build.profile.id>dev</build.profile.id>
+                <profileActive>dev</profileActive>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <build.profile.id>prod</build.profile.id>
+                <profileActive>prod</profileActive>
+            </properties>
+        </profile>
+    </profiles>
 
     <repositories>
         <repository>
@@ -136,6 +167,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>9</source>
+                    <target>9</target>
+                </configuration>
+            </plugin>
         </plugins>
         <finalName>${project.artifactId}</finalName>
     </build>
diff --git a/src/main/java/com/zhitan/MQTTGatewayApplication.java b/src/main/java/com/zhitan/MQTTGatewayApplication.java
index e24a8ff..01e4c81 100644
--- a/src/main/java/com/zhitan/MQTTGatewayApplication.java
+++ b/src/main/java/com/zhitan/MQTTGatewayApplication.java
@@ -3,11 +3,13 @@
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * application
  */
 @SpringBootApplication
+@EnableScheduling
 @MapperScan(basePackages = {"com.zhitan.mapper"})
 public class MQTTGatewayApplication {
     public static void main(String[] args) {
diff --git a/src/main/java/com/zhitan/config/opc/OpcConfig.java b/src/main/java/com/zhitan/config/opc/OpcConfig.java
new file mode 100644
index 0000000..f2054ff
--- /dev/null
+++ b/src/main/java/com/zhitan/config/opc/OpcConfig.java
@@ -0,0 +1,48 @@
+package com.zhitan.config.opc;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * OPC UA閰嶇疆绫�
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "opc")
+public class OpcConfig {
+    /**
+     * OPC UA鏈嶅姟鍣ㄥ湴鍧�
+     */
+    private String serverUrl;
+    
+    /**
+     * 鐢ㄦ埛鍚�
+     */
+    private String username;
+    
+    /**
+     * 瀵嗙爜
+     */
+    private String password;
+    
+    /**
+     * 鏄惁鍚敤
+     */
+    private boolean enable;
+    
+    /**
+     * 閲囬泦闂撮殧(姣)
+     */
+    private long scanRate = 5000;
+    
+    /**
+     * 杩炴帴瓒呮椂鏃堕棿(姣)
+     */
+    private int connectionTimeout = 10000;
+    
+    /**
+     * 鑺傜偣鍒楄〃锛屾牸寮忎负锛氬悕绉�=鑺傜偣ID
+     */
+    private String[] nodes;
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhitan/controller/OpcController.java b/src/main/java/com/zhitan/controller/OpcController.java
new file mode 100644
index 0000000..b3b7713
--- /dev/null
+++ b/src/main/java/com/zhitan/controller/OpcController.java
@@ -0,0 +1,73 @@
+package com.zhitan.controller;
+
+import com.zhitan.model.entity.OpcData;
+import com.zhitan.service.IOpcService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * OPC UA鎺у埗鍣�
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/opc")
+public class OpcController {
+
+    private final IOpcService opcService;
+
+    @Autowired
+    public OpcController(IOpcService opcService) {
+        this.opcService = opcService;
+    }
+
+    /**
+     * 鑾峰彇OPC UA杩炴帴鐘舵��
+     */
+    @GetMapping("/status")
+    public boolean getConnectionStatus() {
+        return opcService.isConnected();
+    }
+
+    /**
+     * 鎵嬪姩杩炴帴OPC UA鏈嶅姟鍣�
+     */
+    @PostMapping("/connect")
+    public boolean connect() {
+        return opcService.connect();
+    }
+
+    /**
+     * 鏂紑OPC UA杩炴帴
+     */
+    @PostMapping("/disconnect")
+    public void disconnect() {
+        opcService.disconnect();
+    }
+
+    /**
+     * 鍚姩鏁版嵁閲囬泦
+     */
+    @PostMapping("/start")
+    public void startCollection() {
+        opcService.startDataCollection();
+    }
+
+    /**
+     * 鍋滄鏁版嵁閲囬泦
+     */
+    @PostMapping("/stop")
+    public void stopCollection() {
+        opcService.stopDataCollection();
+    }
+
+    /**
+     * 璇诲彇鎵�鏈夎妭鐐规暟鎹�
+     */
+    @GetMapping("/data")
+    public List<OpcData> readAllData() {
+        return opcService.readAllNodes();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhitan/handler/MqttMessageHandler.java b/src/main/java/com/zhitan/handler/MqttMessageHandler.java
index d1f8b83..7913d74 100644
--- a/src/main/java/com/zhitan/handler/MqttMessageHandler.java
+++ b/src/main/java/com/zhitan/handler/MqttMessageHandler.java
@@ -1,13 +1,19 @@
 package com.zhitan.handler;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.zhitan.model.entity.DeviceData;
 import com.zhitan.model.entity.ElectricPower;
+import com.zhitan.model.entity.PowerEntity;
 import com.zhitan.service.IDataService;
+import com.zhitan.util.PowerDataMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.MessageHandler;
 import org.springframework.messaging.MessagingException;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * mqtt 娑堟伅澶勭悊绫�
@@ -31,8 +37,13 @@
         ObjectMapper objectMapper = new ObjectMapper();
         try {
             // 灏� JSON 瀛楃涓茶浆鎹负 SensorData 瀵硅薄
-            ElectricPower electricPower = objectMapper.readValue(payload, ElectricPower.class);
-            dataService.writeTimeSeriesData(electricPower);
+            //ElectricPower electricPower = objectMapper.readValue(payload, ElectricPower.class);
+            DeviceData data = objectMapper.readValue(payload, DeviceData.class);
+            List<PowerEntity> powerMeters = PowerDataMapper.mapToEntities(data);
+            for (PowerEntity powerMeter : powerMeters) {
+                dataService.writeTimeSeriesData(powerMeter);
+            }
+            // dataService.writeTimeSeriesData(electricPower)
         } catch (Exception e) {
             log.error(e.getMessage());
         }
diff --git a/src/main/java/com/zhitan/handler/OpcDataHandler.java b/src/main/java/com/zhitan/handler/OpcDataHandler.java
new file mode 100644
index 0000000..29c3940
--- /dev/null
+++ b/src/main/java/com/zhitan/handler/OpcDataHandler.java
@@ -0,0 +1,44 @@
+package com.zhitan.handler;
+
+import com.zhitan.model.entity.OpcData;
+import com.zhitan.service.IDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * OPC UA鏁版嵁澶勭悊鍣�
+ */
+@Slf4j
+@Component
+public class OpcDataHandler {
+    private final IDataService dataService;
+
+    public OpcDataHandler(IDataService dataService) {
+        this.dataService = dataService;
+    }
+
+    /**
+     * 澶勭悊OPC UA鏁版嵁
+     *
+     * @param dataList OPC UA鏁版嵁鍒楄〃
+     */
+    public void handleOpcData(List<OpcData> dataList) {
+        if (dataList == null || dataList.isEmpty()) {
+            return;
+        }
+
+        for (OpcData data : dataList) {
+            if (data.getValue() != null) {
+                // 鏋勫缓JSON鏍煎紡鏁版嵁
+                String jsonData = String.format("{\"%s\":%f}", data.getName(), data.getValue());
+                // 浣跨敤鐜版湁鐨勬暟鎹湇鍔″啓鍏ユ椂搴忔暟鎹�
+                dataService.writeTimeSeriesData(jsonData);
+                log.debug("澶勭悊OPC UA鏁版嵁: {} = {}", data.getName(), data.getValue());
+            } else if (data.getErrorMessage() != null) {
+                log.warn("OPC UA鏁版嵁澶勭悊澶辫触: {} - {}", data.getName(), data.getErrorMessage());
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhitan/influxdb/InfluxdbRepository.java b/src/main/java/com/zhitan/influxdb/InfluxdbRepository.java
index b55ef44..8835285 100644
--- a/src/main/java/com/zhitan/influxdb/InfluxdbRepository.java
+++ b/src/main/java/com/zhitan/influxdb/InfluxdbRepository.java
@@ -5,6 +5,8 @@
 import com.influxdb.client.InfluxDBClientFactory;
 import com.influxdb.client.WriteApiBlocking;
 import com.influxdb.client.write.Point;
+import com.influxdb.query.FluxRecord;
+import com.influxdb.query.FluxTable;
 import com.zhitan.config.influxdb.InfluxdbConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -73,4 +75,32 @@
         WriteApiBlocking writeApi = client.getWriteApiBlocking();
         writeApi.writePoints(points);
     }
+
+    public double getLastPoint(String measurement, String tag, String s) {
+        if (client == null || !config.isEnable()) {
+            log.warn("InfluxDB client is not initialized or disabled.");
+            return 0;
+        }
+
+        String query = String.format("from(bucket: \"%s\") " +
+                "|> range(start: -1h) " +
+                "|> filter(fn: (r) => r._measurement == \"%s\" and r._field == \"value\") " +
+                "|> filter(fn: (r) => r.tag == \"%s\") " +
+                "|> last()", config.getBucket(), measurement, s);
+
+        List<FluxTable> tables = client.getQueryApi().query(query, config.getOrg());
+
+        if (tables != null && !tables.isEmpty()) {
+            List<FluxRecord> records = tables.get(0).getRecords();
+            if (records != null && !records.isEmpty()) {
+                FluxRecord record = records.get(0);
+                double value = (double) record.getValue();
+
+                return value;
+            }
+        }
+
+        log.warn("No data found for measurement: {}, tag: {}, field: {}", measurement, tag, s);
+        return 0;
+    }
 }
diff --git a/src/main/java/com/zhitan/model/entity/DeviceData.java b/src/main/java/com/zhitan/model/entity/DeviceData.java
new file mode 100644
index 0000000..0dc8e33
--- /dev/null
+++ b/src/main/java/com/zhitan/model/entity/DeviceData.java
@@ -0,0 +1,45 @@
+package com.zhitan.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceData {
+    @JsonProperty("params")
+    private Params params;
+
+    @Data
+    public static class Params {
+        @JsonProperty("dir")
+        private String dir;
+        
+        @JsonProperty("id")
+        private String id;
+        
+        @JsonProperty("sys_sn")
+        private String sysSn;
+        
+        @JsonProperty("sys_imei")
+        private String sysImei;
+        
+        @JsonProperty("sys_time")
+        private Long sysTime; // 鏃堕棿鎴崇敤Long绫诲瀷
+        
+        @JsonProperty("r_data")
+        private List<RDataItem> rData;
+    }
+
+    @Data
+    public static class RDataItem {
+        @JsonProperty("name")
+        private String name;
+        
+        @JsonProperty("value")
+        private String value; // 鏍规嵁瀹為檯鏁版嵁鏍煎紡閫夋嫨String/Double
+        
+        @JsonProperty("err")
+        private String error;
+    }
+}
diff --git a/src/main/java/com/zhitan/model/entity/OpcData.java b/src/main/java/com/zhitan/model/entity/OpcData.java
new file mode 100644
index 0000000..be7ef0e
--- /dev/null
+++ b/src/main/java/com/zhitan/model/entity/OpcData.java
@@ -0,0 +1,46 @@
+package com.zhitan.model.entity;
+
+import lombok.Data;
+
+import java.time.Instant;
+
+/**
+ * OPC UA鏁版嵁妯″瀷
+ */
+@Data
+public class OpcData {
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    private String name;
+    
+    /**
+     * 鑺傜偣ID
+     */
+    private String nodeId;
+    
+    /**
+     * 鏁版嵁鍊�
+     */
+    private Double value;
+    
+    /**
+     * 鏁版嵁绫诲瀷
+     */
+    private String dataType;
+    
+    /**
+     * 鏃堕棿鎴�
+     */
+    private Instant timestamp;
+    
+    /**
+     * 鐘舵�佺爜
+     */
+    private Integer statusCode;
+    
+    /**
+     * 閿欒淇℃伅
+     */
+    private String errorMessage;
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhitan/model/entity/PowerEntity.java b/src/main/java/com/zhitan/model/entity/PowerEntity.java
new file mode 100644
index 0000000..0d7a543
--- /dev/null
+++ b/src/main/java/com/zhitan/model/entity/PowerEntity.java
@@ -0,0 +1,50 @@
+package com.zhitan.model.entity;
+
+import lombok.Data;
+
+@Data
+public class PowerEntity {
+    // sys_sn
+    private String sn;
+    //sys_imei
+    private String imei;
+    //sys_time
+    private Long time;
+    // Uab
+    private Double uab;
+    // Ubc
+    private Double ubc;
+    // Uca
+    private Double uca;
+    // Ua
+    private Double ua;
+    // Ub
+    private Double ub;
+    // Uc
+    private Double uc;
+    // Ia
+    private Double ia;
+    // Ib
+    private Double ib;
+    // Ic
+    private Double ic;
+    // 闆跺簭鐢垫祦 Io
+    private Double io;
+    // 鎬诲姛鐜囧洜鏁� PF
+    private Double pf;
+    // 鎬绘湁鍔熷姛鐜� psum
+    private Double psum;
+    // 鎬绘湁鍔熺數鑳� eps
+    private Double eps;
+    // 鎬绘棤鍔熺數鑳� eqs
+    private Double eqs;
+    // 姝e悜鎬绘湁鍔熺數鑳� epsp
+    private Double epsp;
+    // 鍙嶅悜鎬绘湁鍔熺數鑳� epsn
+    private Double epsn;
+    // 姝e悜鎬绘棤鍔熺數鑳� eqsp
+    private Double eqsp;
+    // 鍙嶅悜鎬绘棤鍔熺數鑳� eqsn
+    private Double eqsn;
+
+}
diff --git a/src/main/java/com/zhitan/redis/RedisCache.java b/src/main/java/com/zhitan/redis/RedisCache.java
index d008cb7..567d67f 100644
--- a/src/main/java/com/zhitan/redis/RedisCache.java
+++ b/src/main/java/com/zhitan/redis/RedisCache.java
@@ -80,22 +80,29 @@
     }
 
     /**
-     * 缂撳瓨List鏁版嵁
-     *
-     * @param key      缂撳瓨鐨勯敭鍊�
-     * @param dataList 寰呯紦瀛樼殑List鏁版嵁
-     * @return 缂撳瓨鐨勫璞�
-     */
-    public <T> ListOperations<String, T> setCacheList(String key, List<T> dataList) {
-        ListOperations listOperation = redisTemplate.opsForList();
-        if (null != dataList) {
-            int size = dataList.size();
-            for (int i = 0; i < size; i++) {
-                listOperation.leftPush(key, dataList.get(i));
-            }
+ * 缂撳瓨List鏁版嵁锛屽苟璁剧疆杩囨湡鏃堕棿
+ *
+ * @param key      缂撳瓨鐨勯敭鍊�
+ * @param dataList 寰呯紦瀛樼殑List鏁版嵁
+ * @param timeout  杩囨湡鏃堕棿
+ * @param timeUnit 鏃堕棿鍗曚綅
+ * @return 缂撳瓨鐨勫璞�
+ */
+public <T> ListOperations<String, T> setCacheList(String key, List<T> dataList, Integer timeout, TimeUnit timeUnit) {
+    ListOperations listOperation = redisTemplate.opsForList();
+    if (null != dataList) {
+        int size = dataList.size();
+        for (int i = 0; i < size; i++) {
+            listOperation.leftPush(key, dataList.get(i));
         }
-        return listOperation;
     }
+    // 璁剧疆杩囨湡鏃堕棿
+    if (timeout > 0) {
+        redisTemplate.expire(key, timeout, timeUnit);
+    }
+    return listOperation;
+}
+
 
     /**
      * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄
diff --git a/src/main/java/com/zhitan/service/IDataService.java b/src/main/java/com/zhitan/service/IDataService.java
index f04f0cc..4edd3ac 100644
--- a/src/main/java/com/zhitan/service/IDataService.java
+++ b/src/main/java/com/zhitan/service/IDataService.java
@@ -1,6 +1,7 @@
 package com.zhitan.service;
 
 import com.zhitan.model.entity.ElectricPower;
+import com.zhitan.model.entity.PowerEntity;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -21,4 +22,11 @@
      * @param electricPower 鍥哄畾鏍煎紡鐨勬暟鎹�
      */
     void writeTimeSeriesData(@NotNull ElectricPower electricPower);
+
+    /**
+     * 鍐欏叆鐢靛姏鐩稿叧鏁版嵁-鍥哄畾鏍煎紡锛屽彲鑷畾涔変慨鏀�
+     *
+     * @param powerEntity 鍥哄畾鏍煎紡鐨勬暟鎹�
+     */
+    void writeTimeSeriesData(@NotNull PowerEntity powerEntity);
 }
diff --git a/src/main/java/com/zhitan/service/IOpcService.java b/src/main/java/com/zhitan/service/IOpcService.java
new file mode 100644
index 0000000..85d5fb1
--- /dev/null
+++ b/src/main/java/com/zhitan/service/IOpcService.java
@@ -0,0 +1,56 @@
+package com.zhitan.service;
+
+import com.zhitan.model.entity.OpcData;
+
+import java.util.List;
+
+/**
+ * OPC UA鏈嶅姟鎺ュ彛
+ */
+public interface IOpcService {
+    
+    /**
+     * 杩炴帴鍒癘PC UA鏈嶅姟鍣�
+     * 
+     * @return 鏄惁杩炴帴鎴愬姛
+     */
+    boolean connect();
+    
+    /**
+     * 鏂紑涓嶰PC UA鏈嶅姟鍣ㄧ殑杩炴帴
+     */
+    void disconnect();
+    
+    /**
+     * 璇诲彇鍗曚釜鑺傜偣鐨勬暟鎹�
+     * 
+     * @param nodeId 鑺傜偣ID
+     * @param name 鑺傜偣鍚嶇О
+     * @return OPC鏁版嵁
+     */
+    OpcData readNode(String nodeId, String name);
+    
+    /**
+     * 璇诲彇鎵�鏈夐厤缃殑鑺傜偣鏁版嵁
+     * 
+     * @return OPC鏁版嵁鍒楄〃
+     */
+    List<OpcData> readAllNodes();
+    
+    /**
+     * 鍚姩鏁版嵁閲囬泦
+     */
+    void startDataCollection();
+    
+    /**
+     * 鍋滄鏁版嵁閲囬泦
+     */
+    void stopDataCollection();
+    
+    /**
+     * 妫�鏌ヨ繛鎺ョ姸鎬�
+     * 
+     * @return 鏄惁宸茶繛鎺�
+     */
+    boolean isConnected();
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
index fc1af3d..18d8376 100644
--- a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
+++ b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
@@ -11,6 +11,7 @@
 import com.zhitan.model.entity.ElectricPower;
 import com.zhitan.influxdb.InfluxdbRepository;
 import com.zhitan.mapper.CommonMapper;
+import com.zhitan.model.entity.PowerEntity;
 import com.zhitan.redis.RedisCache;
 import com.zhitan.service.IDataService;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 鏁版嵁service
@@ -118,6 +120,61 @@
         repository.writePoints(points);
     }
 
+
+    /**
+     * 鍐欏叆鐢靛姏鐩稿叧鏁版嵁-鍥哄畾鏍煎紡锛屽彲鑷畾涔変慨鏀�
+     *
+     * @param powerEntity 鍥哄畾鏍煎紡鐨勬暟鎹�
+     */
+    @Override
+    public void writeTimeSeriesData(@NotNull PowerEntity powerEntity) {
+        List<IndexTemplate> templates = getIndexTemplate();
+        // 鑾峰彇绫讳腑鎵�鏈夊0鏄庣殑瀛楁
+        Field[] fields = powerEntity.getClass().getDeclaredFields();
+        List<Point> points = new ArrayList<>();
+        for (Field field : fields) {
+            IndexTemplate indexTemplate = templates.stream().filter(template ->
+                            field.getName().equalsIgnoreCase(template.getGatewayKey()))
+                    .findFirst().orElse(null);
+            if (indexTemplate != null) {
+                Point point = Point
+                        .measurement(influxdbConfig.getMeasurement())
+                        .addTag(TAG, powerEntity.getSn() + "_" + indexTemplate.getCode())
+                        .time(Instant.now(), WritePrecision.S);
+                // 璁剧疆瀛楁鍙闂紝鍏佽璁块棶绉佹湁瀛楁
+                field.setAccessible(true);
+                if (Number.class.isAssignableFrom(field.getType()) || field.getType().isPrimitive()) {
+                    try {
+                        // 鑾峰彇瀛楁鍊�
+                        Object o = field.get(powerEntity);
+                        if (o==null) {
+                            // 鏌ヨ鍑烘渶鍚庝竴娆″啓鍏nfluxdb鐨勬暟鎹�
+                            double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
+                                    TAG, powerEntity.getSn() + "_" + indexTemplate.getCode());
+                            if (lastValue>0) {
+                                log.info("鏌ヨ鍑烘渶鍚庝竴娆″啓鍏nfluxdb鐨勬暟鎹�:{}", lastValue);
+                            }
+                            point.addField(FIELD_VALUE, lastValue);
+                        } else {
+                            // 瀹夊叏绫诲瀷杞崲
+                            if (o instanceof Number) {
+                                double value = ((Number) o).doubleValue();
+                                point.addField(FIELD_VALUE, value);
+                                // 浣跨敤 value...
+                            } else {
+                                log.error("瀛楁 {} 绫诲瀷闈炴硶: {}", field.getName(), o.getClass());
+                            }
+                        }
+                        points.add(point);
+                    } catch (IllegalAccessException e) {
+                        log.error("鑾峰彇灞炴�у�煎け璐�:{}", e.getMessage());
+                    }
+                }
+            }
+        }
+        repository.writePoints(points);
+    }
+
     /**
      * 鑾峰彇鐐逛綅妯℃澘
      */
@@ -126,7 +183,7 @@
         List<IndexTemplate> result = redisCache.getCacheList(TEMPLATE_KEY);
         if (result == null || result.isEmpty()) {
             result = commonMapper.getIndexTemplate();
-            redisCache.setCacheList(TEMPLATE_KEY, result);
+            redisCache.setCacheList(TEMPLATE_KEY, result, 120, TimeUnit.SECONDS);
         }
         return result;
     }
diff --git a/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java b/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java
new file mode 100644
index 0000000..b456832
--- /dev/null
+++ b/src/main/java/com/zhitan/service/impl/OpcServiceImpl.java
@@ -0,0 +1,392 @@
+package com.zhitan.service.impl;
+
+import com.influxdb.client.domain.WritePrecision;
+import com.influxdb.client.write.Point;
+import com.zhitan.config.influxdb.InfluxdbConfig;
+import com.zhitan.config.opc.OpcConfig;
+import com.zhitan.handler.OpcDataHandler;
+import com.zhitan.influxdb.InfluxdbRepository;
+import com.zhitan.model.entity.OpcData;
+import com.zhitan.service.IOpcService;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
+import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfig;
+import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder;
+import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
+import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider;
+import org.eclipse.milo.opcua.stack.client.DiscoveryClient;
+import org.eclipse.milo.opcua.stack.core.AttributeId;
+import org.eclipse.milo.opcua.stack.core.UaException;
+import org.eclipse.milo.opcua.stack.core.types.builtin.*;
+import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger;
+import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
+import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
+import org.eclipse.milo.opcua.stack.core.types.structured.ReadResponse;
+import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.text.ParseException;
+import java.time.Instant;
+import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * OPC UA鏈嶅姟瀹炵幇绫�
+ */
+@Slf4j
+@Service
+public class OpcServiceImpl implements IOpcService {
+
+    private final OpcConfig opcConfig;
+    private final InfluxdbRepository influxdbRepository;
+    private final InfluxdbConfig influxdbConfig;
+    private final OpcDataHandler opcDataHandler;
+    
+    private OpcUaClient client;
+    private final AtomicBoolean isRunning = new AtomicBoolean(false);
+    private final Map<String, String> nodeMap = new HashMap<>();
+    private final String TAG = "tag";
+    private final String FIELD_VALUE = "value";
+    
+    @Autowired
+    public OpcServiceImpl(OpcConfig opcConfig, InfluxdbRepository influxdbRepository, 
+                         InfluxdbConfig influxdbConfig, OpcDataHandler opcDataHandler) {
+        this.opcConfig = opcConfig;
+        this.influxdbRepository = influxdbRepository;
+        this.influxdbConfig = influxdbConfig;
+        this.opcDataHandler = opcDataHandler;
+        parseNodeConfig();
+    }
+    
+    /**
+     * 瑙f瀽鑺傜偣閰嶇疆
+     */
+    private void parseNodeConfig() {
+        if (opcConfig.getNodes() != null) {
+            for (String nodeConfig : opcConfig.getNodes()) {
+                String[] parts = nodeConfig.split("=", 2);
+                if (parts.length == 2) {
+                    String name = parts[0];
+                    String nodeId = parts[1];
+                    nodeMap.put(nodeId, name);
+                    log.info("宸查厤缃甇PC UA鑺傜偣: {} -> {}", name, nodeId);
+                }
+            }
+        }
+    }
+    
+    /**
+     * 搴旂敤鍚姩鏃惰嚜鍔ㄨ繛鎺ュ苟寮�濮嬫暟鎹噰闆�
+     */
+    @PostConstruct
+    public void init() {
+        if (opcConfig.isEnable()) {
+            log.info("姝e湪鍒濆鍖朞PC UA瀹㈡埛绔�...");
+            if (connect()) {
+                startDataCollection();
+            }
+        } else {
+            log.info("OPC UA瀹㈡埛绔凡绂佺敤");
+        }
+    }
+    
+    /**
+     * 搴旂敤鍏抽棴鏃舵柇寮�杩炴帴
+     */
+    @PreDestroy
+    public void destroy() {
+        stopDataCollection();
+        disconnect();
+    }
+    
+    @Override
+    public boolean connect() {
+        if (client != null && isConnected()) {
+            log.info("OPC UA瀹㈡埛绔凡杩炴帴");
+            return true;
+        }
+        
+        try {
+            log.info("姝e湪杩炴帴OPC UA鏈嶅姟鍣�: {}", opcConfig.getServerUrl());
+            
+            // 鍙戠幇绔偣
+            List<EndpointDescription> endpoints = DiscoveryClient.getEndpoints(opcConfig.getServerUrl()).get();
+            EndpointDescription endpoint = endpoints.stream()
+                    .findFirst()
+                    .orElseThrow(() -> new Exception("鏈壘鍒板彲鐢ㄧ殑OPC UA绔偣"));
+            
+            // 閰嶇疆瀹㈡埛绔�
+            OpcUaClientConfigBuilder configBuilder = OpcUaClientConfig.builder()
+                    .setEndpoint(endpoint)
+                    .setRequestTimeout(UInteger.valueOf(opcConfig.getConnectionTimeout()));
+            
+            // 璁剧疆璁よ瘉鏂瑰紡
+            if (opcConfig.getUsername() != null && !opcConfig.getUsername().isEmpty()) {
+                configBuilder.setIdentityProvider(new UsernameProvider(
+                        opcConfig.getUsername(),
+                        opcConfig.getPassword()
+                ));
+            } else {
+                configBuilder.setIdentityProvider(new AnonymousProvider());
+            }
+            
+            // 鍒涘缓瀹㈡埛绔苟杩炴帴
+            client = OpcUaClient.create(configBuilder.build());
+            client.connect().get();
+            List<String> namespaceUris = Arrays.asList(client.getNamespaceTable().toArray());
+            for (int i = 0; i < namespaceUris.size(); i++) {
+                System.out.println("Namespace Index: " + i + ", URI: " + namespaceUris.get(i));
+            }
+            log.info("OPC UA瀹㈡埛绔繛鎺ユ垚鍔�");
+            return true;
+        } catch (Exception e) {
+            log.error("OPC UA瀹㈡埛绔繛鎺ュけ璐�: {}", e.getMessage(), e);
+            return false;
+        }
+    }
+    
+    @Override
+    public void disconnect() {
+        if (client != null) {
+            try {
+                client.disconnect().get();
+                log.info("OPC UA瀹㈡埛绔凡鏂紑杩炴帴");
+            } catch (Exception e) {
+                log.error("OPC UA瀹㈡埛绔柇寮�杩炴帴澶辫触: {}", e.getMessage(), e);
+            } finally {
+                client = null;
+            }
+        }
+    }
+    
+    @Override
+    public OpcData readNode(String nodeId, String name) {
+        log.info("姝e湪璇诲彇鑺傜偣: {},鍚嶇О锛� {}", nodeId, name);
+        OpcData data = new OpcData();
+        data.setNodeId(nodeId);
+        data.setName(name);
+        data.setTimestamp(Instant.now());
+
+        if (client == null || !isConnected()) {
+            data.setErrorMessage("OPC UA瀹㈡埛绔湭杩炴帴");
+            return data;
+        }
+
+        try {
+            // 鍒涘缓璇诲彇璇锋眰
+            ReadValueId readValueId = new ReadValueId(
+                    NodeId.parse(nodeId),
+                    AttributeId.Value.uid(),
+                    null,
+                    QualifiedName.NULL_VALUE
+            );
+
+            // 鎵ц璇诲彇
+            ReadResponse response = client.read(
+                    0.0,
+                    TimestampsToReturn.Both,
+                    List.of(readValueId)
+            ).get();
+
+            // 澶勭悊缁撴灉
+            DataValue[] results = response.getResults();
+            if (results == null || results.length == 0) {
+                data.setStatusCode(-1);
+                data.setErrorMessage("璇诲彇澶辫触: 鍝嶅簲涓棤缁撴灉鏁版嵁");
+                return data;
+            }
+
+            DataValue value = results[0];
+            data.setStatusCode((int) value.getStatusCode().getValue());
+
+            if (value.getStatusCode().isGood()) {
+                Variant variant = value.getValue();
+                if (variant != null && variant.getValue() != null) {
+                    Object rawValue = variant.getValue();
+                    data.setDataType(rawValue.getClass().getSimpleName());
+
+                    // 杞崲涓篋ouble
+                    if (rawValue instanceof Number) {
+                        data.setValue(((Number) rawValue).doubleValue());
+                    } else if (rawValue instanceof Boolean) {
+                        data.setValue((Boolean) rawValue ? 1.0 : 0.0);
+                    } else {
+                        data.setValue(null);
+                        data.setErrorMessage("涓嶆敮鎸佺殑鏁版嵁绫诲瀷: " + rawValue.getClass().getName());
+                    }
+                }
+            } else {
+                data.setErrorMessage("璇诲彇澶辫触: " + value.getStatusCode().toString());
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt(); // 鎭㈠涓柇鐘舵��
+            data.setErrorMessage("璇诲彇寮傚父: " + e.getMessage());
+            log.error("璇诲彇OPC UA鑺傜偣 {} 琚腑鏂�: {}", nodeId, e.getMessage(), e);
+        } catch (ExecutionException e) {
+            data.setErrorMessage("璇诲彇寮傚父: " + e.getCause() != null ? e.getCause().getMessage() : e.getMessage());
+            log.error("璇诲彇OPC UA鑺傜偣 {} 澶辫触: {}", nodeId, e.getMessage(), e);
+        } catch (Exception e) {
+            data.setErrorMessage("鏈煡寮傚父: " + e.getMessage());
+            log.error("璇诲彇OPC UA鑺傜偣 {} 鍙戠敓鏈煡寮傚父", nodeId, e);
+        }
+
+        return data;
+    }
+
+    
+    @Override
+    public List<OpcData> readAllNodes() {
+        List<OpcData> results = new ArrayList<>();
+        log.info("寮�濮嬭鍙栨墍鏈夎妭鐐规椂闂�: {}", Instant.now());
+        if (nodeMap.isEmpty()) {
+            log.warn("娌℃湁閰嶇疆OPC UA鑺傜偣");
+            return results;
+        }
+
+        try {
+            // 鏋勫缓鎵归噺璇诲彇璇锋眰
+            List<ReadValueId> readValueIds = new ArrayList<>();
+            Map<Integer, Map.Entry<String, String>> indexMap = new HashMap<>();
+
+            int index = 0;
+            for (Map.Entry<String, String> entry : nodeMap.entrySet()) {
+                ReadValueId readValueId = new ReadValueId(
+                    NodeId.parse(entry.getKey()),
+                    AttributeId.Value.uid(),
+                    null,
+                    QualifiedName.NULL_VALUE
+                );
+                readValueIds.add(readValueId);
+                indexMap.put(index++, entry);
+            }
+
+            // 鎵ц鎵归噺璇诲彇
+            ReadResponse response = client.read(0.0, TimestampsToReturn.Both, readValueIds).get();
+            DataValue[] dataValues = response.getResults();
+
+            if (dataValues == null || dataValues.length != readValueIds.size()) {
+                log.error("鎵归噺璇诲彇澶辫触: 杩斿洖缁撴灉鏁伴噺涓嶅尮閰�");
+                return results;
+            }
+
+            // 澶勭悊鍝嶅簲鏁版嵁
+            for (int i = 0; i < dataValues.length; i++) {
+                Map.Entry<String, String> entry = indexMap.get(i);
+                String nodeId = entry.getKey();
+                String name = entry.getValue();
+                DataValue value = dataValues[i];
+
+                OpcData data = new OpcData();
+                data.setNodeId(nodeId);
+                data.setName(name);
+                data.setTimestamp(Instant.now());
+
+                if (value.getStatusCode().isGood() && value.getValue() != null) {
+                    Variant variant = value.getValue();
+                    Object rawValue = variant.getValue();
+                    data.setDataType(rawValue.getClass().getSimpleName());
+                    data.setStatusCode((int) value.getStatusCode().getValue());
+
+                    if (rawValue instanceof Number) {
+                        data.setValue(((Number) rawValue).doubleValue());
+                    } else if (rawValue instanceof Boolean) {
+                        data.setValue((Boolean) rawValue ? 1.0 : 0.0);
+                    } else {
+                        data.setValue(null);
+                        data.setErrorMessage("涓嶆敮鎸佺殑鏁版嵁绫诲瀷: " + rawValue.getClass().getName());
+                    }
+                } else {
+                    data.setStatusCode((int) value.getStatusCode().getValue());
+                    data.setErrorMessage("璇诲彇澶辫触: " + value.getStatusCode().toString());
+                }
+
+                results.add(data);
+            }
+
+        } catch (Exception e) {
+            log.error("鎵归噺璇诲彇OPC UA鑺傜偣澶辫触", e);
+        }
+        log.info("璇诲彇鎵�鏈夎妭鐐瑰畬鎴�, 鍏辫 {} 涓妭鐐�, 鏃堕棿: {}", results.size(), Instant.now());
+        return results;
+    }
+
+    
+    @Override
+    public void startDataCollection() {
+        if (isRunning.compareAndSet(false, true)) {
+            log.info("OPC UA鏁版嵁閲囬泦宸插惎鍔�");
+        }
+    }
+    
+    @Override
+    public void stopDataCollection() {
+        if (isRunning.compareAndSet(true, false)) {
+            log.info("OPC UA鏁版嵁閲囬泦宸插仠姝�");
+        }
+    }
+    @Override
+    public boolean isConnected() {
+        if (client == null) {
+            return false;
+        }
+        try {
+            return client.getSession().get() != null;
+        } catch (Exception e) {
+            log.warn("鑾峰彇OPC UA浼氳瘽澶辫触: {}", e.getMessage());
+            return false;
+        }
+    }
+
+
+
+    /**
+     * 瀹氭椂閲囬泦鏁版嵁骞跺啓鍏nfluxDB
+     */
+    @Scheduled(fixedDelayString = "${opc.scan-rate}")
+    public void collectAndStoreData() {
+        if (!opcConfig.isEnable() || !isRunning.get()) {
+            return;
+        }
+        
+        if (!isConnected() && !connect()) {
+            log.warn("OPC UA瀹㈡埛绔湭杩炴帴锛屾棤娉曢噰闆嗘暟鎹�");
+            return;
+        }
+        
+        try {
+            List<OpcData> dataList = readAllNodes();
+            List<Point> points = new ArrayList<>();
+            
+            // 浣跨敤涓ょ鏂瑰紡瀛樺偍鏁版嵁
+            // 1. 鐩存帴閫氳繃InfluxDB瀛樺偍搴撳啓鍏�
+            for (OpcData data : dataList) {
+                if (data.getValue() != null) {
+                    Point point = Point
+                            .measurement(influxdbConfig.getMeasurement())
+                            .addTag(TAG, data.getName())
+                            .addField(FIELD_VALUE, data.getValue())
+                            .time(data.getTimestamp(), WritePrecision.NS);
+                    points.add(point);
+                    log.debug("閲囬泦OPC UA鏁版嵁: {} = {}", data.getName(), data.getValue());
+                } else if (data.getErrorMessage() != null) {
+                    log.warn("閲囬泦OPC UA鏁版嵁澶辫触: {} - {}", data.getName(), data.getErrorMessage());
+                }
+            }
+            
+            if (!points.isEmpty()) {
+                influxdbRepository.writePoints(points);
+                log.info("鎴愬姛鍐欏叆 {} 鏉PC UA鏁版嵁鍒癐nfluxDB", points.size());
+            }
+            
+            // 2. 閫氳繃鏁版嵁澶勭悊鍣ㄤ娇鐢ㄧ幇鏈夌殑鏁版嵁鏈嶅姟鎺ュ彛鍐欏叆
+            opcDataHandler.handleOpcData(dataList);
+        } catch (Exception e) {
+            log.error("OPC UA鏁版嵁閲囬泦寮傚父: {}", e.getMessage(), e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhitan/util/PowerDataMapper.java b/src/main/java/com/zhitan/util/PowerDataMapper.java
new file mode 100644
index 0000000..563c497
--- /dev/null
+++ b/src/main/java/com/zhitan/util/PowerDataMapper.java
@@ -0,0 +1,114 @@
+package com.zhitan.util;
+
+import com.zhitan.model.entity.DeviceData;
+import com.zhitan.model.entity.PowerEntity;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class PowerDataMapper {
+    
+    public static List<PowerEntity> mapToEntities(DeviceData deviceData) {
+        List<PowerEntity> meters = IntStream.rangeClosed(1, 8)
+                .mapToObj(i -> createBaseEntity(deviceData, i))
+                .collect(Collectors.toList());
+
+        for (DeviceData.RDataItem item : deviceData.getParams().getRData()) {
+            // 绀轰緥锛氬皢 "Ia1" 鎷嗗垎涓� "Ia" 鍜� "1"
+            String[] parts = item.getName().split("(?<=\\D)(?=\\d)");
+            if (parts.length != 2) continue;
+
+            String fieldCode = parts[0]; // 濡� "Ia"
+            int meterIndex = Integer.parseInt(parts[1]) - 1; // 杞暟缁勪笅鏍�
+
+            if (meterIndex >= 0 && meterIndex < 8) {
+                setMeterField(meters.get(meterIndex), fieldCode, item.getValue());
+            }
+            // Uab1 Ubc1 Uca1鏄�8涓數琛ㄥ叡鐢ㄧ殑瀛楁锛屽鏋渋tem.getName鏄疷ab1 Ubc1 Uca1鍒欓亶鍘嗘墍鏈夌數琛ㄥ苟璧嬪��
+            if ("Uab Ubc Uca Ua Ub Uc".contains(fieldCode)) {
+                for (int i = 0; i < 8; i++) {
+                    setMeterField(meters.get(i), fieldCode, item.getValue());
+                }
+            }
+        }
+        return meters;
+    }
+
+    private static PowerEntity createBaseEntity(DeviceData data, int meterNumber) {
+        PowerEntity entity = new PowerEntity();
+        entity.setSn(data.getParams().getSysSn() + "_" + meterNumber);
+        entity.setImei(data.getParams().getSysImei());
+        entity.setTime(data.getParams().getSysTime());
+        return entity;
+    }
+
+    private static void setMeterField(PowerEntity entity, String fieldCode, String value) {
+        try {
+            switch (fieldCode.toUpperCase()) {
+                case "UAB":
+                    entity.setUab(parseDouble(value));
+                    break;
+                case "UBC":
+                    entity.setUbc(parseDouble(value));
+                    break;
+                case "UCA":
+                    entity.setUca(parseDouble(value));
+                    break;
+                case "UA":
+                    entity.setUa(parseDouble(value));
+                    break;
+                case "UB":
+                    entity.setUb(parseDouble(value));
+                    break;
+                case "UC":
+                    entity.setUc(parseDouble(value));
+                    break;
+                case "IA":
+                    entity.setIa(parseDouble(value));
+                    break;
+                case "IB":
+                    entity.setIb(parseDouble(value));
+                    break;
+                case "IC":
+                    entity.setIc(parseDouble(value));
+                    break;
+                case "IO":
+                    entity.setIo(parseDouble(value));
+                    break;
+                case "PF":
+                    entity.setPf(parseDouble(value));
+                    break;
+                case "PSUM":
+                    entity.setPsum(parseDouble(value));
+                    break;
+                case "EPS":
+                    entity.setEps(parseDouble(value));
+                    break;
+                case "EQS":
+                    entity.setEqs(parseDouble(value));
+                    break;
+                case "EPSP":
+                    entity.setEpsp(parseDouble(value));
+                    break;
+                case "EPSN":
+                    entity.setEpsn(parseDouble(value));
+                    break;
+                case "EQSP":
+                    entity.setEqsp(parseDouble(value));
+                    break;
+                case "EQSN":
+                    entity.setEqsn(parseDouble(value));
+                    break;
+
+
+            }
+        } catch (NumberFormatException e) {
+            // 澶勭悊鏁板�艰浆鎹㈠紓甯�
+        }
+    }
+
+    private static Double parseDouble(String s) {
+        return s != null ? Double.parseDouble(s) : null;
+    }
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 3804c3f..4403e84 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -4,9 +4,9 @@
     driverClassName: org.postgresql.Driver
     druid:
       master:
-        url: jdbc:postgresql://localhost:5432/energy
+        url: jdbc:postgresql://192.168.0.24:5432/postgres
         username: postgres
-        password: postgres
+        password: 123456
       # 鍒濆杩炴帴鏁�
       initialSize: 5
       # 鏈�灏忚繛鎺ユ睜鏁伴噺
@@ -52,13 +52,13 @@
             multi-statement-allow: true
   mqtt:
     # 鑷畾涔�
-    client-id: 202503181042
+    client-id: 2025031810421
     # 鍏叡MQTT鏈嶅姟鍣紝鐢熶骇鐜闇�瑕佹浛鎹负鑷繁鐨�
-    broker-url: tcp://broker.emqx.io
-    username:
-    password:
+    broker-url: tcp://lanpucloud.cn:1883
+    username: youren
+    password: 123456
     #榛樿璁㈤槄鐨勪富棰�
-    default-topic: zhitan
+    default-topic: lanbao/nygl/device/up
     timeout: 30
     keep-alive: 60
   redis:
@@ -67,12 +67,232 @@
     port: 6379
     password:
 influxdb:
-  host: "http://localhost:8086"
+  host: "http://192.168.0.24:8086"
   #淇敼涓鸿嚜宸辩殑鏃跺簭搴撹闂畂rg
-  org: "org"
+  org: "lanbao"
   #淇敼涓鸿嚜宸辩殑鏃跺簭搴揵ucket
-  bucket: "bucket"
+  bucket: "nygl"
   #淇敼涓鸿嚜宸辩殑鏃跺簭搴撹闂畉oken
-  token: "token"
+  token: "i8WwVZz3RvkEVF3qGaY8uIDXTFEe2PzjgrKebDzcxlYGKnR-kOK5Hf1S5G4z3p-lc9UO7MQS4qKGL4lIeHSw1A=="
   measurement: data
-  enable: true
\ No newline at end of file
+  enable: true
+# OPC UA閰嶇疆
+opc:
+  # OPC UA鏈嶅姟鍣ㄥ湴鍧�
+  server-url: "opc.tcp://192.168.254.195:49320"
+  # 鐢ㄦ埛鍚�
+  username: ""
+  # 瀵嗙爜
+  password: ""
+  # 鏄惁鍚敤
+  enable: true
+  # 閲囬泦闂撮殧(姣)
+  scan-rate: 30000
+  # 杩炴帴瓒呮椂鏃堕棿(姣)
+  connection-timeout: 10000
+  # 鑺傜偣鍒楄〃锛屾牸寮忎负锛氬悕绉�=鑺傜偣ID
+  nodes:
+    # 缁勮皟绾� LeftWorkshop
+    - "1-1#yijidiankonggui_1_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_1_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_1_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_1_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag7"
+    - "1-1#yijidiankonggui_1_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag8"
+    - "1-1#yijidiankonggui_1_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag9"
+    - "1-1#yijidiankonggui_1_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag10"
+    - "1-1#yijidiankonggui_1_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag13"
+    - "1-1#yijidiankonggui_1_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag16"
+    - "1-1#yijidiankonggui_1_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag14"
+    - "1-1#yijidiankonggui_1_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag15"
+    - "1-1#yijidiankonggui_1_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag17"
+    # 灏佺綈闂� CanSeamerRoom
+    - "1-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag21"
+    - "1-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag22"
+    - "1-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag23"
+    - "1-1#yijidiankonggui_2_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag24"
+    - "1-1#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag27"
+    - "1-1#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag30"
+    - "1-1#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag28"
+    - "1-1#yijidiankonggui_2_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag29"
+    - "1-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag31"
+    # 鎴愬搧搴� FinishedStore
+    - "1-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag35"
+    - "1-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag36"
+    - "1-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag37"
+    - "1-1#yijidiankonggui_3_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag38"
+    - "1-1#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag41"
+    - "1-1#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag44"
+    - "1-1#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag42"
+    - "1-1#yijidiankonggui_3_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag43"
+    - "1-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag45"
+    # 娓呮礂闂� RightWorkshop
+    - "1-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag49"
+    - "1-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag50"
+    - "1-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag51"
+    - "1-1#yijidiankonggui_4_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag52"
+    - "1-1#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag55"
+    - "1-1#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag58"
+    - "1-1#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag56"
+    - "1-1#yijidiankonggui_4_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag57"
+    - "1-1#yijidiankonggui_4_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag59"
+    #缁翠慨瀹ゅ姩鍔� MaintenanceRoom
+    - "1-2#yijidiankonggui_1_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_1_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_1_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_1_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag7"
+    - "1-2#yijidiankonggui_1_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag8"
+    - "1-2#yijidiankonggui_1_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag9"
+    - "1-2#yijidiankonggui_1_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag10"
+    - "1-2#yijidiankonggui_1_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag13"
+    - "1-2#yijidiankonggui_1_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag16"
+    - "1-2#yijidiankonggui_1_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag14"
+    - "1-2#yijidiankonggui_1_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag15"
+    - "1-2#yijidiankonggui_1_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag17"
+    # 鍘熸潗鏂欎粨搴� RawMaterialWarehouse
+    - "1-2#yijidiankonggui_2_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_2_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_2_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_2_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag21"
+    - "1-2#yijidiankonggui_2_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag22"
+    - "1-2#yijidiankonggui_2_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag23"
+    - "1-2#yijidiankonggui_2_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag24"
+    - "1-2#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag27"
+    - "1-2#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag30"
+    - "1-2#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag28"
+    - "1-2#yijidiankonggui_2_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag29"
+    - "1-2#yijidiankonggui_2_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag31"
+    # 鎭掓俯瀹� ThermostaticChamber
+    - "1-2#yijidiankonggui_3_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_3_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_3_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_3_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag35"
+    - "1-2#yijidiankonggui_3_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag36"
+    - "1-2#yijidiankonggui_3_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag37"
+    - "1-2#yijidiankonggui_3_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag38"
+    - "1-2#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag41"
+    - "1-2#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag44"
+    - "1-2#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag42"
+    - "1-2#yijidiankonggui_3_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag43"
+    - "1-2#yijidiankonggui_3_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag45"
+    # 鍖呰兌闂� PackGlueRoom
+    - "1-2#yijidiankonggui_4_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_4_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_4_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_4_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag49"
+    - "1-2#yijidiankonggui_4_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag50"
+    - "1-2#yijidiankonggui_4_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag51"
+    - "1-2#yijidiankonggui_4_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag52"
+    - "1-2#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag55"
+    - "1-2#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag58"
+    - "1-2#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag56"
+    - "1-2#yijidiankonggui_4_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag57"
+    - "1-2#yijidiankonggui_4_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag59"
+    # 宸﹁溅闂寸┖璋� leftWkshopVRVS
+    - "2-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
+    - "2-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
+    - "2-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
+    - "2-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag21"
+    - "2-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag22"
+    - "2-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag23"
+    - "2-1#yijidiankonggui_2_ActivePow=ns=2;s=modbus.2-1#yijidiankonggui.tag24"
+    - "2-1#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.2-1#yijidiankonggui.tag27"
+    - "2-1#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.2-1#yijidiankonggui.tag30"
+    - "2-1#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.2-1#yijidiankonggui.tag28"
+    - "2-1#yijidiankonggui_2_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag29"
+    - "2-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag31"
+    # 杞﹂棿鍔炲叕瀹� WorkshopOffice
+    - "2-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
+    - "2-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
+    - "2-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
+    - "2-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag35"
+    - "2-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag36"
+    - "2-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag37"
+    - "2-1#yijidiankonggui_3_ActivePow=ns=2;s=modbus.2-1#yijidiankonggui.tag38"
+    - "2-1#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.2-1#yijidiankonggui.tag41"
+    - "2-1#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.2-1#yijidiankonggui.tag44"
+    - "2-1#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.2-1#yijidiankonggui.tag42"
+    - "2-1#yijidiankonggui_3_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag43"
+    - "2-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag45"
+    # 1銆�2妤间笢鍔炲叕瀹� EastOffice
+    - "2-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
+    - "2-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
+    - "2-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
+    - "2-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag49"
+    - "2-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag50"
+    - "2-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag51"
+    - "2-1#yijidiankonggui_4_ActivePow=ns=2;s=modbus.2-1#yijidiankonggui.tag52"
+    - "2-1#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.2-1#yijidiankonggui.tag55"
+    - "2-1#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.2-1#yijidiankonggui.tag58"
+    - "2-1#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.2-1#yijidiankonggui.tag56"
+    - "2-1#yijidiankonggui_4_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag57"
+    - "2-1#yijidiankonggui_4_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag59"
+    #鐓ф槑 Lighting
+    - "3-1#yijidiankonggui_1_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_1_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_1_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_1_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag7"
+    - "3-1#yijidiankonggui_1_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag8"
+    - "3-1#yijidiankonggui_1_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag9"
+    - "3-1#yijidiankonggui_1_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag10"
+    - "3-1#yijidiankonggui_1_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag13"
+    - "3-1#yijidiankonggui_1_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag16"
+    - "3-1#yijidiankonggui_1_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag14"
+    - "3-1#yijidiankonggui_1_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag15"
+    - "3-1#yijidiankonggui_1_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag17"
+    # 杞﹂棿2妤� SecondFloorWorkshop
+    - "3-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag21"
+    - "3-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag22"
+    - "3-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag23"
+    - "3-1#yijidiankonggui_2_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag24"
+    - "3-1#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag27"
+    - "3-1#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag30"
+    - "3-1#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag28"
+    - "3-1#yijidiankonggui_2_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag29"
+    - "3-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag31"
+    # 鐢熶骇鍔炲叕瀹� ProductionOffice
+    - "3-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag35"
+    - "3-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag36"
+    - "3-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag37"
+    - "3-1#yijidiankonggui_3_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag38"
+    - "3-1#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag41"
+    - "3-1#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag44"
+    - "3-1#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag42"
+    - "3-1#yijidiankonggui_3_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag43"
+    - "3-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag45"
+    # 楂樹綆娓╄瘯楠屽尯 HLTempTest
+    - "3-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag49"
+    - "3-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag50"
+    - "3-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag51"
+    - "3-1#yijidiankonggui_4_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag52"
+    - "3-1#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag55"
+    - "3-1#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag58"
+    - "3-1#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag56"
+    - "3-1#yijidiankonggui_4_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag57"
+    - "3-1#yijidiankonggui_4_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag59"
+    # 鎴愬搧浠撳簱娓╂箍搴� chengpincangku
+    - "chengpincangku_WD=ns=2;s=_AdvancedTags.cpk_wd"
+    - "chengpincangku_SD=ns=2;s=_AdvancedTags.cpk_sd"
+    # 鐢熶骇杞﹂棿 shengchanchejian
+    - "shengchanchejian_WD=ns=2;s=_AdvancedTags.sccj_wd"
+    - "shengchanchejian_SD=ns=2;s=_AdvancedTags.sccj_sd"
+    # 鍘熸枡浠撳簱 yuliaocangku
+    - "yuliaocangku_WD=ns=2;s=_AdvancedTags.ylk_wd"
+    - "yuliaocangku_SD=ns=2;s=_AdvancedTags.ylk_sd"
\ No newline at end of file
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..69a92ef
--- /dev/null
+++ b/src/main/resources/application-prod.yml
@@ -0,0 +1,298 @@
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: org.postgresql.Driver
+    druid:
+      master:
+        url: jdbc:postgresql://192.168.0.24:5432/postgres
+        username: postgres
+        password: 123456
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: admin
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  mqtt:
+    # 鑷畾涔�
+    client-id: 202503181042
+    # 鍏叡MQTT鏈嶅姟鍣紝鐢熶骇鐜闇�瑕佹浛鎹负鑷繁鐨�
+    broker-url: tcp://lanpucloud.cn:1883
+    username: youren
+    password: 123456
+    #榛樿璁㈤槄鐨勪富棰�
+    default-topic: lanbao/nygl/device/up
+    timeout: 30
+    keep-alive: 60
+  redis:
+    database: 0
+    host: localhost
+    port: 6379
+    password:
+influxdb:
+  host: "http://192.168.0.24:8086"
+  #淇敼涓鸿嚜宸辩殑鏃跺簭搴撹闂畂rg
+  org: "lanbao"
+  #淇敼涓鸿嚜宸辩殑鏃跺簭搴揵ucket
+  bucket: "nygl"
+  #淇敼涓鸿嚜宸辩殑鏃跺簭搴撹闂畉oken
+  token: "i8WwVZz3RvkEVF3qGaY8uIDXTFEe2PzjgrKebDzcxlYGKnR-kOK5Hf1S5G4z3p-lc9UO7MQS4qKGL4lIeHSw1A=="
+  measurement: data
+  enable: true
+# OPC UA閰嶇疆
+opc:
+  # OPC UA鏈嶅姟鍣ㄥ湴鍧�
+  server-url: "opc.tcp://192.168.254.195:49320"
+  # 鐢ㄦ埛鍚�
+  username: ""
+  # 瀵嗙爜
+  password: ""
+  # 鏄惁鍚敤
+  enable: true
+  # 閲囬泦闂撮殧(姣)
+  scan-rate: 30000
+  # 杩炴帴瓒呮椂鏃堕棿(姣)
+  connection-timeout: 10000
+  # 鑺傜偣鍒楄〃锛屾牸寮忎负锛氬悕绉�=鑺傜偣ID
+  nodes:
+    # 缁勮皟绾� LeftWorkshop
+    - "1-1#yijidiankonggui_1_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_1_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_1_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_1_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag7"
+    - "1-1#yijidiankonggui_1_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag8"
+    - "1-1#yijidiankonggui_1_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag9"
+    - "1-1#yijidiankonggui_1_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag10"
+    - "1-1#yijidiankonggui_1_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag13"
+    - "1-1#yijidiankonggui_1_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag16"
+    - "1-1#yijidiankonggui_1_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag14"
+    - "1-1#yijidiankonggui_1_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag15"
+    - "1-1#yijidiankonggui_1_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag17"
+    # 灏佺綈闂� CanSeamerRoom
+    - "1-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag21"
+    - "1-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag22"
+    - "1-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag23"
+    - "1-1#yijidiankonggui_2_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag24"
+    - "1-1#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag27"
+    - "1-1#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag30"
+    - "1-1#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag28"
+    - "1-1#yijidiankonggui_2_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag29"
+    - "1-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag31"
+    # 鎴愬搧搴� FinishedStore
+    - "1-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag35"
+    - "1-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag36"
+    - "1-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag37"
+    - "1-1#yijidiankonggui_3_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag38"
+    - "1-1#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag41"
+    - "1-1#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag44"
+    - "1-1#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag42"
+    - "1-1#yijidiankonggui_3_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag43"
+    - "1-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag45"
+    # 娓呮礂闂� RightWorkshop
+    - "1-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.1-1#yijidiankonggui.tag1"
+    - "1-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.1-1#yijidiankonggui.tag2"
+    - "1-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.1-1#yijidiankonggui.tag3"
+    - "1-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.1-1#yijidiankonggui.tag49"
+    - "1-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.1-1#yijidiankonggui.tag50"
+    - "1-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.1-1#yijidiankonggui.tag51"
+    - "1-1#yijidiankonggui_4_ActivePow=ns=2;s=modbus.1-1#yijidiankonggui.tag52"
+    - "1-1#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.1-1#yijidiankonggui.tag55"
+    - "1-1#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.1-1#yijidiankonggui.tag58"
+    - "1-1#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.1-1#yijidiankonggui.tag56"
+    - "1-1#yijidiankonggui_4_Exp=ns=2;s=modbus.1-1#yijidiankonggui.tag57"
+    - "1-1#yijidiankonggui_4_ExpZN=ns=2;s=modbus.1-1#yijidiankonggui.tag59"
+    #缁翠慨瀹ゅ姩鍔� MaintenanceRoom
+    - "1-2#yijidiankonggui_1_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_1_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_1_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_1_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag7"
+    - "1-2#yijidiankonggui_1_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag8"
+    - "1-2#yijidiankonggui_1_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag9"
+    - "1-2#yijidiankonggui_1_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag10"
+    - "1-2#yijidiankonggui_1_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag13"
+    - "1-2#yijidiankonggui_1_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag16"
+    - "1-2#yijidiankonggui_1_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag14"
+    - "1-2#yijidiankonggui_1_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag15"
+    - "1-2#yijidiankonggui_1_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag17"
+    # 鍘熸潗鏂欎粨搴� RawMaterialWarehouse
+    - "1-2#yijidiankonggui_2_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_2_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_2_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_2_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag21"
+    - "1-2#yijidiankonggui_2_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag22"
+    - "1-2#yijidiankonggui_2_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag23"
+    - "1-2#yijidiankonggui_2_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag24"
+    - "1-2#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag27"
+    - "1-2#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag30"
+    - "1-2#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag28"
+    - "1-2#yijidiankonggui_2_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag29"
+    - "1-2#yijidiankonggui_2_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag31"
+    # 鎭掓俯瀹� ThermostaticChamber
+    - "1-2#yijidiankonggui_3_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_3_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_3_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_3_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag35"
+    - "1-2#yijidiankonggui_3_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag36"
+    - "1-2#yijidiankonggui_3_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag37"
+    - "1-2#yijidiankonggui_3_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag38"
+    - "1-2#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag41"
+    - "1-2#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag44"
+    - "1-2#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag42"
+    - "1-2#yijidiankonggui_3_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag43"
+    - "1-2#yijidiankonggui_3_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag45"
+    # 鍖呰兌闂� PackGlueRoom
+    - "1-2#yijidiankonggui_4_VoltageA=ns=2;s=modbus.1-2#yijidiankonggui.tag1"
+    - "1-2#yijidiankonggui_4_VoltageB=ns=2;s=modbus.1-2#yijidiankonggui.tag2"
+    - "1-2#yijidiankonggui_4_VoltageC=ns=2;s=modbus.1-2#yijidiankonggui.tag3"
+    - "1-2#yijidiankonggui_4_CurrentA=ns=2;s=modbus.1-2#yijidiankonggui.tag49"
+    - "1-2#yijidiankonggui_4_CurrentB=ns=2;s=modbus.1-2#yijidiankonggui.tag50"
+    - "1-2#yijidiankonggui_4_CurrentC=ns=2;s=modbus.1-2#yijidiankonggui.tag51"
+    - "1-2#yijidiankonggui_4_ActivePow=ns=2;s=modbus.1-2#yijidiankonggui.tag52"
+    - "1-2#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.1-2#yijidiankonggui.tag55"
+    - "1-2#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.1-2#yijidiankonggui.tag58"
+    - "1-2#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.1-2#yijidiankonggui.tag56"
+    - "1-2#yijidiankonggui_4_Exp=ns=2;s=modbus.1-2#yijidiankonggui.tag57"
+    - "1-2#yijidiankonggui_4_ExpZN=ns=2;s=modbus.1-2#yijidiankonggui.tag59"
+    # 宸﹁溅闂寸┖璋� leftWkshopVRVS
+    - "2-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
+    - "2-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
+    - "2-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
+    - "2-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag21"
+    - "2-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag22"
+    - "2-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag23"
+    - "2-1#yijidiankonggui_2_ActivePow=ns=2;s=modbus.2-1#yijidiankonggui.tag24"
+    - "2-1#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.2-1#yijidiankonggui.tag27"
+    - "2-1#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.2-1#yijidiankonggui.tag30"
+    - "2-1#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.2-1#yijidiankonggui.tag28"
+    - "2-1#yijidiankonggui_2_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag29"
+    - "2-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag31"
+    # 杞﹂棿鍔炲叕瀹� WorkshopOffice
+    - "2-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
+    - "2-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
+    - "2-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
+    - "2-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag35"
+    - "2-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag36"
+    - "2-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag37"
+    - "2-1#yijidiankonggui_3_ActivePow=ns=2;s=modbus.2-1#yijidiankonggui.tag38"
+    - "2-1#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.2-1#yijidiankonggui.tag41"
+    - "2-1#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.2-1#yijidiankonggui.tag44"
+    - "2-1#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.2-1#yijidiankonggui.tag42"
+    - "2-1#yijidiankonggui_3_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag43"
+    - "2-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag45"
+    # 1銆�2妤间笢鍔炲叕瀹� EastOffice
+    - "2-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.2-1#yijidiankonggui.tag1"
+    - "2-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.2-1#yijidiankonggui.tag2"
+    - "2-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.2-1#yijidiankonggui.tag3"
+    - "2-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.2-1#yijidiankonggui.tag49"
+    - "2-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.2-1#yijidiankonggui.tag50"
+    - "2-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.2-1#yijidiankonggui.tag51"
+    - "2-1#yijidiankonggui_4_ActivePow=ns=2;s=modbus.2-1#yijidiankonggui.tag52"
+    - "2-1#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.2-1#yijidiankonggui.tag55"
+    - "2-1#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.2-1#yijidiankonggui.tag58"
+    - "2-1#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.2-1#yijidiankonggui.tag56"
+    - "2-1#yijidiankonggui_4_Exp=ns=2;s=modbus.2-1#yijidiankonggui.tag57"
+    - "2-1#yijidiankonggui_4_ExpZN=ns=2;s=modbus.2-1#yijidiankonggui.tag59"
+    #鐓ф槑 Lighting
+    - "3-1#yijidiankonggui_1_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_1_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_1_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_1_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag7"
+    - "3-1#yijidiankonggui_1_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag8"
+    - "3-1#yijidiankonggui_1_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag9"
+    - "3-1#yijidiankonggui_1_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag10"
+    - "3-1#yijidiankonggui_1_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag13"
+    - "3-1#yijidiankonggui_1_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag16"
+    - "3-1#yijidiankonggui_1_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag14"
+    - "3-1#yijidiankonggui_1_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag15"
+    - "3-1#yijidiankonggui_1_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag17"
+    # 杞﹂棿2妤� SecondFloorWorkshop
+    - "3-1#yijidiankonggui_2_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_2_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_2_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_2_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag21"
+    - "3-1#yijidiankonggui_2_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag22"
+    - "3-1#yijidiankonggui_2_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag23"
+    - "3-1#yijidiankonggui_2_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag24"
+    - "3-1#yijidiankonggui_2_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag27"
+    - "3-1#yijidiankonggui_2_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag30"
+    - "3-1#yijidiankonggui_2_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag28"
+    - "3-1#yijidiankonggui_2_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag29"
+    - "3-1#yijidiankonggui_2_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag31"
+    # 鐢熶骇鍔炲叕瀹� ProductionOffice
+    - "3-1#yijidiankonggui_3_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_3_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_3_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_3_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag35"
+    - "3-1#yijidiankonggui_3_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag36"
+    - "3-1#yijidiankonggui_3_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag37"
+    - "3-1#yijidiankonggui_3_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag38"
+    - "3-1#yijidiankonggui_3_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag41"
+    - "3-1#yijidiankonggui_3_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag44"
+    - "3-1#yijidiankonggui_3_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag42"
+    - "3-1#yijidiankonggui_3_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag43"
+    - "3-1#yijidiankonggui_3_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag45"
+    # 楂樹綆娓╄瘯楠屽尯 HLTempTest
+    - "3-1#yijidiankonggui_4_VoltageA=ns=2;s=modbus.3-1#yijidiankonggui.tag1"
+    - "3-1#yijidiankonggui_4_VoltageB=ns=2;s=modbus.3-1#yijidiankonggui.tag2"
+    - "3-1#yijidiankonggui_4_VoltageC=ns=2;s=modbus.3-1#yijidiankonggui.tag3"
+    - "3-1#yijidiankonggui_4_CurrentA=ns=2;s=modbus.3-1#yijidiankonggui.tag49"
+    - "3-1#yijidiankonggui_4_CurrentB=ns=2;s=modbus.3-1#yijidiankonggui.tag50"
+    - "3-1#yijidiankonggui_4_CurrentC=ns=2;s=modbus.3-1#yijidiankonggui.tag51"
+    - "3-1#yijidiankonggui_4_ActivePow=ns=2;s=modbus.3-1#yijidiankonggui.tag52"
+    - "3-1#yijidiankonggui_4_PowFactorT=ns=2;s=modbus.3-1#yijidiankonggui.tag55"
+    - "3-1#yijidiankonggui_4_ActiveZN=ns=2;s=modbus.3-1#yijidiankonggui.tag58"
+    - "3-1#yijidiankonggui_4_ActiveZT=ns=2;s=modbus.3-1#yijidiankonggui.tag56"
+    - "3-1#yijidiankonggui_4_Exp=ns=2;s=modbus.3-1#yijidiankonggui.tag57"
+    - "3-1#yijidiankonggui_4_ExpZN=ns=2;s=modbus.3-1#yijidiankonggui.tag59"
+    # 鎴愬搧浠撳簱娓╂箍搴� chengpincangku
+    - "chengpincangku_WD=ns=2;s=_AdvancedTags.cpk_wd"
+    - "chengpincangku_SD=ns=2;s=_AdvancedTags.cpk_sd"
+    # 鐢熶骇杞﹂棿 shengchanchejian
+    - "shengchanchejian_WD=ns=2;s=_AdvancedTags.sccj_wd"
+    - "shengchanchejian_SD=ns=2;s=_AdvancedTags.sccj_sd"
+    # 鍘熸枡浠撳簱 yuliaocangku
+    - "yuliaocangku_WD=ns=2;s=_AdvancedTags.ylk_wd"
+    - "yuliaocangku_SD=ns=2;s=_AdvancedTags.ylk_sd"
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 50a8bde..33575d5 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,3 +1,7 @@
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 8089
 spring:
   profiles:
     active: dev

--
Gitblit v1.9.3