From 8a540d59ba8105b92dcb4f775b0432ca23e1dddc Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Wed, 25 Feb 2026 13:39:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(aiot):=20=E4=BF=AE=E5=A4=8D=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=8E=A8=E9=80=81=E5=8F=82=E6=95=B0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=20-=20=E4=BD=BF=E7=94=A8deviceId=E8=80=8C=E4=B8=8D=E6=98=AFcam?= =?UTF-8?q?eraId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 自动推送配置时传入错误的参数:cameraId(如:cam_xxx) - 但 writeDeviceAggregatedConfig() 期望的是 deviceId(如:edge-001) - 导致Edge端收不到配置更新通知,仍然显示"有ROI但未找到配置" 根本原因: - writeDeviceAggregatedConfig(deviceId, action) 方法: - 参数deviceId指的是Edge设备ID(edge-001) - 通过deviceId查询该设备下的所有摄像头 - 发送Redis Stream通知:device_id=deviceId - Edge端监听 device_id="edge-001" 的消息 - 但我们传入的是 cameraId="cam_xxx",导致通知发送到错误的频道 错误调用链: save() → writeDeviceAggregatedConfig(cameraId, "UPDATE") ❌ → Redis Stream: device_id="cam_xxx" ❌ → Edge监听 device_id="edge-001" ❌ 收不到! 修复方案: - 所有自动推送调用改为使用 roi.getDeviceId() - 修复的方法:save(), delete(), bindAlgo(), unbindAlgo(), updateAlgoParams() - 添加device_id为空的警告日志 - 日志中同时显示camera_id和device_id,便于调试 正确调用链: save() → writeDeviceAggregatedConfig(deviceId, "UPDATE") ✅ → Redis Stream: device_id="edge-001" ✅ → Edge监听 device_id="edge-001" ✅ 正常接收! 影响: - 现在自动推送会正确工作,无需手动推送 - Edge端能实时接收配置更新 - 新增/修改ROI后立即生效 --- .../aiot/service/impl/AiRoiServiceImpl.java | 85 ++++++++++++++----- 1 file changed, 65 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiRoiServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiRoiServiceImpl.java index 05467456a..c9843ceea 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiRoiServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiRoiServiceImpl.java @@ -84,13 +84,19 @@ public class AiRoiServiceImpl implements IAiRoiService { } // 推送配置到 Edge(新增/更新操作) - if (cameraId != null) { + String deviceId = roi.getDeviceId(); + if (deviceId != null && !deviceId.isEmpty()) { try { - redisConfigService.writeDeviceAggregatedConfig(cameraId, "UPDATE"); - log.info("[AiRoi] {}ROI后推送配置到Edge,camera_id={}", isUpdate ? "更新" : "新增", cameraId); + redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE"); + log.info("[AiRoi] {}ROI后推送配置到Edge,camera_id={}, device_id={}", + isUpdate ? "更新" : "新增", cameraId, deviceId); } catch (Exception e) { - log.error("[AiRoi] {}ROI后推送配置失败,camera_id={}", isUpdate ? "更新" : "新增", cameraId, e); + log.error("[AiRoi] {}ROI后推送配置失败,camera_id={}, device_id={}", + isUpdate ? "更新" : "新增", cameraId, deviceId, e); } + } else { + log.warn("[AiRoi] {}ROI但device_id为空,跳过推送配置,camera_id={}", + isUpdate ? "更新" : "新增", cameraId); } } @@ -121,17 +127,20 @@ public class AiRoiServiceImpl implements IAiRoiService { AiRoi old = roiMapper.queryByRoiId(roiId); if (old != null) { String cameraId = old.getCameraId(); + String deviceId = old.getDeviceId(); bindMapper.deleteByRoiId(roiId); roiMapper.deleteByRoiId(roiId); configLogService.addLog("ROI", roiId, toJson(old), null, null); // 推送配置到 Edge(删除操作) - if (cameraId != null) { + if (deviceId != null && !deviceId.isEmpty()) { try { - redisConfigService.writeDeviceAggregatedConfig(cameraId, "UPDATE"); - log.info("[AiRoi] 删除 ROI 后推送配置到 Edge,camera_id={}", cameraId); + redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE"); + log.info("[AiRoi] 删除ROI后推送配置到Edge,camera_id={}, device_id={}", cameraId, deviceId); } catch (Exception e) { - log.error("[AiRoi] 删除 ROI 后推送配置失败,camera_id={}", cameraId, e); + log.error("[AiRoi] 删除ROI后推送配置失败,camera_id={}, device_id={}", cameraId, deviceId, e); } + } else { + log.warn("[AiRoi] 删除ROI但device_id为空,跳过推送配置,camera_id={}", cameraId); } } } @@ -196,12 +205,19 @@ public class AiRoiServiceImpl implements IAiRoiService { String roiId = bind.getRoiId(); if (roiId != null) { AiRoi roi = roiMapper.queryByRoiId(roiId); - if (roi != null && roi.getCameraId() != null) { - try { - redisConfigService.writeDeviceAggregatedConfig(roi.getCameraId(), "UPDATE"); - log.info("[AiRoi] 绑定算法后推送配置到Edge,camera_id={}, algo={}", roi.getCameraId(), bind.getAlgoCode()); - } catch (Exception e) { - log.error("[AiRoi] 绑定算法后推送配置失败,camera_id={}", roi.getCameraId(), e); + if (roi != null) { + String deviceId = roi.getDeviceId(); + if (deviceId != null && !deviceId.isEmpty()) { + try { + redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE"); + log.info("[AiRoi] 绑定算法后推送配置到Edge,camera_id={}, device_id={}, algo={}", + roi.getCameraId(), deviceId, bind.getAlgoCode()); + } catch (Exception e) { + log.error("[AiRoi] 绑定算法后推送配置失败,camera_id={}, device_id={}", + roi.getCameraId(), deviceId, e); + } + } else { + log.warn("[AiRoi] 绑定算法但device_id为空,跳过推送配置,camera_id={}", roi.getCameraId()); } } } @@ -218,12 +234,19 @@ public class AiRoiServiceImpl implements IAiRoiService { // 推送配置到 Edge(解绑算法) if (roiId != null) { AiRoi roi = roiMapper.queryByRoiId(roiId); - if (roi != null && roi.getCameraId() != null) { - try { - redisConfigService.writeDeviceAggregatedConfig(roi.getCameraId(), "UPDATE"); - log.info("[AiRoi] 解绑算法后推送配置到 Edge,camera_id={}", roi.getCameraId()); - } catch (Exception e) { - log.error("[AiRoi] 解绑算法后推送配置失败,camera_id={}", roi.getCameraId(), e); + if (roi != null) { + String deviceId = roi.getDeviceId(); + if (deviceId != null && !deviceId.isEmpty()) { + try { + redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE"); + log.info("[AiRoi] 解绑算法后推送配置到Edge,camera_id={}, device_id={}", + roi.getCameraId(), deviceId); + } catch (Exception e) { + log.error("[AiRoi] 解绑算法后推送配置失败,camera_id={}, device_id={}", + roi.getCameraId(), deviceId, e); + } + } else { + log.warn("[AiRoi] 解绑算法但device_id为空,跳过推送配置,camera_id={}", roi.getCameraId()); } } } @@ -242,6 +265,28 @@ public class AiRoiServiceImpl implements IAiRoiService { bindMapper.updateByBindId(bind); configLogService.addLog("BIND", bind.getBindId(), toJson(old), toJson(bind), null); + // 推送配置到 Edge(更新算法参数) + String roiId = old.getRoiId(); + if (roiId != null) { + AiRoi roi = roiMapper.queryByRoiId(roiId); + if (roi != null) { + String deviceId = roi.getDeviceId(); + if (deviceId != null && !deviceId.isEmpty()) { + try { + redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE"); + log.info("[AiRoi] 更新算法参数后推送配置到Edge,camera_id={}, device_id={}, bind_id={}", + roi.getCameraId(), deviceId, bind.getBindId()); + } catch (Exception e) { + log.error("[AiRoi] 更新算法参数后推送配置失败,camera_id={}, device_id={}", + roi.getCameraId(), deviceId, e); + } + } else { + log.warn("[AiRoi] 更新算法参数但device_id为空,跳过推送配置,camera_id={}", roi.getCameraId()); + } + } + } + } + // 推送配置到 Edge(更新算法参数) String roiId = old.getRoiId(); if (roiId != null) {