From e9630d60e5b8c12e6db4a7f2679eb165ded23110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Fri, 16 Jan 2026 10:23:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9IOT=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=AE=9A=E6=97=B6=E5=99=A8=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=98=AF=E5=90=A6=E5=8F=AF=E4=BB=A5=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=88=B0=E8=AE=BE=E5=A4=87=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/TuohengDeviceApplication.java | 2 + .../domain/impl/ThingsBoardDomainImpl.java | 63 +++++++++++++++++-- .../model/thingsboard/RestClientManager.java | 29 ++++----- .../{ => constants}/DeviceAttributes.java | 4 +- .../{ => constants}/DeviceTelemetry.java | 4 +- 5 files changed, 77 insertions(+), 25 deletions(-) rename src/main/java/com/ruoyi/device/domain/model/thingsboard/{ => constants}/DeviceAttributes.java (95%) rename src/main/java/com/ruoyi/device/domain/model/thingsboard/{ => constants}/DeviceTelemetry.java (93%) diff --git a/src/main/java/com/ruoyi/device/TuohengDeviceApplication.java b/src/main/java/com/ruoyi/device/TuohengDeviceApplication.java index 7d293f9..5722b39 100644 --- a/src/main/java/com/ruoyi/device/TuohengDeviceApplication.java +++ b/src/main/java/com/ruoyi/device/TuohengDeviceApplication.java @@ -2,6 +2,7 @@ package com.ruoyi.device; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; import com.ruoyi.common.security.annotation.EnableCustomConfig; import com.ruoyi.common.security.annotation.EnableRyFeignClients; @@ -10,6 +11,7 @@ import com.ruoyi.common.security.annotation.EnableRyFeignClients; * * @author ruoyi */ +@EnableScheduling @EnableCustomConfig @EnableRyFeignClients @SpringBootApplication diff --git a/src/main/java/com/ruoyi/device/domain/impl/ThingsBoardDomainImpl.java b/src/main/java/com/ruoyi/device/domain/impl/ThingsBoardDomainImpl.java index f8e32d0..25458a3 100644 --- a/src/main/java/com/ruoyi/device/domain/impl/ThingsBoardDomainImpl.java +++ b/src/main/java/com/ruoyi/device/domain/impl/ThingsBoardDomainImpl.java @@ -3,30 +3,41 @@ package com.ruoyi.device.domain.impl; import com.ruoyi.device.domain.api.IThingsBoardDomain; import com.ruoyi.device.domain.model.thingsboard.*; +import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; import org.thingsboard.rest.client.RestClient; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import java.util.List; +import java.util.Optional; import java.util.UUID; /** * ThingsBoard设备服务实现类 */ +@Component public class ThingsBoardDomainImpl implements IThingsBoardDomain { + + + private static final Logger log = LoggerFactory.getLogger(ThingsBoardDomainImpl.class); private final RestClient client; private final int pageSize; - public ThingsBoardDomainImpl(RestClientManager clientManager) { - this(clientManager, 10); - } - - public ThingsBoardDomainImpl(RestClientManager clientManager, int pageSize) { + /** + * 构造函数 - Spring 会自动装配 + * @param clientManager RestClient 管理器 + * @param pageSize 分页大小,从配置文件读取,默认值为 10 + */ + public ThingsBoardDomainImpl(RestClientManager clientManager, + @Value("${thingsboard.page-size:10}") int pageSize) { this.client = clientManager.getClient(); this.pageSize = pageSize; } @@ -146,4 +157,46 @@ public class ThingsBoardDomainImpl implements IThingsBoardDomain { log.warn("解析遥测数据失败: key={}, value={}, error={}", keyName, value, e.getMessage()); } } + + /** + * 定时任务:每隔1分钟打印所有设备信息 + * 执行时间:每分钟的第0秒执行 + */ + @Scheduled(cron = "0 * * * * ?") + public void printAllDevicesScheduled() { + try { + log.info("========== 开始执行定时任务:打印所有设备信息 =========="); + + Iterable> allDevices = getAllDevices(); + int totalCount = 0; + + for (List deviceBatch : allDevices) { + for (DeviceInfo device : deviceBatch) { + // 获取设备属性以获取活跃状态 + Boolean activeStatus = false; + try { + AttributeMap attributes = getDeviceAttributes(device.getId()); + // 尝试从 AttributeMap 中获取 active 属性 + Optional active = attributes.get(DeviceAttributes.ACTIVE); + if (active.isPresent()) { + activeStatus = active.get(); + } + } catch (Exception e) { + log.debug("获取设备 {} 的活跃状态失败: {}", device.getId(), e.getMessage()); + } + + log.info("Device Name: {}, Device ID: {}, Device Type: {}, Active: {}", + device.getName(), + device.getId(), + device.getType(), + activeStatus); + totalCount++; + } + } + + log.info("========== 定时任务执行完成,共打印 {} 个设备 ==========", totalCount); + } catch (Exception e) { + log.error("定时任务执行失败: {}", e.getMessage(), e); + } + } } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/device/domain/model/thingsboard/RestClientManager.java b/src/main/java/com/ruoyi/device/domain/model/thingsboard/RestClientManager.java index e19a686..7b6cd60 100644 --- a/src/main/java/com/ruoyi/device/domain/model/thingsboard/RestClientManager.java +++ b/src/main/java/com/ruoyi/device/domain/model/thingsboard/RestClientManager.java @@ -2,19 +2,21 @@ package com.ruoyi.device.domain.model.thingsboard; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import org.thingsboard.rest.client.RestClient; /** - * RestClient单例管理器 + * RestClient管理器 * 提供全局唯一的RestClient实例,避免重复创建连接 * * 注意:RestClient内部已经实现了token自动刷新和重新登录机制, * 本管理器主要用于全局共享同一个连接实例 */ +@Component public class RestClientManager { private static final Logger log = LoggerFactory.getLogger(RestClientManager.class); - private static volatile RestClientManager instance; private volatile RestClient client; private final String url; @@ -22,28 +24,19 @@ public class RestClientManager { private final String password; /** - * 私有构造函数 + * 构造函数 - Spring 自动装配 + * @param url ThingsBoard服务器地址,默认 http://thingsboard-ce:8080 + * @param username 用户名,默认 tenant@thingsboard.org + * @param password 密码,默认 tenant */ - private RestClientManager(String url, String username, String password) { + public RestClientManager(@Value("${thingsboard.url:http://thingsboard-ce:8080}") String url, + @Value("${thingsboard.username:tenant@thingsboard.org}") String username, + @Value("${thingsboard.password:tenant}") String password) { this.url = url; this.username = username; this.password = password; } - /** - * 获取单例实例(双重检查锁) - */ - public static RestClientManager getInstance(String url, String username, String password) { - if (instance == null) { - synchronized (RestClientManager.class) { - if (instance == null) { - instance = new RestClientManager(url, username, password); - } - } - } - return instance; - } - /** * 获取RestClient实例 * 懒加载:第一次调用时才创建并登录 diff --git a/src/main/java/com/ruoyi/device/domain/model/thingsboard/DeviceAttributes.java b/src/main/java/com/ruoyi/device/domain/model/thingsboard/constants/DeviceAttributes.java similarity index 95% rename from src/main/java/com/ruoyi/device/domain/model/thingsboard/DeviceAttributes.java rename to src/main/java/com/ruoyi/device/domain/model/thingsboard/constants/DeviceAttributes.java index f30e3db..e2a9a26 100644 --- a/src/main/java/com/ruoyi/device/domain/model/thingsboard/DeviceAttributes.java +++ b/src/main/java/com/ruoyi/device/domain/model/thingsboard/constants/DeviceAttributes.java @@ -1,4 +1,6 @@ -package com.ruoyi.device.domain.model.thingsboard; +package com.ruoyi.device.domain.model.thingsboard.constants; + +import com.ruoyi.device.domain.model.thingsboard.AttributeKey; /** * 预定义的设备属性键 diff --git a/src/main/java/com/ruoyi/device/domain/model/thingsboard/DeviceTelemetry.java b/src/main/java/com/ruoyi/device/domain/model/thingsboard/constants/DeviceTelemetry.java similarity index 93% rename from src/main/java/com/ruoyi/device/domain/model/thingsboard/DeviceTelemetry.java rename to src/main/java/com/ruoyi/device/domain/model/thingsboard/constants/DeviceTelemetry.java index f071584..a0efb93 100644 --- a/src/main/java/com/ruoyi/device/domain/model/thingsboard/DeviceTelemetry.java +++ b/src/main/java/com/ruoyi/device/domain/model/thingsboard/constants/DeviceTelemetry.java @@ -1,4 +1,6 @@ -package com.ruoyi.device.domain.model.thingsboard; +package com.ruoyi.device.domain.model.thingsboard.constants; + +import com.ruoyi.device.domain.model.thingsboard.TelemetryKey; /** * 预定义的设备遥测数据键