diff --git a/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/camera3d11/IotCamera3D11Codec.java b/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/camera3d11/IotCamera3D11Codec.java index e4017bd..7c29854 100644 --- a/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/camera3d11/IotCamera3D11Codec.java +++ b/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/codec/camera3d11/IotCamera3D11Codec.java @@ -10,6 +10,7 @@ import com.viewsh.module.iot.gateway.codec.camera3d11.dto.Camera3D11DataUploadRe import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -48,11 +49,17 @@ public class IotCamera3D11Codec implements IotDeviceMessageCodec { params.put("stat_start_time", payload.getStartTime()); params.put("stat_end_time", payload.getEndTime()); - // 3. 使用 endTime 作为上报时间 + // 3. 使用 time 作为上报时间,超过 24 小时的数据舍弃 LocalDateTime reportTime = LocalDateTime.now(); - if (payload.getEndTime() != null) { + if (payload.getTime() != null) { reportTime = LocalDateTime.ofInstant( - Instant.ofEpochSecond(payload.getEndTime()), ZoneId.systemDefault()); + Instant.ofEpochSecond(payload.getTime()), ZoneId.systemDefault()); + long hoursDiff = Math.abs(Duration.between(reportTime, LocalDateTime.now()).toHours()); + if (hoursDiff > 24) { + log.warn("[decode][设备时间超过24小时,舍弃数据: time={}, 时间差: {}小时]", + payload.getTime(), hoursDiff); + return null; + } } return IotDeviceMessage.requestOf(IotDeviceMessageMethodEnum.PROPERTY_POST.getMethod(), params) diff --git a/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/protocol/http/router/IotCameraUpstreamHandler.java b/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/protocol/http/router/IotCameraUpstreamHandler.java index 3214ee0..75d016d 100644 --- a/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/protocol/http/router/IotCameraUpstreamHandler.java +++ b/viewsh-module-iot/viewsh-module-iot-gateway/src/main/java/com/viewsh/module/iot/gateway/protocol/http/router/IotCameraUpstreamHandler.java @@ -130,13 +130,11 @@ public class IotCameraUpstreamHandler implements Handler { return; } - // 3. 解码并发送消息 + // 3. 解码并发送消息(解码失败或数据过期时仍返回成功,避免设备重试) IotDeviceMessage message = deviceMessageService.decodeDeviceMessage(bytes, IotCamera3D11Codec.TYPE); - if (message == null) { - IotHttpAbstractHandler.writeResponse(context, Camera3D11Resp.error("消息解码失败")); - return; + if (message != null) { + deviceMessageService.sendDeviceMessage(message, productKey, req.getSn(), null); } - deviceMessageService.sendDeviceMessage(message, productKey, req.getSn(), null); // 4. 构建响应 long currentTime = LocalDateTime.now().atZone(ZONE_SHANGHAI).toEpochSecond();