feat(device): 添加MQTT设备在线状态管理与Redis容错机制

- 集成Spring Integration MQTT与Eclipse Paho客户端
- 添加设备在线状态填充逻辑,支持批量查询心跳数据
- 优化Redis配置,使用Lazy初始化与通用序列化器
- 增加Redis异常处理与防重复提交Fail-Open机制
- 新增Redis设备模块常量与在线状态VO
- 完善MQTT与Redis集群连接配置
This commit is contained in:
TongTongStudio
2026-08-08 20:31:29 +08:00
parent e5e3f2c741
commit 927332ad5d
23 changed files with 1368 additions and 14 deletions

View File

@@ -0,0 +1,71 @@
package com.youlai.boot.device.service;
import com.youlai.boot.device.model.vo.DeviceOnlineVO;
import java.util.List;
import java.util.Map;
/**
* 设备在线状态服务
* <p>
* 基于 Redis 记录设备在线/离线状态:
* <ul>
* <li>设备周期性上报心跳(经 MQTT 到达 {@code MqttMessageHandler}),每上报一次刷新 Redis key 的 TTL</li>
* <li>Redis key 使用带过期时间的 {@code SET key value EX timeout},超时未上报则 key 自动过期,即判定设备离线;</li>
* <li>查询时 key 存在 = 在线,不存在 = 离线。</li>
* </ul>
*
* @author TongTongStudio
* @since 2026/8/8
*/
public interface DeviceOnlineService {
/**
* 设备上报心跳,记录在线状态(刷新 Redis TTL
*
* @param sn 设备序列号
* @param ip 设备 IP可为空
*/
void reportHeartbeat(String sn, String ip);
/**
* 设备上报心跳,记录在线状态(刷新 Redis TTL
*
* @param sn 设备序列号
* @param ip 设备 IP可为空
* @param screenState 屏幕状态(1:亮屏;0:熄屏;null:未知),可为空
*/
void reportHeartbeat(String sn, String ip, Integer screenState);
/**
* 设备主动离线(如 MQTT Last Will / 关机通知)
*
* @param sn 设备序列号
*/
void markOffline(String sn);
/**
* 查询单个设备是否在线
*
* @param sn 设备序列号
* @return true=在线, false=离线
*/
boolean isOnline(String sn);
/**
* 获取单个设备在线状态信息
*
* @param sn 设备序列号
* @return 在线状态信息(离线时 online=0
*/
DeviceOnlineVO getOnlineInfo(String sn);
/**
* 批量查询设备在线状态
*
* @param sns 设备序列号集合
* @return key 为 SNvalue 为在线状态信息
*/
Map<String, DeviceOnlineVO> getOnlineStatusBySns(List<String> sns);
}