Parcourir la source

实现设备和采集标签过滤

欧阳劲驰 il y a 2 semaines
Parent
commit
a4348619b6
19 fichiers modifiés avec 209 ajouts et 51 suppressions
  1. 1 1
      custom-gateway-app/src/main/resources/application-zhscada.yml
  2. 2 2
      custom-gateway-app/src/main/resources/application-zydma.yml
  3. 3 2
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/DeviceIdGenerator.java
  4. 38 6
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/DeviceRegistry.java
  5. 4 2
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/DeviceConfig.java
  6. 4 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/Device.java
  7. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/po/DeviceTags.java
  8. 0 14
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/CallingProperties.java
  9. 3 3
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/repository/embedded/DeviceTagsRepository.java
  10. 9 2
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/DeviceTagsService.java
  11. 16 5
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/impl/DeviceTagsServiceImpl.java
  12. 2 6
      custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/components/DataCollector.java
  13. 1 1
      custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/constants/ScadaPlatformMetadata.java
  14. 3 3
      custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/domain/ScadaPlatformVariables.java
  15. 2 1
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/DataCollector.java
  16. 1 1
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/IotPlatformMetadata.java
  17. 1 1
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/MiddlePlatformMetadata.java
  18. BIN
      data.mv.db
  19. 118 0
      dev_zydma.yml

+ 1 - 1
custom-gateway-app/src/main/resources/application-zhscada.yml

@@ -2,5 +2,5 @@
 calling:
   #对接点
   endpoints:
-    scada-platform:
+    zhonghuan-scada:
       url: http://119.96.174.191:9434

+ 2 - 2
custom-gateway-app/src/main/resources/application-zydma.yml

@@ -2,11 +2,11 @@
 calling:
   #对接点
   endpoints:
-    middle-platform:
+    zaoyang-middle:
       url: http://223.75.194.87:8200/PandaCore/GCK
       access-key: lousunkongzhi
       secret-key: g+4UWJ6360SxDVu+9BRRQfOg0/tT+33o3S8Q5APMLIn+JQirprtdGd0cf5Y3WO7iiKo24T5mN1U697zHp/iGNA==
-    iot-platform:
+    zaoyang-iot:
       url: http://223.75.194.87:8200/pdserver
       access-key: Data
       secret-key: panda666.

+ 3 - 2
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/DeviceIdGenerator.java

@@ -44,16 +44,17 @@ public class DeviceIdGenerator {
      *
      * @param areaCode 区号
      * @param kind     种类
+     * @param platform 所属平台
      * @param sn       远传设备id
      * @param name     设备名称
      * @return 设备
      */
-    public synchronized Device generateDevice(AreaCode areaCode, DeviceKind kind, List<DeviceTag> fields
+    public synchronized Device generateDevice(AreaCode areaCode, DeviceKind kind, String platform, List<DeviceTag> fields
             , String sn, String name) {
         if (areaCode == null || kind == null || StringUtils.isAnyBlank(sn, name)) return null;
 
         //构建设备
-        return new Device(generateDeviceId(areaCode, kind), name, sn, kind.getKey(), null, LocalDateTime.now(), fields);
+        return new Device(generateDeviceId(areaCode, kind), name, sn, kind.getKey(), platform, null, LocalDateTime.now(), fields);
     }
 
     /**

+ 38 - 6
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/components/DeviceRegistry.java

@@ -11,7 +11,9 @@ import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
 import com.shkpr.service.customgateway.core.domain.Device;
 import com.shkpr.service.customgateway.core.domain.DeviceExcel;
 import com.shkpr.service.customgateway.core.domain.DeviceTag;
+import com.shkpr.service.customgateway.core.service.DeviceTagsService;
 import com.shkpr.service.customgateway.core.utils.ExcelUtil;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -45,6 +47,10 @@ public class DeviceRegistry {
      */
     private final File configFile;
     /**
+     * 标签服务
+     */
+    private final DeviceTagsService tagsService;
+    /**
      * 设备列表
      */
     private List<Device> devices;
@@ -52,6 +58,7 @@ public class DeviceRegistry {
     public DeviceRegistry(Builder builder) {
         this.yamlMapper = builder.yamlMapper;
         this.configFile = builder.configFile;
+        this.tagsService = builder.tagsService;
         this.devices = new ArrayList<>();
         if (builder.autoLoad) this.loadDevices();
     }
@@ -141,8 +148,20 @@ public class DeviceRegistry {
      *
      * @return 设备列表
      */
-    public List<Device> findAll() {
-        return new ArrayList<>(devices);
+    public List<Device> findAll(String platform) {
+        //采集标签
+        List<String> tags = tagsService.findAll(platform);
+        //返回过滤的设备
+        return new ArrayList<>(devices).stream()
+                //过滤平台
+                .filter(device -> device != null && Objects.equals(device.getPlatform(), platform))
+                //过滤采集标签
+                .peek(device -> device.setTags(
+                        device.getTags().stream()
+                                .filter(tag -> tags.contains(tag.getTag()))
+                                .collect(Collectors.toList())))
+                .filter(device -> CollectionUtils.isNotEmpty(device.getTags()))
+                .collect(Collectors.toList());
     }
 
 
@@ -329,6 +348,10 @@ public class DeviceRegistry {
          */
         private File configFile;
         /**
+         * 标签服务
+         */
+        private DeviceTagsService tagsService;
+        /**
          * 自动加载配置文件
          */
         private Boolean autoLoad = true;
@@ -341,6 +364,14 @@ public class DeviceRegistry {
         }
 
         /**
+         * object映射
+         */
+        public Builder yamlMapper(ObjectMapper yamlMapper) {
+            this.yamlMapper = yamlMapper;
+            return this;
+        }
+
+        /**
          * 配置文件路径
          */
         public Builder configFile(String configPath) {
@@ -357,10 +388,10 @@ public class DeviceRegistry {
         }
 
         /**
-         * object映射
+         * 标签服务
          */
-        public Builder yamlMapper(ObjectMapper yamlMapper) {
-            this.yamlMapper = yamlMapper;
+        public Builder tagsService(DeviceTagsService tagsService) {
+            this.tagsService = tagsService;
             return this;
         }
 
@@ -377,8 +408,9 @@ public class DeviceRegistry {
          */
         public DeviceRegistry build() {
             // 参数验证
-            if (configFile == null) throw new IllegalStateException("配置文件路径不能为空");
             if (yamlMapper == null) throw new IllegalStateException("YAML Mapper 不能为空");
+            if (configFile == null) throw new IllegalStateException("配置文件路径不能为空");
+            if (tagsService == null) throw new IllegalStateException("采集标签服务不能为空");
             if (autoLoad == null) autoLoad = true;
 
             //文件验证

+ 4 - 2
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/config/DeviceConfig.java

@@ -6,6 +6,7 @@ import com.shkpr.service.customgateway.core.components.DeviceIdGenerator;
 import com.shkpr.service.customgateway.core.components.DeviceRegistry;
 import com.shkpr.service.customgateway.core.properties.DeviceProperties;
 import com.shkpr.service.customgateway.core.service.DeviceSequencesService;
+import com.shkpr.service.customgateway.core.service.DeviceTagsService;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -23,10 +24,11 @@ public class DeviceConfig {
      * @return 设备注册器
      */
     @Bean
-    public DeviceRegistry deviceRegistry(DeviceProperties properties) {
+    public DeviceRegistry deviceRegistry(DeviceProperties properties, DeviceTagsService tagsService) {
         return DeviceRegistry.builder()
-                .configFile(properties.getMapPath())
                 .yamlMapper(new ObjectMapper(new YAMLFactory()))
+                .configFile(properties.getMapPath())
+                .tagsService(tagsService)
                 .autoLoad(true)
                 .build();
     }

+ 4 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/Device.java

@@ -42,6 +42,10 @@ public class Device {
      */
     private String deviceKind;
     /**
+     * 所属平台
+     */
+    private String platform;
+    /**
      * 设备厂家
      */
     private String mfrs;

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/po/DeviceTags.java

@@ -25,7 +25,7 @@ public class DeviceTags {
     /**
      * 所属平台
      */
-    private String platformName;
+    private String platform;
     /**
      * 标签
      */

+ 0 - 14
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/properties/CallingProperties.java

@@ -3,12 +3,10 @@ package com.shkpr.service.customgateway.core.properties;
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.commons.text.CaseUtils;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 import java.time.Duration;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 对接属性
@@ -34,18 +32,6 @@ public class CallingProperties {
     private Map<String, CallingEndpoint> endpoints;
 
     /**
-     * @return 对接点配置
-     */
-    public Map<String, CallingEndpoint> getEndpoints() {
-        return this.endpoints.entrySet().stream()
-                .collect(Collectors.toMap(entry ->
-                                CaseUtils.toCamelCase(entry.getKey(), false, '-'),
-                        Map.Entry::getValue
-                ));
-    }
-
-
-    /**
      * 对接点
      */
     @Data

+ 3 - 3
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/repository/embedded/DeviceTagsRepository.java

@@ -13,10 +13,10 @@ import java.util.List;
  */
 public interface DeviceTagsRepository extends PagingAndSortingRepository<DeviceTags, Long> {
     /**
-     * 根据平台名称查询
+     * 根据平台查询
      *
-     * @param platformName 平台名称
+     * @param platform 平台
      * @return 实体集合
      */
-    List<DeviceTags> findByPlatformName(String platformName);
+    List<DeviceTags> findByPlatform(String platform);
 }

+ 9 - 2
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/DeviceTagsService.java

@@ -11,13 +11,20 @@ import java.util.List;
  * @since 1.0.0
  */
 public interface DeviceTagsService {
+    /**
+     * 查询采集标签
+     *
+     * @param platform 平台
+     * @return 采集标签
+     */
+    List<String> findAll(String platform);
 
     /**
      * 同步采集标签
      *
-     * @param platformName 平台名称
+     * @param platform 平台
      * @param tags         标签集合
      * @return 同步状态
      */
-    Boolean syncDeviceTags(String platformName, List<DeviceTags> tags);
+    Boolean syncDeviceTags(String platform, List<DeviceTags> tags);
 }

+ 16 - 5
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/service/impl/DeviceTagsServiceImpl.java

@@ -31,27 +31,38 @@ public class DeviceTagsServiceImpl implements DeviceTagsService {
     }
 
     /**
+     * 查询采集标签
+     *
+     * @param platform 平台
+     * @return 采集标签
+     */
+    @Override
+    public List<String> findAll(String platform) {
+        return repository.findByPlatform(platform).stream().map(DeviceTags::getTag).collect(Collectors.toList());
+    }
+
+    /**
      * 同步采集标签
      *
-     * @param platformName 平台名称
+     * @param platform 平台
      * @param deviceTags   标签集合
      * @return 同步状态
      */
     @Override
     @Transactional(DataSourceNames.EMBEDDED + "TransactionManager")
-    public Boolean syncDeviceTags(String platformName, List<DeviceTags> deviceTags) {
+    public Boolean syncDeviceTags(String platform, List<DeviceTags> deviceTags) {
         //参数校验
-        if (StringUtils.isEmpty(platformName)) return false;
+        if (StringUtils.isEmpty(platform)) return false;
 
         //异常数据处理
         if (deviceTags == null) deviceTags = Collections.emptyList();
         deviceTags = deviceTags.stream()
                 .filter(Objects::nonNull)
-                .filter(deviceTag -> Objects.equals(platformName, deviceTag.getPlatformName()))
+                .filter(deviceTag -> Objects.equals(platform, deviceTag.getPlatform()))
                 .collect(Collectors.toList());
 
         //获取已存在的标签集合
-        List<DeviceTags> existingDeviceTags = repository.findByPlatformName(platformName);
+        List<DeviceTags> existingDeviceTags = repository.findByPlatform(platform);
 
         //标签
         Set<String> tags = deviceTags.stream()

+ 2 - 6
custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/components/DataCollector.java

@@ -3,7 +3,6 @@ package com.shkpr.service.customgateway.zhscada.components;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
-import com.shkpr.service.customgateway.core.components.DeviceIdGenerator;
 import com.shkpr.service.customgateway.core.components.DeviceRegistry;
 import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
 import com.shkpr.service.customgateway.core.domain.Device;
@@ -41,16 +40,13 @@ public class DataCollector {
     final
     DeviceRegistry deviceRegistry;
     final
-    DeviceIdGenerator deviceIdGenerator;
-    final
     InfluxDbUtil influxDbUtil;
     final
     CallingUtil callingUtil;
 
-    public DataCollector(CallingProperties callingProperties, DeviceRegistry deviceRegistry, DeviceIdGenerator deviceIdGenerator, InfluxDbUtil influxDbUtil, CallingUtil callingUtil) {
+    public DataCollector(CallingProperties callingProperties, DeviceRegistry deviceRegistry, InfluxDbUtil influxDbUtil, CallingUtil callingUtil) {
         this.callingProperties = callingProperties;
         this.deviceRegistry = deviceRegistry;
-        this.deviceIdGenerator = deviceIdGenerator;
         this.influxDbUtil = influxDbUtil;
         this.callingUtil = callingUtil;
     }
@@ -69,7 +65,7 @@ public class DataCollector {
         String url = endpoint.getUrl() + ScadaPlatformMetadata.Uri.REAL_TIME_DATA;
 
         //设备
-        List<Device> devices = deviceRegistry.findAll();
+        List<Device> devices = deviceRegistry.findAll(ScadaPlatformMetadata.NAME);
 
         //参数
         Map<String, Object> params = ScadaPlatformMetadata.getRealTimeDataParams(devices);

+ 1 - 1
custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/constants/ScadaPlatformMetadata.java

@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
  */
 public abstract class ScadaPlatformMetadata {
     //系统名称
-    public static String NAME = "scadaPlatform";
+    public static String NAME = "zhonghuan-scada";
 
     /**
      * 获取实时数据参数

+ 3 - 3
custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/domain/ScadaPlatformVariables.java

@@ -31,10 +31,10 @@ public class ScadaPlatformVariables {
     /**
      * 转设备标签
      *
-     * @param platformName 平台名称
+     * @param platform 平台
      * @return 设备标签
      */
-    public DeviceTags toDeviceTags(String platformName) {
-        return new DeviceTags(null, platformName, n);
+    public DeviceTags toDeviceTags(String platform) {
+        return new DeviceTags(null, platform, n);
     }
 }

+ 2 - 1
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/DataCollector.java

@@ -127,7 +127,7 @@ public class DataCollector {
             updateDevices(deviceMapping, snGroup);
 
             //设备列表
-            List<Device> devices = deviceRegistry.findAll();
+            List<Device> devices = deviceRegistry.findAll(IotPlatformMetadata.NAME);
             //===================按设备遍历===================
             for (Device device : devices) {
                 if (!snGroup.containsKey(device.getDeviceSn())) continue;
@@ -186,6 +186,7 @@ public class DataCollector {
                 .map(sn -> deviceIdGenerator.generateDevice(
                         IotPlatformMetadata.Devices.AREA_CODE,
                         deviceMapping.getKind(),
+                        IotPlatformMetadata.NAME,
                         buildTag(deviceMapping, snGroup.get(sn)),
                         sn, snGroup.get(sn).get(0).getName()
                 ))

+ 1 - 1
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/IotPlatformMetadata.java

@@ -33,7 +33,7 @@ public abstract class IotPlatformMetadata {
     private static final ObjectMapper objectMapper = new ObjectMapper();
 
     //系统名称
-    public static String NAME = "iotPlatform";
+    public static String NAME = "zaoyang-iot";
 
     /**
      * 获取密钥

+ 1 - 1
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/MiddlePlatformMetadata.java

@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
  */
 public abstract class MiddlePlatformMetadata extends IntegrationMetadata {
     //系统名称
-    public static String NAME = "middlePlatform";
+    public static String NAME = "zaoyang-middle";
 
     /**
      * 获取密钥

BIN
data.mv.db


+ 118 - 0
dev_zydma.yml

@@ -3,6 +3,7 @@
   deviceName: "内衣厂流量仪"
   deviceSn: "SB00000015"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -46,6 +47,7 @@
   deviceName: "统建楼流量仪"
   deviceSn: "SB00000014"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -89,6 +91,7 @@
   deviceName: "福田小区流量仪"
   deviceSn: "SB00000013"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -132,6 +135,7 @@
   deviceName: "麻纺厂家属院"
   deviceSn: "SB00000012"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -175,6 +179,7 @@
   deviceName: "52#南阳路老通达北侧"
   deviceSn: "SB00000019"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -218,6 +223,7 @@
   deviceName: "2502001010"
   deviceSn: "SB00000017"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -261,6 +267,7 @@
   deviceName: "万通地税局流量仪"
   deviceSn: "SB00000016"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -304,6 +311,7 @@
   deviceName: "炮团路口流量计"
   deviceSn: "SB00000095"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -347,6 +355,7 @@
   deviceName: "园林路流量计"
   deviceSn: "SB00000094"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -390,6 +399,7 @@
   deviceName: "万通路北线300考核表"
   deviceSn: "SB00000093"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -433,6 +443,7 @@
   deviceName: "万通路南线200考核表"
   deviceSn: "SB00000092"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -476,6 +487,7 @@
   deviceName: "天立公寓考核表"
   deviceSn: "SB00000099"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -519,6 +531,7 @@
   deviceName: "万通福瑞巷"
   deviceSn: "SB00000011"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -562,6 +575,7 @@
   deviceName: "2503000368"
   deviceSn: "SB00000098"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -605,6 +619,7 @@
   deviceName: "福瑞龙联小区"
   deviceSn: "SB00000010"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -648,6 +663,7 @@
   deviceName: "梁集路口400考核表"
   deviceSn: "SB00000097"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -691,6 +707,7 @@
   deviceName: "2412001138"
   deviceSn: "SB00000096"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -734,6 +751,7 @@
   deviceName: "车站路与和谐路交叉口东南角流量计"
   deviceSn: "SB00000091"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -777,6 +795,7 @@
   deviceName: "2412000654"
   deviceSn: "SB00000090"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -820,6 +839,7 @@
   deviceName: "龙联小区巷口"
   deviceSn: "SB00000009"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -863,6 +883,7 @@
   deviceName: "280#人民路与和谐路交汇处东北角向东"
   deviceSn: "SB00000125"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -906,6 +927,7 @@
   deviceName: "史岗一组南城检查室考核表"
   deviceSn: "SB00000004"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -949,6 +971,7 @@
   deviceName: "304#中兴大道港利制冷南侧管道过路处"
   deviceSn: "SB00000124"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -992,6 +1015,7 @@
   deviceName: "金色家园流量计"
   deviceSn: "SB00000003"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1035,6 +1059,7 @@
   deviceName: "289#复兴大道与人民路交汇处东南角南侧"
   deviceSn: "SB00000123"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1078,6 +1103,7 @@
   deviceName: "2412000400"
   deviceSn: "SB00000002"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1121,6 +1147,7 @@
   deviceName: "262#发展大道与雨润路交汇处北侧"
   deviceSn: "SB00000122"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1164,6 +1191,7 @@
   deviceName: "锦峰家园对面400流量计"
   deviceSn: "SB00000089"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1207,6 +1235,7 @@
   deviceName: "南城棉花站"
   deviceSn: "SB00000001"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1250,6 +1279,7 @@
   deviceName: "兴隆路霍庄六组流量仪"
   deviceSn: "SB00000008"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1293,6 +1323,7 @@
   deviceName: "410100012"
   deviceSn: "SB00000128"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1336,6 +1367,7 @@
   deviceName: "和谐花苑流量考核表"
   deviceSn: "SB00000007"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1379,6 +1411,7 @@
   deviceName: "史肯岗一组炮团路口考核表"
   deviceSn: "SB00000006"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1422,6 +1455,7 @@
   deviceName: "279#人民路与和谐路交汇处西北角"
   deviceSn: "SB00000126"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1465,6 +1499,7 @@
   deviceName: "诗漫特考核表"
   deviceSn: "SB00000005"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1508,6 +1543,7 @@
   deviceName: "19#民族路慧星名苑B区门口"
   deviceSn: "SB00000084"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1551,6 +1587,7 @@
   deviceName: "105#西环二路南侧靠路东"
   deviceSn: "SB00000083"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1594,6 +1631,7 @@
   deviceName: "38#新华路重山寺路口对面"
   deviceSn: "SB00000082"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1637,6 +1675,7 @@
   deviceName: "153#襄阳东路玫瑰社区三期西南角院墙外"
   deviceSn: "SB00000081"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1680,6 +1719,7 @@
   deviceName: "261#人民路与发展大道交汇处东南角东侧"
   deviceSn: "SB00000121"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1723,6 +1763,7 @@
   deviceName: "298#史岗四组东庄路口"
   deviceSn: "SB00000088"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1766,6 +1807,7 @@
   deviceName: "306#中心大道与车站路交汇处正邦饲料公司南侧路口"
   deviceSn: "SB00000120"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1809,6 +1851,7 @@
   deviceName: "277#和谐路与史岗六组路口交汇处向东"
   deviceSn: "SB00000086"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1852,6 +1895,7 @@
   deviceName: "61#西环三路教师村枣阳市第四幼儿园对面"
   deviceSn: "SB00000085"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1895,6 +1939,7 @@
   deviceName: "283#复兴大道与复兴大道东路交差路口"
   deviceSn: "SB00000080"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1938,6 +1983,7 @@
   deviceName: "284#复兴大道东路丹阳工业园十字路口东北角"
   deviceSn: "SB00000119"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -1981,6 +2027,7 @@
   deviceName: "138#中兴大道恒大世纪城入口对面"
   deviceSn: "SB00000113"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2024,6 +2071,7 @@
   deviceName: "35#寺沙路与新华路交汇处东南角"
   deviceSn: "SB00000112"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2067,6 +2115,7 @@
   deviceName: "56#前进路与西环四路交汇处路北"
   deviceSn: "SB00000111"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2110,6 +2159,7 @@
   deviceName: "144#书院街八里立康医院东路口对面"
   deviceSn: "SB00000078"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2153,6 +2203,7 @@
   deviceName: "259#发展大道与中兴大道交汇处西北角北侧"
   deviceSn: "SB00000118"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2196,6 +2247,7 @@
   deviceName: "25#民族北路一水厂对面"
   deviceSn: "SB00000117"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2239,6 +2291,7 @@
   deviceName: "30#中兴大道湖北山禾锦建设有限公司路口"
   deviceSn: "SB00000115"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2282,6 +2335,7 @@
   deviceName: "67#前进路人民法庭对面"
   deviceSn: "SB00000073"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2325,6 +2379,7 @@
   deviceName: "200#汉城大道枣阳市龙门学校路口"
   deviceSn: "SB00000072"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2368,6 +2423,7 @@
   deviceName: "142#前进路与西环四路交汇处路北"
   deviceSn: "SB00000071"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2411,6 +2467,7 @@
   deviceName: "68#前进路冷水沟桥"
   deviceSn: "SB00000070"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2454,6 +2511,7 @@
   deviceName: "137#中兴大道住房公积金办事处路口对面"
   deviceSn: "SB00000110"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2497,6 +2555,7 @@
   deviceName: "15#防疫站对面"
   deviceSn: "SB00000077"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2540,6 +2599,7 @@
   deviceName: "41#新华路惠民小区门口"
   deviceSn: "SB00000076"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2583,6 +2643,7 @@
   deviceName: "69#前进路四海巷北侧"
   deviceSn: "SB00000075"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2626,6 +2687,7 @@
   deviceName: "34#寺沙路与新华路交汇处东北角"
   deviceSn: "SB00000074"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2669,6 +2731,7 @@
   deviceName: "腾龙驾校北流量计"
   deviceSn: "SB00000109"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2712,6 +2775,7 @@
   deviceName: "2412001029"
   deviceSn: "SB00000108"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2755,6 +2819,7 @@
   deviceName: "发展大道与车站路交叉西北角流量计"
   deviceSn: "SB00000103"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2798,6 +2863,7 @@
   deviceName: "发展大道与车站路交叉口东北角流量计"
   deviceSn: "SB00000102"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2841,6 +2907,7 @@
   deviceName: "139#中兴大道加气站路口对面"
   deviceSn: "SB00000069"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2884,6 +2951,7 @@
   deviceName: "中医院门口流量计"
   deviceSn: "SB00000101"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2927,6 +2995,7 @@
   deviceName: "294#光武大道车站中学西路口"
   deviceSn: "SB00000068"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -2970,6 +3039,7 @@
   deviceName: "二色路口考核表"
   deviceSn: "SB00000100"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3013,6 +3083,7 @@
   deviceName: "43#寺沙路与兴阳路交汇处(反家暴中心路口)"
   deviceSn: "SB00000067"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3056,6 +3127,7 @@
   deviceName: "和谐花苑向南200米流量计"
   deviceSn: "SB00000107"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3099,6 +3171,7 @@
   deviceName: "梁集路口300考核表"
   deviceSn: "SB00000106"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3142,6 +3215,7 @@
   deviceName: "复烤厂门口流量计"
   deviceSn: "SB00000105"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3185,6 +3259,7 @@
   deviceName: "南城财政所流量计"
   deviceSn: "SB00000104"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3228,6 +3303,7 @@
   deviceName: "147#八里五组路口"
   deviceSn: "SB00000061"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3271,6 +3347,7 @@
   deviceName: "36#寺沙路与新华路交汇处向北兴旺家园路口"
   deviceSn: "SB00000066"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3314,6 +3391,7 @@
   deviceName: "33#阳光路长江1号鄂西北运营中心路口"
   deviceSn: "SB00000065"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3357,6 +3435,7 @@
   deviceName: "3#民族西路茶棚七组路口"
   deviceSn: "SB00000064"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3400,6 +3479,7 @@
   deviceName: "307#中兴大道二郎村村委会路口"
   deviceSn: "SB00000063"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3443,6 +3523,7 @@
   deviceName: "296#火车站路口工商银行南侧"
   deviceSn: "SB00000059"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3486,6 +3567,7 @@
   deviceName: "7#民族西路与西环二路交汇处东北角"
   deviceSn: "SB00000058"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3529,6 +3611,7 @@
   deviceName: "1#神驰路与316老国道交汇处 东侧路"
   deviceSn: "SB00000057"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3572,6 +3655,7 @@
   deviceName: "252#兴隆创业一路路口"
   deviceSn: "SB00000056"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3615,6 +3699,7 @@
   deviceName: "263#发展大道金牛山小区南侧"
   deviceSn: "SB00000051"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3658,6 +3743,7 @@
   deviceName: "16#民族路枣阳市疾控中心对面路口"
   deviceSn: "SB00000050"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3701,6 +3787,7 @@
   deviceName: "295#火车站路口工商银行南侧管道过路处"
   deviceSn: "SB00000055"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3744,6 +3831,7 @@
   deviceName: "26#民族北路聚福苑小区路口对面"
   deviceSn: "SB00000054"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3787,6 +3875,7 @@
   deviceName: "151#襄阳东路玫瑰社区一期南门东侧"
   deviceSn: "SB00000053"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3830,6 +3919,7 @@
   deviceName: "282#中兴大道玉龙印刷厂路口对面"
   deviceSn: "SB00000052"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3873,6 +3963,7 @@
   deviceName: "142#书院街第八中学对面东侧路口"
   deviceSn: "SB00000047"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3916,6 +4007,7 @@
   deviceName: "264#西环一路石羊池路路口"
   deviceSn: "SB00000046"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -3959,6 +4051,7 @@
   deviceName: "107#襄阳路钱庄西路口"
   deviceSn: "SB00000045"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4002,6 +4095,7 @@
   deviceName: "111#西环三路环岛南侧"
   deviceSn: "SB00000049"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4045,6 +4139,7 @@
   deviceName: "18#民族路(贾不了烟酒门口)"
   deviceSn: "SB00000040"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4088,6 +4183,7 @@
   deviceName: "49#南阳路家宴食府西侧"
   deviceSn: "SB00000044"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4131,6 +4227,7 @@
   deviceName: "21#民族北路大生家常菜门口"
   deviceSn: "SB00000043"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4174,6 +4271,7 @@
   deviceName: "47#新华路与书院西街交汇处西南角"
   deviceSn: "SB00000042"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4217,6 +4315,7 @@
   deviceName: "22#民族路师范幼儿园路口"
   deviceSn: "SB00000041"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4260,6 +4359,7 @@
   deviceName: "247#新华路与中兴大道交汇处中国石油对面"
   deviceSn: "SB00000037"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4303,6 +4403,7 @@
   deviceName: "8#民族西路金阳大酒店对面"
   deviceSn: "SB00000036"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4346,6 +4447,7 @@
   deviceName: "109#襄阳路兴中棉纺门口"
   deviceSn: "SB00000035"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4389,6 +4491,7 @@
   deviceName: "57#前进路与西环四路交汇处路南"
   deviceSn: "SB00000034"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4432,6 +4535,7 @@
   deviceName: "2#神驰路与316老国道交汇处东侧路口向北150米 茶棚安置小区门口"
   deviceSn: "SB00000039"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4475,6 +4579,7 @@
   deviceName: "40#新华路建材大市厂西路口"
   deviceSn: "SB00000038"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4518,6 +4623,7 @@
   deviceName: "39#新华路与兴阳路交汇处"
   deviceSn: "SB00000033"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4561,6 +4667,7 @@
   deviceName: "9#民族西路骨科医院对面"
   deviceSn: "SB00000032"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4604,6 +4711,7 @@
   deviceName: "Z1民族北路便民市场路口"
   deviceSn: "SB00000031"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:44"
   tags:
@@ -4647,6 +4755,7 @@
   deviceName: "58#前进路开发区医院西侧"
   deviceSn: "SB00000030"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4690,6 +4799,7 @@
   deviceName: "106#襄阳路金兰巷南路口"
   deviceSn: "SB00000026"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4733,6 +4843,7 @@
   deviceName: "23#民族路申联购物广场门口"
   deviceSn: "SB00000025"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4776,6 +4887,7 @@
   deviceName: "Z2民族路师范高中公交站"
   deviceSn: "SB00000024"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4819,6 +4931,7 @@
   deviceName: "53#南阳路广源小区路口"
   deviceSn: "SB00000023"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4862,6 +4975,7 @@
   deviceName: "48#新华路三中操场对面健康巷路口"
   deviceSn: "SB00000029"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4905,6 +5019,7 @@
   deviceName: "253#发展大道张湾一组路口"
   deviceSn: "SB00000027"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4948,6 +5063,7 @@
   deviceName: "14#北关街北入口(民族路与北关街交汇处)"
   deviceSn: "SB00000022"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -4991,6 +5107,7 @@
   deviceName: "299#史岗四组西庄路口"
   deviceSn: "SB00000021"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags:
@@ -5034,6 +5151,7 @@
   deviceName: "148#襄阳东路侯集一组路口西"
   deviceSn: "SB00000020"
   deviceKind: "flow"
+  platform: "zaoyang-iot"
   mfrs: "锐铼"
   createTime: "2025-11-06 17:45:45"
   tags: