|
@@ -12,17 +12,20 @@ import com.hfln.device.domain.service.PointCloudProcessService;
|
|
|
import com.hfln.device.domain.vo.BehaviorPattern;
|
|
|
import com.hfln.device.domain.vo.PoseAnalysisResult;
|
|
|
import com.hfln.device.domain.vo.TargetPoint;
|
|
|
+import com.hfln.device.common.util.JsonUtil;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.Calendar;
|
|
|
import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Optional;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 设备事件服务实现类
|
|
@@ -167,169 +170,115 @@ public class DeviceEventServiceImpl implements DeviceEventService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 处理设备登录事件
|
|
|
+ * 对应Python版本的deal_dev_login方法
|
|
|
+ *
|
|
|
+ * Python处理流程:
|
|
|
+ * 1. 解析payload获取device_info、ext_region、sensor_location
|
|
|
+ * 2. 提取设备基本信息:deviceid、firmware、blu_ver、device_type、device_ip
|
|
|
+ * 3. 从ext_region.base提取跟踪区域坐标:x1,x2,y1,y2,z1,z2
|
|
|
+ * 4. 从sensor_location提取安装高度:z_cm
|
|
|
+ * 5. 检查设备是否已注册:
|
|
|
+ * - 已注册且在线:直接发送登录响应,不发送状态消息(避免重复上线)
|
|
|
+ * - 已注册但离线:设置在线状态,更新保活时间,发送登录响应和状态消息
|
|
|
+ * - 未注册:创建新设备,入库,发送登录响应和状态消息
|
|
|
+ * 6. 数据库操作:更新在线状态到数据库
|
|
|
+ * 7. MQTT消息:发送登录响应 + 状态变更消息(仅新设备或重新上线)
|
|
|
+ */
|
|
|
@Override
|
|
|
- public void handleDeviceLogin(String deviceId, Map<String, Object> deviceInfo) {
|
|
|
+ public void handleDeviceLogin(String deviceId, Map<String, Object> deviceInfo, Map<String, Object> fullPayload) {
|
|
|
log.info("处理设备登录事件: deviceId={}", deviceId);
|
|
|
|
|
|
+ // 从完整载荷中提取额外信息
|
|
|
+ Map<String, Object> extRegion = (Map<String, Object>) fullPayload.get("ext_region");
|
|
|
+ Map<String, Object> sensorLocation = (Map<String, Object>) fullPayload.get("sensor_location");
|
|
|
+
|
|
|
// 检查设备是否存在
|
|
|
Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
Device device = null;
|
|
|
|
|
|
- // 如果设备不存在,则创建设备
|
|
|
+ // 如果设备不存在,则创建设备 (参考Python版本的未注册逻辑)
|
|
|
if (!deviceOpt.isPresent()) {
|
|
|
log.info("设备不存在,创建新设备: {}", deviceId);
|
|
|
- deviceGateway.createDevice(deviceId, deviceInfo);
|
|
|
|
|
|
- // 获取新创建的设备
|
|
|
- device = deviceGateway.getDeviceById(deviceId);
|
|
|
+ // 从deviceInfo中提取设备信息构建设备对象
|
|
|
+ Device newDevice = buildDeviceFromLoginInfo(deviceId, deviceInfo, extRegion, sensorLocation);
|
|
|
+
|
|
|
+ // 保存设备
|
|
|
+ Device savedDevice = deviceGateway.saveDevice(newDevice);
|
|
|
+ if (savedDevice != null) {
|
|
|
+ // 添加到缓存
|
|
|
+ deviceManagerService.updateDeviceInCache(savedDevice);
|
|
|
+ device = savedDevice;
|
|
|
+
|
|
|
+ // 更新设备在线状态
|
|
|
+ deviceGateway.updateDeviceOnlineStatus(deviceId, 1);
|
|
|
+
|
|
|
+ // 发送登录响应
|
|
|
+ mqttGateway.sendDeviceLoginResponse(deviceId, 0);
|
|
|
+
|
|
|
+ // 发送设备状态更新消息 (参考Python版本:新设备注册后发送状态消息)
|
|
|
+ mqttGateway.sendDeviceStatusMessage(device);
|
|
|
+ }
|
|
|
} else {
|
|
|
- log.info("设备已存在,更新设备信息: {}", deviceId);
|
|
|
- // 获取现有设备
|
|
|
+ // 设备已存在 (参考Python版本的已注册逻辑)
|
|
|
device = deviceOpt.get();
|
|
|
+ log.info("设备已存在: deviceId={}, online={}", deviceId, device.getOnline());
|
|
|
|
|
|
- if (device != null) {
|
|
|
- // 更新设备信息
|
|
|
- // 从deviceInfo中提取信息更新设备
|
|
|
- if (deviceInfo.containsKey("dev_type")) {
|
|
|
- device.setDevType((String) deviceInfo.get("dev_type"));
|
|
|
- }
|
|
|
- if (deviceInfo.containsKey("software")) {
|
|
|
- device.setSoftware((String) deviceInfo.get("software"));
|
|
|
- }
|
|
|
- if (deviceInfo.containsKey("hardware")) {
|
|
|
- device.setHardware((String) deviceInfo.get("hardware"));
|
|
|
- }
|
|
|
-
|
|
|
- // 更新网络信息
|
|
|
- if (deviceInfo.containsKey("network")) {
|
|
|
- Map<String, Object> networkInfo = (Map<String, Object>) deviceInfo.get("network");
|
|
|
- if (device.getNetwork() == null) {
|
|
|
- device.setNetwork(new Device.NetworkInfo());
|
|
|
- }
|
|
|
- if (networkInfo.containsKey("ssid")) {
|
|
|
- device.getNetwork().setSsid((String) networkInfo.get("ssid"));
|
|
|
- }
|
|
|
- if (networkInfo.containsKey("password")) {
|
|
|
- device.getNetwork().setPassword((String) networkInfo.get("password"));
|
|
|
- }
|
|
|
- if (networkInfo.containsKey("ip")) {
|
|
|
- device.getNetwork().setIp((String) networkInfo.get("ip"));
|
|
|
- }
|
|
|
- }
|
|
|
+ // 检查设备是否已在线 (参考Python版本的重复上线处理)
|
|
|
+ if (Integer.valueOf(1).equals(device.getOnline())) {
|
|
|
+ log.info("设备已在线,直接返回成功: {}", deviceId);
|
|
|
+ // 发送登录响应
|
|
|
+ mqttGateway.sendDeviceLoginResponse(deviceId, 0);
|
|
|
+ return; // 重复上线,直接返回
|
|
|
+ } else {
|
|
|
+ // 离线设备重新上线
|
|
|
+ log.info("离线设备重新上线: {}", deviceId);
|
|
|
+ device.updateOnlineStatus(1);
|
|
|
+ device.updateKeepAliveTime(System.currentTimeMillis());
|
|
|
|
|
|
- // 更新安装参数
|
|
|
- if (deviceInfo.containsKey("radar_param")) {
|
|
|
- Map<String, Object> radarParam = (Map<String, Object>) deviceInfo.get("radar_param");
|
|
|
- if (device.getInstallParam() == null) {
|
|
|
- device.setInstallParam(new Device.InstallParam());
|
|
|
- }
|
|
|
- if (radarParam.containsKey("mount_plain")) {
|
|
|
- device.getInstallParam().setMountPlain((String) radarParam.get("mount_plain"));
|
|
|
- }
|
|
|
- if (radarParam.containsKey("height")) {
|
|
|
- device.getInstallParam().setHeight(((Number) radarParam.get("height")).floatValue());
|
|
|
- }
|
|
|
-
|
|
|
- // 更新跟踪区域
|
|
|
- if (radarParam.containsKey("tracking_region")) {
|
|
|
- Map<String, Object> trackingRegion = (Map<String, Object>) radarParam.get("tracking_region");
|
|
|
- if (device.getInstallParam().getTrackingRegion() == null) {
|
|
|
- device.getInstallParam().setTrackingRegion(new Device.TrackingRegion());
|
|
|
- }
|
|
|
- Device.TrackingRegion region = device.getInstallParam().getTrackingRegion();
|
|
|
-
|
|
|
- if (trackingRegion.containsKey("start_x")) {
|
|
|
- region.setStartX(((Number) trackingRegion.get("start_x")).intValue());
|
|
|
- }
|
|
|
- if (trackingRegion.containsKey("start_y")) {
|
|
|
- region.setStartY(((Number) trackingRegion.get("start_y")).intValue());
|
|
|
- }
|
|
|
- if (trackingRegion.containsKey("start_z")) {
|
|
|
- region.setStartZ(((Number) trackingRegion.get("start_z")).intValue());
|
|
|
- }
|
|
|
- if (trackingRegion.containsKey("stop_x")) {
|
|
|
- region.setStopX(((Number) trackingRegion.get("stop_x")).intValue());
|
|
|
- }
|
|
|
- if (trackingRegion.containsKey("stop_y")) {
|
|
|
- region.setStopY(((Number) trackingRegion.get("stop_y")).intValue());
|
|
|
- }
|
|
|
- if (trackingRegion.containsKey("stop_z")) {
|
|
|
- region.setStopZ(((Number) trackingRegion.get("stop_z")).intValue());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ // 更新设备信息
|
|
|
+ updateDeviceInfoFromLogin(device, deviceInfo, extRegion, sensorLocation);
|
|
|
|
|
|
// 更新设备信息
|
|
|
deviceGateway.updateDevice(device);
|
|
|
+
|
|
|
+ // 更新设备缓存
|
|
|
+ deviceManagerService.updateDeviceInCache(device);
|
|
|
+
|
|
|
+ // 发送登录响应
|
|
|
+ mqttGateway.sendDeviceLoginResponse(deviceId, 0);
|
|
|
+
|
|
|
+ // 发送设备状态更新消息 (参考Python版本:离线设备重新上线才发送状态消息)
|
|
|
+ mqttGateway.sendDeviceStatusMessage(device);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // 如果获取到设备,更新在线状态和缓存
|
|
|
- if (device != null) {
|
|
|
- // 更新设备在线状态和保活时间
|
|
|
- device.updateOnlineStatus(1);
|
|
|
- device.updateKeepAliveTime(System.currentTimeMillis());
|
|
|
-
|
|
|
- // 更新设备缓存
|
|
|
- deviceManagerService.updateDeviceInCache(device);
|
|
|
-
|
|
|
- // 更新设备在线状态
|
|
|
- deviceGateway.updateDeviceOnlineStatus(deviceId, 1);
|
|
|
-
|
|
|
- // 发送登录响应
|
|
|
- mqttGateway.sendDeviceLoginResponse(deviceId, 0);
|
|
|
-
|
|
|
- // 发送设备状态更新
|
|
|
- mqttGateway.sendDeviceStatusMessage(device);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 处理设备心跳保活事件
|
|
|
+ * 对应Python版本的deal_dev_keepalive方法
|
|
|
+ *
|
|
|
+ * Python处理流程:
|
|
|
+ * 1. 检查设备是否已注册和在线状态
|
|
|
+ * 2. 更新设备的最后保活时间戳(last_keepalive_time)
|
|
|
+ * 3. 如果设备当前离线状态,则:
|
|
|
+ * - 设置设备为在线状态
|
|
|
+ * - 更新数据库状态
|
|
|
+ * - 发送设备状态变更消息到MQTT
|
|
|
+ * 4. 发送心跳响应消息给设备
|
|
|
+ * 5. 不进行复杂业务逻辑,主要用于维持连接状态
|
|
|
+ */
|
|
|
@Override
|
|
|
public void handleDeviceKeepAlive(String deviceId) {
|
|
|
log.info("处理设备保活事件: deviceId={}", deviceId);
|
|
|
|
|
|
- // 获取设备
|
|
|
- Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
-
|
|
|
- if (deviceOpt.isPresent()) {
|
|
|
- Device device = deviceOpt.get();
|
|
|
-
|
|
|
- // 更新设备保活时间
|
|
|
- device.updateKeepAliveTime(System.currentTimeMillis());
|
|
|
-
|
|
|
- // 如果设备离线,更新为在线
|
|
|
- if (device.getOnline() == null || device.getOnline() != 1) {
|
|
|
- device.updateOnlineStatus(1);
|
|
|
-
|
|
|
- // 更新设备在线状态
|
|
|
- deviceGateway.updateDeviceOnlineStatus(deviceId, 1);
|
|
|
-
|
|
|
- // 发送设备状态更新
|
|
|
- mqttGateway.sendDeviceStatusMessage(device);
|
|
|
- }
|
|
|
-
|
|
|
- // 更新设备缓存
|
|
|
- deviceManagerService.updateDeviceInCache(device);
|
|
|
-
|
|
|
- // 更新数据库中的保活时间
|
|
|
- deviceGateway.updateDeviceKeepAliveTime(deviceId, System.currentTimeMillis());
|
|
|
-
|
|
|
- // 发送保活响应
|
|
|
- mqttGateway.sendDeviceKeepAliveResponse(deviceId, 0);
|
|
|
- } else {
|
|
|
- log.warn("设备不存在,无法处理保活事件: {}", deviceId);
|
|
|
-
|
|
|
- // 创建一个临时设备对象,用于发送保活响应
|
|
|
- Device device = new Device(deviceId);
|
|
|
- device.setOnline(1);
|
|
|
- device.setKeepaliveTime(System.currentTimeMillis());
|
|
|
-
|
|
|
- // 添加到缓存
|
|
|
- deviceManagerService.updateDeviceInCache(device);
|
|
|
-
|
|
|
- // 发送保活响应
|
|
|
- mqttGateway.sendDeviceKeepAliveResponse(deviceId, 1); // 1表示设备未注册
|
|
|
- }
|
|
|
+ // TODO: 实现保活逻辑
|
|
|
+ // 1. 检查设备是否存在
|
|
|
+ // 2. 更新保活时间戳
|
|
|
+ // 3. 更新在线状态(如果需要)
|
|
|
+ // 4. 发送保活响应
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -357,23 +306,33 @@ public class DeviceEventServiceImpl implements DeviceEventService {
|
|
|
Device device = deviceOpt.get();
|
|
|
long timestamp = System.currentTimeMillis();
|
|
|
|
|
|
- // 使用领域服务处理跌倒告警
|
|
|
- Long eventId = alarmService.handleFallAlarm(deviceId, pose, targetPoint, timestamp);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void handleFallEvent(String deviceId, String event, Integer pose, List<Float> targetPoint) {
|
|
|
- log.info("处理跌倒事件: deviceId={}, event={}, pose={}", deviceId, event, pose);
|
|
|
+ // 检查是否应该发送跌倒告警 (参考Python版本的告警间隔控制)
|
|
|
+ if (!device.shouldSendFallAlarm(timestamp)) {
|
|
|
+ log.debug("跌倒告警被抑制: deviceId={}, 告警间隔或确认状态限制", deviceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- // 调用事件处理方法
|
|
|
- handleEvent(deviceId, event, pose, targetPoint);
|
|
|
+ // 根据设备类型处理跌倒事件 (参考Python版本的设备类型区分逻辑)
|
|
|
+ String event = "fall_confirmed";
|
|
|
+ Device.FallEventResult result = device.processFallEvent(event, pose, targetPoint);
|
|
|
|
|
|
- // 如果是确认跌倒事件,处理跌倒告警
|
|
|
- if ("fall_confirmed".equals(event)) {
|
|
|
- handleDeviceFallEvent(deviceId, pose, targetPoint);
|
|
|
+ if (!result.isShouldProcess()) {
|
|
|
+ log.debug("设备类型或状态不满足处理条件: deviceId={}, devType={}", deviceId, device.getDevType());
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ // 发送事件消息 (参考Python版本:只有满足条件才发送事件消息)
|
|
|
+ mqttGateway.sendEventMessage(deviceId, result.getPose(), result.getLocation(), result.getEvent());
|
|
|
+
|
|
|
+ // 更新最后跌倒告警时间
|
|
|
+ device.setLastReportFallTime(timestamp);
|
|
|
+ deviceManagerService.updateDeviceInCache(device);
|
|
|
+
|
|
|
+ log.info("设备上报跌倒事件: deviceId={}, event={}, devType={}", deviceId, event, device.getDevType());
|
|
|
}
|
|
|
|
|
|
+ // 已删除旧版本的handleFallEvent方法,使用新的签名
|
|
|
+
|
|
|
@Override
|
|
|
public void handleDeviceStatusUpdate(String deviceId, boolean online, String devType, String software,
|
|
|
String hardware, Map<String, Object> network, Map<String, Object> radarParam) {
|
|
@@ -467,44 +426,7 @@ public class DeviceEventServiceImpl implements DeviceEventService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void handleCloudPoint(String deviceId, List<List<Float>> pointCloud, List<Float> targetPoint) {
|
|
|
- log.info("处理点云数据: deviceId={}, pointCloudSize={}", deviceId, pointCloud.size());
|
|
|
-
|
|
|
- // 获取设备
|
|
|
- Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
- if (!deviceOpt.isPresent()) {
|
|
|
- log.warn("设备不存在,无法处理点云数据: {}", deviceId);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- Device device = deviceOpt.get();
|
|
|
-
|
|
|
- // 使用点云处理服务分析姿态
|
|
|
- int pose = pointCloudProcessService.analyzePose(pointCloud);
|
|
|
-
|
|
|
- // 发送实时位置姿态消息
|
|
|
- mqttGateway.sendRealtimePoseMessage(deviceId, pose, targetPoint);
|
|
|
-
|
|
|
- // 分析姿态行为
|
|
|
- long timestamp = System.currentTimeMillis();
|
|
|
- // 创建目标点对象
|
|
|
- TargetPoint target = TargetPoint.fromList(targetPoint);
|
|
|
- target.setTimestamp(timestamp);
|
|
|
- List<TargetPoint> targetPoints = Collections.singletonList(target);
|
|
|
-
|
|
|
- // 创建姿态分析结果
|
|
|
- PoseAnalysisResult poseResult = PoseAnalysisResult.createDefault(deviceId, pose);
|
|
|
- poseResult.setTimestamp(timestamp);
|
|
|
-
|
|
|
- // 分析行为
|
|
|
- BehaviorPattern poseBehavior = behaviorAnalysisService.analyzeBehavior(device, poseResult, targetPoints);
|
|
|
-
|
|
|
- // 如果是跌倒姿态,处理跌倒事件
|
|
|
- if (pose == 2) { // 假设2表示跌倒姿态
|
|
|
- handleDeviceFallEvent(deviceId, pose, targetPoint);
|
|
|
- }
|
|
|
- }
|
|
|
+ // 已删除旧版本的handleCloudPoint方法,使用新的签名
|
|
|
|
|
|
@Override
|
|
|
public void handleRealtimePosition(String deviceId, Integer pose, List<List<Float>> targets) {
|
|
@@ -534,16 +456,7 @@ public class DeviceEventServiceImpl implements DeviceEventService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void handleExistEvent(String deviceId, String event) {
|
|
|
- log.info("处理存在事件: deviceId={}, event={}", deviceId, event);
|
|
|
-
|
|
|
- // 记录存在事件
|
|
|
- deviceGateway.recordExistEvent(deviceId, event);
|
|
|
-
|
|
|
- // 发送存在事件消息
|
|
|
- mqttGateway.sendExistenceMessage(deviceId, event);
|
|
|
- }
|
|
|
+ // 已删除旧版本的handleExistEvent方法,使用新的签名
|
|
|
|
|
|
@Override
|
|
|
public void handleAlarmEvent(String deviceId, String desc, String table, Integer tableId) {
|
|
@@ -795,4 +708,581 @@ public class DeviceEventServiceImpl implements DeviceEventService {
|
|
|
log.error("处理姿态分布异常: {}", e.getMessage(), e);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从登录信息构建设备对象 (参考Python版本的deal_dev_login逻辑)
|
|
|
+ */
|
|
|
+ private Device buildDeviceFromLoginInfo(String deviceId, Map<String, Object> deviceInfo, Map<String, Object> extRegion, Map<String, Object> sensorLocation) {
|
|
|
+ Device device = new Device(deviceId);
|
|
|
+ device.setOnline(1);
|
|
|
+ device.setKeepaliveTime(System.currentTimeMillis());
|
|
|
+
|
|
|
+ // 提取设备基本信息
|
|
|
+ Map<String, Object> deviceBasicInfo = (Map<String, Object>) deviceInfo.get("device_info");
|
|
|
+ if (deviceBasicInfo != null) {
|
|
|
+ device.setDevType((String) deviceBasicInfo.get("device_type"));
|
|
|
+ device.setSoftware((String) deviceBasicInfo.get("firmware"));
|
|
|
+ device.setBluVer((String) deviceBasicInfo.get("blu_ver"));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取区域信息
|
|
|
+ if (extRegion != null) {
|
|
|
+ Map<String, Object> base = (Map<String, Object>) extRegion.get("base");
|
|
|
+ if (base != null) {
|
|
|
+ Device.TrackingRegion trackingRegion = new Device.TrackingRegion();
|
|
|
+ trackingRegion.setStartX(((Number) base.get("x_cm_start")).intValue());
|
|
|
+ trackingRegion.setStopX(((Number) base.get("x_cm_stop")).intValue());
|
|
|
+ trackingRegion.setStartY(((Number) base.get("y_cm_start")).intValue());
|
|
|
+ trackingRegion.setStopY(((Number) base.get("y_cm_stop")).intValue());
|
|
|
+ trackingRegion.setStartZ(((Number) base.get("z_cm_start")).intValue());
|
|
|
+ trackingRegion.setStopZ(((Number) base.get("z_cm_stop")).intValue());
|
|
|
+
|
|
|
+ Device.InstallParam installParam = new Device.InstallParam();
|
|
|
+ installParam.setMountPlain("Wall"); // 默认墙装
|
|
|
+ installParam.setTrackingRegion(trackingRegion);
|
|
|
+
|
|
|
+ // 提取高度信息
|
|
|
+ if (sensorLocation != null) {
|
|
|
+ installParam.setHeight(((Number) sensorLocation.get("z_cm")).floatValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ device.setInstallParam(installParam);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化网络信息
|
|
|
+ device.setNetwork(new Device.NetworkInfo("", "", ""));
|
|
|
+
|
|
|
+ return device;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从登录信息更新设备信息
|
|
|
+ */
|
|
|
+ private void updateDeviceInfoFromLogin(Device device, Map<String, Object> deviceInfo, Map<String, Object> extRegion, Map<String, Object> sensorLocation) {
|
|
|
+ Map<String, Object> deviceBasicInfo = (Map<String, Object>) deviceInfo.get("device_info");
|
|
|
+ if (deviceBasicInfo != null) {
|
|
|
+ if (deviceBasicInfo.containsKey("device_type")) {
|
|
|
+ device.setDevType((String) deviceBasicInfo.get("device_type"));
|
|
|
+ }
|
|
|
+ if (deviceBasicInfo.containsKey("firmware")) {
|
|
|
+ device.setSoftware((String) deviceBasicInfo.get("firmware"));
|
|
|
+ }
|
|
|
+ if (deviceBasicInfo.containsKey("blu_ver")) {
|
|
|
+ device.setBluVer((String) deviceBasicInfo.get("blu_ver"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新区域信息
|
|
|
+ if (extRegion != null) {
|
|
|
+ Map<String, Object> base = (Map<String, Object>) extRegion.get("base");
|
|
|
+ if (base != null) {
|
|
|
+ if (device.getInstallParam() != null && device.getInstallParam().getTrackingRegion() != null) {
|
|
|
+ Device.TrackingRegion region = device.getInstallParam().getTrackingRegion();
|
|
|
+ region.setStartX(((Number) base.get("x_cm_start")).intValue());
|
|
|
+ region.setStopX(((Number) base.get("x_cm_stop")).intValue());
|
|
|
+ region.setStartY(((Number) base.get("y_cm_start")).intValue());
|
|
|
+ region.setStopY(((Number) base.get("y_cm_stop")).intValue());
|
|
|
+ region.setStartZ(((Number) base.get("z_cm_start")).intValue());
|
|
|
+ region.setStopZ(((Number) base.get("z_cm_stop")).intValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理设备参数上报
|
|
|
+ * 对应Python版本的deal_report_device_param方法
|
|
|
+ *
|
|
|
+ * Python处理流程:
|
|
|
+ * 1. 解析消息数据,获取设备参数信息
|
|
|
+ * 2. 验证参数格式和合法性
|
|
|
+ * 3. 更新设备参数配置到数据库
|
|
|
+ * 4. 记录参数变更历史
|
|
|
+ * 5. 发送参数更新确认消息
|
|
|
+ * 6. 如果是关键参数变更,触发相关业务逻辑
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void handleDeviceParamReport(String deviceId, Map<String, Object> messageData) {
|
|
|
+ log.info("处理设备参数上报: deviceId={}", deviceId);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ log.warn("设备不存在,无法处理参数上报: deviceId={}", deviceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Device device = deviceOpt.get();
|
|
|
+
|
|
|
+ // 按照Python版本解析字段
|
|
|
+ Map<String, Object> deviceInfo = (Map<String, Object>) messageData.get("device_info");
|
|
|
+ Map<String, Object> sensorLocation = (Map<String, Object>) messageData.get("sensor_location");
|
|
|
+ Map<String, Object> extRegion = (Map<String, Object>) messageData.get("ext_region");
|
|
|
+ Map<String, Object> fallingStateMachineDurations = (Map<String, Object>) messageData.get("fallingStateMachineDurations");
|
|
|
+ Boolean is45Degree = (Boolean) messageData.get("is45Degree");
|
|
|
+ Boolean isCeiling = (Boolean) messageData.get("isCeiling");
|
|
|
+
|
|
|
+ // 更新设备信息
|
|
|
+ if (deviceInfo != null) {
|
|
|
+ String bluVer = (String) deviceInfo.get("blu_ver");
|
|
|
+ String deviceType = (String) deviceInfo.get("device_type");
|
|
|
+ String software = (String) deviceInfo.get("firmware");
|
|
|
+ String deviceid = (String) deviceInfo.get("deviceid");
|
|
|
+
|
|
|
+ device.setBluVer(bluVer);
|
|
|
+ device.setDevType(deviceType);
|
|
|
+ device.setSoftware(software);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新安装参数
|
|
|
+ if (sensorLocation != null && extRegion != null) {
|
|
|
+ Float sensorHeight = ((Number) sensorLocation.get("z_cm")).floatValue();
|
|
|
+ if (device.getInstallParam() == null) {
|
|
|
+ device.setInstallParam(new Device.InstallParam());
|
|
|
+ }
|
|
|
+ device.getInstallParam().setHeight(sensorHeight);
|
|
|
+
|
|
|
+ // 更新区域信息
|
|
|
+ Map<String, Object> base = (Map<String, Object>) extRegion.get("base");
|
|
|
+ if (base != null) {
|
|
|
+ if (device.getInstallParam().getTrackingRegion() == null) {
|
|
|
+ device.getInstallParam().setTrackingRegion(new Device.TrackingRegion());
|
|
|
+ }
|
|
|
+ Device.TrackingRegion region = device.getInstallParam().getTrackingRegion();
|
|
|
+
|
|
|
+ region.setStartX(((Number) base.get("x_cm_start")).intValue());
|
|
|
+ region.setStopX(((Number) base.get("x_cm_stop")).intValue());
|
|
|
+ region.setStartY(((Number) base.get("y_cm_start")).intValue());
|
|
|
+ region.setStopY(((Number) base.get("y_cm_stop")).intValue());
|
|
|
+ region.setStartZ(((Number) base.get("z_cm_start")).intValue());
|
|
|
+ region.setStopZ(((Number) base.get("z_cm_stop")).intValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存完整参数信息 (TODO: 在Device类中实现setParam方法)
|
|
|
+ // device.setParam(messageData);
|
|
|
+
|
|
|
+ // 更新设备
|
|
|
+ deviceGateway.updateDevice(device);
|
|
|
+ deviceManagerService.updateDeviceInCache(device);
|
|
|
+
|
|
|
+ // 发送设备信息更新消息 (TODO: 在MqttGateway中实现此方法)
|
|
|
+ // mqttGateway.sendUpdateDeviceInfoMessage(device);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设备参数上报异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理设备实时数据
|
|
|
+ * 对应Python版本的deal_dsp_data方法
|
|
|
+ *
|
|
|
+ * Python处理流程:
|
|
|
+ * 1. 解析DSP(数字信号处理)实时数据
|
|
|
+ * 2. 提取目标位置、姿态、生命体征等信息
|
|
|
+ * 3. 执行实时数据验证和过滤
|
|
|
+ * 4. 更新设备实时状态缓存
|
|
|
+ * 5. 触发实时告警检测逻辑
|
|
|
+ * 6. 发送实时位置姿态消息到指定MQTT主题
|
|
|
+ * 7. 记录关键数据到时序数据库(如有配置)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void handleDspData(String deviceId, Map<String, Object> messageData) {
|
|
|
+ log.debug("处理设备实时数据: deviceId={}", deviceId);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ return; // 未注册的设备,不处理
|
|
|
+ }
|
|
|
+
|
|
|
+ Device device = deviceOpt.get();
|
|
|
+
|
|
|
+ // 处理tracker_targets
|
|
|
+ if (messageData.containsKey("tracker_targets")) {
|
|
|
+ List<List<Number>> trackerTargets = (List<List<Number>>) messageData.get("tracker_targets");
|
|
|
+
|
|
|
+ // 转换数据类型
|
|
|
+ List<List<Float>> trackerTargetsFloat = trackerTargets.stream()
|
|
|
+ .map(target -> target.stream()
|
|
|
+ .map(number -> number.floatValue())
|
|
|
+ .collect(Collectors.toList()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // TODO: 在Device类中实现这些方法
|
|
|
+ // 更新设备目标信息
|
|
|
+ // List<List<Float>> stableTargets = device.updateTargets(trackerTargetsFloat);
|
|
|
+ // List<Integer> pose = device.getRealtimePose();
|
|
|
+
|
|
|
+ // TODO: 在MqttGateway中实现此方法
|
|
|
+ // 发送实时位置姿态消息
|
|
|
+ // mqttGateway.sendRealtimePositionMessage(deviceId, Collections.emptyList(), pose, trackerTargetsFloat);
|
|
|
+
|
|
|
+ // TODO: 在Device类中实现这些方法
|
|
|
+ // 更新停留时长
|
|
|
+ // long ts = System.currentTimeMillis();
|
|
|
+ // if (device.getEnterTime() < 0) {
|
|
|
+ // device.setEnterTime(ts);
|
|
|
+ // log.info("{} target enter, {}", deviceId, ts);
|
|
|
+ // }
|
|
|
+ // device.setLeaveTime(ts);
|
|
|
+
|
|
|
+ // 更新报警目标信息
|
|
|
+ // device.updateAlarmTargets(trackerTargetsFloat);
|
|
|
+
|
|
|
+ log.debug("处理tracker_targets完成: deviceId={}, targetCount={}", deviceId, trackerTargetsFloat.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 实现handleFallingCheck方法
|
|
|
+ // 检查跌倒信息
|
|
|
+ // if (messageData.containsKey("fallingMetaData")) {
|
|
|
+ // handleFallingCheck(deviceId, messageData);
|
|
|
+ // }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设备实时数据异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理点云数据
|
|
|
+ * 对应Python版本的deal_cloudpoint方法
|
|
|
+ *
|
|
|
+ * Python处理流程:
|
|
|
+ * 1. 解析点云数据(cloud_points)和目标跟踪数据(tracker_targets)
|
|
|
+ * 2. 对点云数据进行格式验证和异常值过滤
|
|
|
+ * 3. 计算目标在跟踪区域内的位置坐标
|
|
|
+ * 4. 执行目标识别和分类算法
|
|
|
+ * 5. 更新目标跟踪状态和轨迹数据
|
|
|
+ * 6. 检测目标的进入/离开区域事件
|
|
|
+ * 7. 发送实时位置姿态消息到MQTT
|
|
|
+ * 8. 记录轨迹数据到数据库(可选)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void handleCloudPoint(String deviceId, List<List<Float>> cloudPoints, List<List<Float>> trackerTargets) {
|
|
|
+ log.debug("处理设备点云数据: deviceId={}", deviceId);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ return; // 未注册的设备,不处理
|
|
|
+ }
|
|
|
+
|
|
|
+ Device device = deviceOpt.get();
|
|
|
+
|
|
|
+ // 对于LNA设备类型,检查点云数量
|
|
|
+ if ("LNA".equals(device.getDevType())) {
|
|
|
+ int valuePoints = 20;
|
|
|
+ if (cloudPoints == null || cloudPoints.size() < valuePoints) {
|
|
|
+ return; // 少于n个点则忽略
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有tracker_targets,从点云计算 (TODO: 实现getTrackerTargets方法)
|
|
|
+ if (trackerTargets == null) {
|
|
|
+ // trackerTargets = pointCloudProcessService.getTrackerTargets(cloudPoints);
|
|
|
+ trackerTargets = Collections.emptyList(); // 临时处理
|
|
|
+ }
|
|
|
+ } else if ("LNB".equals(device.getDevType())) {
|
|
|
+ // 对于LNB设备,必须有tracker_targets
|
|
|
+ if (trackerTargets == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ cloudPoints = Collections.emptyList(); // LNB设备不需要点云数据
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 在Device类中实现这些方法
|
|
|
+ // 更新实时点云和target
|
|
|
+ // device.putCloudPointsQueue(cloudPoints);
|
|
|
+ // List<List<Float>> stableTargets = device.updateTargets(trackerTargets);
|
|
|
+ // List<Integer> pose = device.getRealtimePose();
|
|
|
+
|
|
|
+ // TODO: 在MqttGateway中实现此方法
|
|
|
+ // 发送实时位置姿态消息
|
|
|
+ // mqttGateway.sendRealtimePositionMessage(deviceId, cloudPoints, pose, trackerTargets);
|
|
|
+
|
|
|
+ log.debug("处理点云数据完成: deviceId={}, cloudPointsSize={}, trackerTargetsSize={}",
|
|
|
+ deviceId, cloudPoints != null ? cloudPoints.size() : 0,
|
|
|
+ trackerTargets != null ? trackerTargets.size() : 0);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设备点云数据异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleFallEvent(String deviceId, Long timestamp, String type, String event,
|
|
|
+ Float fallLocX, Float fallLocY, Float fallLocZ, Float tarHeightEst) {
|
|
|
+ log.info("处理设备跌倒事件: deviceId={}, event={}, fallLoc=[{},{},{}]",
|
|
|
+ deviceId, event, fallLocX, fallLocY, fallLocZ);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ log.warn("设备未注册,无法处理跌倒事件: deviceId={}", deviceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Device device = deviceOpt.get();
|
|
|
+
|
|
|
+ // TODO: 在Device类中实现告警间隔检查方法
|
|
|
+ // 检查报警间隔
|
|
|
+ long now = System.currentTimeMillis();
|
|
|
+ // Device.FallEventResult fallResult = device.checkFallAlarmInterval(event, now);
|
|
|
+ // if (!fallResult.shouldSendAlarm()) {
|
|
|
+ // log.debug("跌倒事件被告警间隔控制过滤: deviceId={}, event={}", deviceId, event);
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // 构建目标点
|
|
|
+ List<Float> targetPoint = Arrays.asList(fallLocX, fallLocY, fallLocZ, 0.0f);
|
|
|
+ List<List<Float>> targets = Collections.singletonList(targetPoint);
|
|
|
+
|
|
|
+ // TODO: 修正MqttGateway.sendEventMessage方法签名
|
|
|
+ // 根据设备类型处理
|
|
|
+ if ("LNB".equals(device.getDevType())) {
|
|
|
+ int pose = "no_fall".equals(event) ? 4 : 0; // POSE_4 : POSE_0
|
|
|
+ // mqttGateway.sendEventMessage(deviceId, Collections.emptyList(), pose, targets, event);
|
|
|
+
|
|
|
+ // TODO: 在Device类中实现setLastFallTime方法
|
|
|
+ // device.setLastFallTime(event, now);
|
|
|
+ log.info("设备上报跌倒事件:躺, dev_id:{}, event:{}", deviceId, event);
|
|
|
+
|
|
|
+ } else if ("LNA".equals(device.getDevType())) {
|
|
|
+ // TODO: 在Device类中实现getRealtimePose方法
|
|
|
+ // List<Integer> realtimePose = device.getRealtimePose();
|
|
|
+ // if (realtimePose.isEmpty() || realtimePose.get(0) != 0) { // POSE_0
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // mqttGateway.sendEventMessage(deviceId, Collections.emptyList(), realtimePose.get(0), targets, event);
|
|
|
+ // TODO: 在Device类中实现setLastReportFallTime方法
|
|
|
+ // device.setLastReportFallTime(now);
|
|
|
+ log.info("设备上报跌倒事件:躺, dev_id:{}, event:{}", deviceId, event);
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("跌倒事件处理完成: deviceId={}, event={}, type={}", deviceId, event, type);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设备跌倒事件异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleExistEvent(String deviceId, Long timestamp, String type, String event) {
|
|
|
+ log.info("处理设备存在事件: deviceId={}, event={}", deviceId, event);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ log.warn("设备未注册,无法处理存在事件: deviceId={}", deviceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 在MqttGateway中实现sendExistEventMessage方法
|
|
|
+ // 发送存在事件消息
|
|
|
+ // mqttGateway.sendExistEventMessage(deviceId, event);
|
|
|
+ log.debug("处理存在事件完成: deviceId={}, event={}", deviceId, event);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设备存在事件异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleSetDebugParam(String deviceId, Map<String, Object> messageData) {
|
|
|
+ log.info("处理设置调试参数: deviceId={}", deviceId);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ log.warn("设备未注册,无法设置调试参数: deviceId={}", deviceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Device device = deviceOpt.get();
|
|
|
+
|
|
|
+ // 设置调试参数
|
|
|
+ device.setDebugParams(messageData);
|
|
|
+
|
|
|
+ // 更新设备缓存
|
|
|
+ deviceManagerService.updateDeviceInCache(device);
|
|
|
+
|
|
|
+ log.info("设置调试参数成功: deviceId={}, params={}", deviceId, messageData);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设置调试参数异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleGetDebugParam(String deviceId, Map<String, Object> messageData) {
|
|
|
+ log.info("处理获取调试参数: deviceId={}", deviceId);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取设备
|
|
|
+ Optional<Device> deviceOpt = deviceManagerService.getDeviceFromCache(deviceId);
|
|
|
+ if (!deviceOpt.isPresent()) {
|
|
|
+ log.warn("设备未注册,无法获取调试参数: deviceId={}", deviceId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Device device = deviceOpt.get();
|
|
|
+
|
|
|
+ // 获取调试参数
|
|
|
+ Map<String, Object> debugParams = device.getDebugParams();
|
|
|
+
|
|
|
+ // TODO: 在MqttGateway中实现sendDebugParamResponse方法
|
|
|
+ // 发送调试参数响应
|
|
|
+ // mqttGateway.sendDebugParamResponse(deviceId, debugParams);
|
|
|
+ log.debug("获取调试参数完成: deviceId={}, paramsSize={}", deviceId, debugParams != null ? debugParams.size() : 0);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理获取调试参数异常: deviceId={}, error={}", deviceId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ========== OPC告警参数处理方法实现 ==========
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleGetGlobalAlarmParam(String payload) {
|
|
|
+ log.info("处理获取全局告警参数请求: {}", payload);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // TODO: 从系统配置中读取全局告警参数
|
|
|
+ // 对应Python版本:g_sys_conf["alarm_conf"]
|
|
|
+ Map<String, Object> globalConfig = new HashMap<>();
|
|
|
+ globalConfig.put("retention_time", 60); // 滞留时间(秒)
|
|
|
+ globalConfig.put("retention_keep_time", 30); // 滞留保持时间(秒)
|
|
|
+ globalConfig.put("retention_alarm_time", 180); // 滞留告警时间(秒)
|
|
|
+
|
|
|
+ // 构建响应格式
|
|
|
+ Map<String, Object> response = new HashMap<>();
|
|
|
+ response.put("global", globalConfig);
|
|
|
+
|
|
|
+ // TODO: 在MqttGateway中实现reportAlarmParam方法
|
|
|
+ // 发送响应: mqtt_send.report_alarm_param(0, format_json)
|
|
|
+ // mqttGateway.reportAlarmParam(0, response);
|
|
|
+ log.info("全局告警参数获取成功: {}", response);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理获取全局告警参数异常: {}", e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleGetToiletAlarmParam(String payload) {
|
|
|
+ log.info("处理获取厕所告警参数请求: {}", payload);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // TODO: 从系统配置中读取厕所告警参数
|
|
|
+ // 对应Python版本:g_sys_conf["alarm_conf"]["toilet"]
|
|
|
+ Map<String, Object> toiletConfig = new HashMap<>();
|
|
|
+ toiletConfig.put("retention_time", 60); // 滞留时间(秒)
|
|
|
+ toiletConfig.put("retention_keep_time", 30); // 滞留保持时间(秒)
|
|
|
+ toiletConfig.put("retention_alarm_time", 900); // 厕所告警时间更长(15分钟)
|
|
|
+
|
|
|
+ // 构建响应格式
|
|
|
+ Map<String, Object> response = new HashMap<>();
|
|
|
+ response.put("toilet", toiletConfig);
|
|
|
+
|
|
|
+ // TODO: 在MqttGateway中实现reportAlarmParam方法
|
|
|
+ // 发送响应: mqtt_send.report_alarm_param(0, format_json)
|
|
|
+ // mqttGateway.reportAlarmParam(0, response);
|
|
|
+ log.info("厕所告警参数获取成功: {}", response);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理获取厕所告警参数异常: {}", e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleSetGlobalAlarmParam(String payload) {
|
|
|
+ log.info("处理设置全局告警参数请求: {}", payload);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 解析参数
|
|
|
+ Map<String, Object> messageData = JsonUtil.parseMap(payload);
|
|
|
+ Map<String, Object> globalParam = (Map<String, Object>) messageData.get("global");
|
|
|
+
|
|
|
+ // 提取参数值
|
|
|
+ Object retentionTime = globalParam.get("retention_time");
|
|
|
+ Object retentionKeepTime = globalParam.get("retention_keep_time");
|
|
|
+ Object retentionAlarmTime = globalParam.get("retention_alarm_time");
|
|
|
+
|
|
|
+ // TODO: 更新系统配置
|
|
|
+ // 对应Python版本:
|
|
|
+ // g_sys_conf["alarm_conf"]["retention_time"] = retention_time
|
|
|
+ // g_sys_conf["alarm_conf"]["retention_keep_time"] = retention_keep_time
|
|
|
+ // g_sys_conf["alarm_conf"]["retention_alarm_time"] = retention_alarm_time
|
|
|
+
|
|
|
+ // TODO: 更新所有设备的告警配置
|
|
|
+ // 对应Python版本:dev_mng.update_all_dev_alarm_conf()
|
|
|
+
|
|
|
+ // 发送成功响应
|
|
|
+ sendSetAlarmParamAck(0, "{}");
|
|
|
+ log.info("全局告警参数设置成功: retention_time={}, retention_keep_time={}, retention_alarm_time={}",
|
|
|
+ retentionTime, retentionKeepTime, retentionAlarmTime);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设置全局告警参数异常: {}", e.getMessage(), e);
|
|
|
+ sendSetAlarmParamAck(-1, "{}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void handleSetToiletAlarmParam(String payload) {
|
|
|
+ log.info("处理设置厕所告警参数请求: {}", payload);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 解析参数
|
|
|
+ Map<String, Object> messageData = JsonUtil.parseMap(payload);
|
|
|
+ Map<String, Object> toiletParam = (Map<String, Object>) messageData.get("toilet");
|
|
|
+
|
|
|
+ // 提取参数值
|
|
|
+ Object retentionTime = toiletParam.get("retention_time");
|
|
|
+ Object retentionKeepTime = toiletParam.get("retention_keep_time");
|
|
|
+ Object retentionAlarmTime = toiletParam.get("retention_alarm_time");
|
|
|
+
|
|
|
+ // TODO: 更新系统配置
|
|
|
+ // 对应Python版本:
|
|
|
+ // g_sys_conf["alarm_conf"]["toilet"]["retention_time"] = retention_time
|
|
|
+ // g_sys_conf["alarm_conf"]["toilet"]["retention_keep_time"] = retention_keep_time
|
|
|
+ // g_sys_conf["alarm_conf"]["toilet"]["retention_alarm_time"] = retention_alarm_time
|
|
|
+
|
|
|
+ // TODO: 更新所有设备的厕所告警配置
|
|
|
+ // 对应Python版本:dev_mng.update_all_dev_toilet_alarm_conf()
|
|
|
+
|
|
|
+ // 发送成功响应
|
|
|
+ sendSetAlarmParamAck(0, "{}");
|
|
|
+ log.info("厕所告警参数设置成功: retention_time={}, retention_keep_time={}, retention_alarm_time={}",
|
|
|
+ retentionTime, retentionKeepTime, retentionAlarmTime);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理设置厕所告警参数异常: {}", e.getMessage(), e);
|
|
|
+ sendSetAlarmParamAck(-1, "{}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void sendSetAlarmParamAck(int code, String response) {
|
|
|
+ log.info("发送设置告警参数确认: code={}, response={}", code, response);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // TODO: 在MqttGateway中实现setAlarmParamAck方法
|
|
|
+ // 对应Python版本:mqtt_send.set_alarm_param_ack(code, {})
|
|
|
+ // mqttGateway.setAlarmParamAck(code, response);
|
|
|
+ log.debug("设置告警参数确认发送成功: code={}", code);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("发送设置告警参数确认异常: code={}, error={}", code, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|