Browse Source

feat: 完善 NVR 回放、IVS 接口及部署支持

master
王寅 1 month ago
parent
commit
78390a66e7
7585 changed files with 714193 additions and 216 deletions
  1. +32
    -0
      .dockerignore
  2. +23
    -0
      .env.example
  3. +13
    -13
      .gitignore
  4. +3
    -0
      AGENTS.md
  5. +121
    -0
      Dockerfile
  6. +50
    -0
      docker-compose.yml
  7. +85
    -0
      docs/docker-deployment.md
  8. +90
    -0
      docs/hik-nvr-clip-download.md
  9. BIN
      docs/inspect-nvr已实现接口文档_v1.0.docx
  10. +156
    -0
      docs/ivs-northbound.postman_collection.json
  11. +7
    -0
      docs/sql/basedata_eqpbook_nvr_nvr_code.sql
  12. +38
    -0
      docs/sql/ivs_camera.sql
  13. +171
    -0
      docs/superpowers/plans/2026-07-13-api-documentation-coverage.md
  14. +48
    -0
      docs/superpowers/plans/2026-07-13-hik-nvr-playback-rtsp-compatibility-fix.md
  15. +341
    -0
      docs/superpowers/plans/2026-07-13-hik-nvr-playback-search.md
  16. +408
    -0
      docs/superpowers/plans/2026-07-13-hik-nvr-sdk-controlled-hls.md
  17. +61
    -0
      docs/superpowers/plans/2026-07-14-hik-nvr-playback-console.md
  18. +176
    -0
      docs/superpowers/specs/2026-07-13-hik-nvr-playback-search-design.md
  19. +124
    -0
      docs/superpowers/specs/2026-07-13-hik-nvr-sdk-controlled-hls-design.md
  20. +103
    -0
      docs/superpowers/specs/2026-07-14-hik-nvr-playback-console-design.md
  21. BIN
      docs/中国华电盐源升压站智巡接口梳理及接口文档_v0.1.docx
  22. +315
    -0
      export-inspect-nvr-amd64.bat
  23. BIN
      lib.rar
  24. +1
    -0
      pom.xml
  25. +11
    -0
      sdkLog/2025-08-08.log
  26. +22
    -0
      sdkLog/2025-08-15.log
  27. +22
    -0
      sdkLog/2025-08-18.log
  28. +11
    -0
      sdkLog/2025-08-31.log
  29. +33
    -0
      sdkLog/2025-09-01.log
  30. +55
    -0
      sdkLog/2025-09-02.log
  31. +33
    -0
      sdkLog/2025-09-03.log
  32. +11
    -0
      sdkLog/2025-09-16.log
  33. +263
    -0
      sdkLog/2026-07-13.log
  34. +385
    -0
      sdkLog/2026-07-14.log
  35. +275
    -0
      sdkLog/2026-07-15.log
  36. +143
    -0
      sdkLog/2026-07-16.log
  37. +66
    -0
      sdkLog/2026-07-17.log
  38. +11
    -0
      sdkLog/2026-07-21.log
  39. +22
    -0
      sdkLog/2026-08-04.log
  40. +20
    -4
      sdkLog/SdkLog_1_W.log
  41. +10
    -4
      src/main/java/com/inspect/nvr/config/DahuaConfig.java
  42. +26
    -5
      src/main/java/com/inspect/nvr/config/HikLibConfig.java
  43. +10
    -15
      src/main/java/com/inspect/nvr/controller/CameraController.java
  44. +5
    -9
      src/main/java/com/inspect/nvr/controller/DahuaController.java
  45. +4
    -1
      src/main/java/com/inspect/nvr/controller/FileController.java
  46. +23
    -26
      src/main/java/com/inspect/nvr/controller/InfraredController.java
  47. +88
    -27
      src/main/java/com/inspect/nvr/controller/IvsCameraController.java
  48. +466
    -18
      src/main/java/com/inspect/nvr/controller/IvsServerController.java
  49. +209
    -0
      src/main/java/com/inspect/nvr/controller/Test.java
  50. +0
    -3
      src/main/java/com/inspect/nvr/domain/Infrared/InfraPictureInfo.java
  51. +0
    -2
      src/main/java/com/inspect/nvr/domain/Infrared/InfraredBox.java
  52. +1
    -2
      src/main/java/com/inspect/nvr/domain/Infrared/InfraredInfo.java
  53. +2
    -5
      src/main/java/com/inspect/nvr/domain/Infrared/NvrInfo.java
  54. +5
    -5
      src/main/java/com/inspect/nvr/domain/Infrared/TemperatureData.java
  55. +13
    -0
      src/main/java/com/inspect/nvr/domain/common/AjaxResultResponse.java
  56. +11
    -0
      src/main/java/com/inspect/nvr/domain/common/FileUploadRequest.java
  57. +1
    -1
      src/main/java/com/inspect/nvr/domain/device/SnapshotCommandResult.java
  58. +18
    -16
      src/main/java/com/inspect/nvr/domain/device/SnapshotInfoListParam.java
  59. +4
    -3
      src/main/java/com/inspect/nvr/domain/device/SnapshotInfoListResult.java
  60. +3
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsChanSnapVo.java
  61. +1
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsDevChanListVo.java
  62. +5
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsDevChanSnapVo.java
  63. +64
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsDeviceListResponse.java
  64. +20
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsOperationResultView.java
  65. +24
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsPresetAddRequest.java
  66. +39
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsPresetModifyRequest.java
  67. +22
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsPresetOperationView.java
  68. +23
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsPresetUserPasswordRequest.java
  69. +31
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsPtzControlRequest.java
  70. +23
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsPtzControlResponse.java
  71. +29
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsRtspUrlResponse.java
  72. +29
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsSnapshotCommandResponse.java
  73. +1
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsSnapshotView.java
  74. +1
    -1
      src/main/java/com/inspect/nvr/domain/ivs/IvsVideoRtspView.java
  75. +4
    -0
      src/main/java/com/inspect/nvr/domain/ivs/IvsVo.java
  76. +2
    -0
      src/main/java/com/inspect/nvr/domain/ivs/Login.java
  77. +47
    -3
      src/main/java/com/inspect/nvr/domain/ivs/RealMediaURLParam.java
  78. +82
    -0
      src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackController.java
  79. +47
    -0
      src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackExceptionHandler.java
  80. +83
    -0
      src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackHlsController.java
  81. +88
    -0
      src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackUiController.java
  82. +165
    -0
      src/main/java/com/inspect/nvr/hik/controller/HikNvrUiActionController.java
  83. +64
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrCameraTarget.java
  84. +40
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrLiveStreamResponse.java
  85. +31
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackClipRequest.java
  86. +19
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackErrorResponse.java
  87. +15
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlAction.java
  88. +31
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlRequest.java
  89. +39
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsSession.java
  90. +15
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsStatus.java
  91. +21
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRecord.java
  92. +43
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRequest.java
  93. +44
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackResponse.java
  94. +97
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java
  95. +25
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiSessionRequest.java
  96. +47
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPresetListResponse.java
  97. +15
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrPtzMode.java
  98. +40
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrUiActionRequest.java
  99. +22
    -0
      src/main/java/com/inspect/nvr/hik/domain/HikNvrUiActionResponse.java
  100. +78
    -0
      src/main/java/com/inspect/nvr/hik/exception/HikNvrPlaybackException.java

+ 32
- 0
.dockerignore View File

@ -0,0 +1,32 @@
# 默认不向 Docker 构建器发送任何文件,再按镜像构建需要逐项放行。
*
!Dockerfile
!pom.xml
!deploy/
!deploy/docker/
!deploy/docker/maven-settings.xml
!src/
!src/**
!lib/
!lib/jna.jar
!lib/examples.jar
!lib/INetSDK.jar
!lib/DemoLocalCfg.json
!lib/DeviceCfg.json
!lib/LocalSensorAdd.dat
!lib/license.dat
# 仅发送两套 Linux x86_64 SDK 的运行库,开发示例和文档不进入构建上下文。
!vendor-sdk/
!vendor-sdk/HCNetSDKV6.1.11.5_build20251204_linux64_ZH_20260320152102/
!vendor-sdk/HCNetSDKV6.1.11.5_build20251204_linux64_ZH_20260320152102/HCNetSDKV6.1.11.5_build20251204_linux64_ZH/
!vendor-sdk/HCNetSDKV6.1.11.5_build20251204_linux64_ZH_20260320152102/HCNetSDKV6.1.11.5_build20251204_linux64_ZH/库文件/
!vendor-sdk/HCNetSDKV6.1.11.5_build20251204_linux64_ZH_20260320152102/HCNetSDKV6.1.11.5_build20251204_linux64_ZH/库文件/**
!vendor-sdk/General_NetSDK_ChnEng_JAVA_Linux64_IS_V3.061.0000000.0.R.260511/
!vendor-sdk/General_NetSDK_ChnEng_JAVA_Linux64_IS_V3.061.0000000.0.R.260511/libs/
!vendor-sdk/General_NetSDK_ChnEng_JAVA_Linux64_IS_V3.061.0000000.0.R.260511/libs/linux64/
!vendor-sdk/General_NetSDK_ChnEng_JAVA_Linux64_IS_V3.061.0000000.0.R.260511/libs/linux64/**

+ 23
- 0
.env.example View File

@ -0,0 +1,23 @@
# Docker Compose host settings
TZ=Asia/Shanghai
BIND_ADDRESS=0.0.0.0
APP_PORT=8081
# Remote ZLMediaKit. RTMP is used by the container to publish; HTTP is returned to browsers.
ZLM_RTMP_BASE_URL=rtmp://192.168.1.200:1935
ZLM_HTTP_BASE_URL=http://192.168.1.200:18081
# Maven mirror used while building the image
MAVEN_MIRROR_URL=https://maven.aliyun.com/repository/public
# MAVEN_MIRROR_URL=https://repo.maven.apache.org/maven2
# Remote MySQL; no local MySQL or Redis container is started
DB_URL=jdbc:mysql://192.168.1.116:4406/inspect_shaoxing_260511?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
DB_USERNAME=root
DB_PASSWORD=remote_mysql_change_me
# NVR names, IPs, SDK/RTSP/HTTP ports and credentials are maintained in basedata_eqpbook_nvr.
# Camera names, ownership and direct IPs are maintained in ivs_camera.
# Container memory and native SDK library settings
JAVA_TOOL_OPTIONS=-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -Djava.library.path=/app/lib:/app/lib/HCNetSDKCom:/app/lib/linux64

+ 13
- 13
.gitignore View File

@ -1,20 +1,17 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
# 忽略所有以 . 开头的文件夹,但保留需要入库的点文件
.*/
/.claude-terminal
# 保留 Maven Wrapper(需逐级取消忽略,否则父目录被忽略后无法重新包含文件)
!.mvn/
!.mvn/wrapper/
!.mvn/wrapper/maven-wrapper.jar
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
@ -24,12 +21,15 @@ target/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
/logs/
### VS Code ###
.vscode/
# 本机部署与离线交付产物
/deploy/
/deploy-package/
# Docker Compose 本机环境变量,模板 .env.example 保留在仓库中
/.env

+ 3
- 0
AGENTS.md View File

@ -0,0 +1,3 @@
# 项目规则
- 如果需要进行打包或构建 Docker 镜像,必须先删除原先的同名镜像,再执行构建。

+ 121
- 0
Dockerfile View File

@ -0,0 +1,121 @@
# syntax=docker/dockerfile:1.7
# 默认通过已验证的国内代理读取 FFmpeg;导出脚本还会按相同摘要自动选择备用代理。
ARG FFMPEG_IMAGE=docker.1ms.run/mwader/static-ffmpeg:6.1
# 构建阶段使用完整的 Maven + JDK 8,最终镜像不会保留 Maven 和源码。
FROM --platform=$BUILDPLATFORM maven:3.9.9-eclipse-temurin-8 AS builder
ARG MAVEN_MIRROR_URL=https://maven.aliyun.com/repository/public
ENV MAVEN_MIRROR_URL=${MAVEN_MIRROR_URL}
WORKDIR /workspace
# Maven 镜像地址通过构建参数注入,国内默认使用阿里云,也可切回 Maven Central。
COPY deploy/docker/maven-settings.xml /tmp/maven-settings.xml
# 三个厂商 JAR 未发布到公共 Maven 仓库,先安装到镜像内的本地仓库。
# 这里使用普通构建层持久化仓库;若改用 BuildKit 缓存挂载,安装层命中缓存但
# 挂载内容已被回收时,后续 Maven 会错误地转向公共镜像查找这些私有依赖。
COPY lib/jna.jar lib/examples.jar lib/INetSDK.jar /tmp/vendor/
RUN mvn -s /tmp/maven-settings.xml -B -ntp install:install-file \
-Dfile=/tmp/vendor/jna.jar \
-DgroupId=net.java.jna \
-DartifactId=jna \
-Dversion=1.0.0 \
-Dpackaging=jar \
&& mvn -s /tmp/maven-settings.xml -B -ntp install:install-file \
-Dfile=/tmp/vendor/examples.jar \
-DgroupId=net.java.examples \
-DartifactId=examples \
-Dversion=1.0.0 \
-Dpackaging=jar \
&& mvn -s /tmp/maven-settings.xml -B -ntp install:install-file \
-Dfile=/tmp/vendor/INetSDK.jar \
-DgroupId=net.dahua.netsdk \
-DartifactId=dahua-netsdk-jni \
-Dversion=1.0.0 \
-Dpackaging=jar
# 先下载依赖,使普通源码变更能够复用 Maven 依赖层。
COPY pom.xml ./
RUN mvn -s /tmp/maven-settings.xml -B -ntp -DskipTests \
-Dmaven.wagon.http.retryHandler.count=5 \
dependency:go-offline
COPY src ./src
RUN mvn -s /tmp/maven-settings.xml -B -ntp -DskipTests \
-Dmaven.wagon.http.retryHandler.count=5 \
clean package
# 直接复用预编译的静态 FFmpeg,使视频处理与厂商 SDK 均在 x86_64 上原生运行。
FROM --platform=$TARGETPLATFORM ${FFMPEG_IMAGE} AS ffmpeg
# 厂商 Linux64 SDK 依赖 glibc,因此运行阶段使用 Ubuntu 系 JRE 镜像。
FROM eclipse-temurin:8-jre-focal AS runtime
ARG TARGETARCH
ARG HIK_SDK_ROOT=vendor-sdk/HCNetSDKV6.1.11.5_build20251204_linux64_ZH_20260320152102/HCNetSDKV6.1.11.5_build20251204_linux64_ZH/库文件
ARG DAHUA_SDK_ROOT=vendor-sdk/General_NetSDK_ChnEng_JAVA_Linux64_IS_V3.061.0000000.0.R.260511/libs/linux64
ARG UBUNTU_MIRROR=https://mirrors.aliyun.com/ubuntu
# 两套厂商库均为 x86_64,构建时阻止误选其他平台导致 JNA 加载失败。
RUN test "${TARGETARCH}" = "amd64" \
|| (echo "inspect-nvr 当前 Docker 镜像只支持 linux/amd64:vendor-sdk 中的海康和大华 SDK 均为 x86_64。" >&2; exit 1)
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Shanghai
# 将 Ubuntu 官方软件源替换为国内阿里云镜像,避免构建时因跨境链路超时或 502 中断。
RUN sed -i \
-e "s|http://archive.ubuntu.com/ubuntu|${UBUNTU_MIRROR}|g" \
-e "s|http://security.ubuntu.com/ubuntu|${UBUNTU_MIRROR}|g" \
/etc/apt/sources.list
# 海康播放与渲染组件会动态加载 X11、OpenGL 和 EGL;即使无桌面环境也需保留这些运行库。
RUN apt-get -o Acquire::Retries=5 update \
&& apt-get -o Acquire::Retries=5 install -y --no-install-recommends libx11-6 libgl1 libegl1 \
&& rm -rf /var/lib/apt/lists/*
# 语音对讲与视频输出组件还会按需加载 ALSA 和 XVideo,统一放入运行镜像避免功能触发时才报缺库。
RUN apt-get -o Acquire::Retries=5 update \
&& apt-get -o Acquire::Retries=5 install -y --no-install-recommends libasound2 libxv1 \
&& rm -rf /var/lib/apt/lists/*
# 静态 FFmpeg 不依赖运行镜像中的共享库,适合跨架构构建和部署。
COPY --from=ffmpeg /ffmpeg /usr/bin/ffmpeg
COPY --from=ffmpeg /ffprobe /usr/bin/ffprobe
RUN groupadd --gid 10001 inspect-nvr \
&& useradd --uid 10001 --gid inspect-nvr --home-dir /app --shell /usr/sbin/nologin inspect-nvr \
&& mkdir -p /app/lib/HCNetSDKCom /app/lib/linux64 \
/app/images /app/sdkLog /app/sdklog /app/target /data/logs/inspect-nvr \
&& chown -R inspect-nvr:inspect-nvr /app /data/logs
WORKDIR /app
COPY --from=builder --chown=inspect-nvr:inspect-nvr /workspace/target/inspect-nvr.jar ./app.jar
# 直接从厂商 Linux64 开发包复制 x86_64 运行库,避免混入旧 ARM64 库或 Windows DLL。
COPY --chown=inspect-nvr:inspect-nvr ${HIK_SDK_ROOT}/ ./lib/
COPY --chown=inspect-nvr:inspect-nvr ${DAHUA_SDK_ROOT}/ ./lib/linux64/
COPY --chown=inspect-nvr:inspect-nvr \
lib/DemoLocalCfg.json \
lib/DeviceCfg.json \
lib/LocalSensorAdd.dat \
lib/license.dat \
./lib/
# JNA 除了按绝对路径加载主库,还会从这些目录解析 SDK 的级联依赖。
ENV LD_LIBRARY_PATH=/app/lib:/app/lib/HCNetSDKCom:/app/lib/linux64 \
JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -Djava.library.path=/app/lib:/app/lib/HCNetSDKCom:/app/lib/linux64"
USER inspect-nvr
EXPOSE 8081
HEALTHCHECK --interval=30s --timeout=5s --start-period=90s --retries=5 \
CMD curl --fail --silent --show-error http://127.0.0.1:8081/ > /dev/null || exit 1
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

+ 50
- 0
docker-compose.yml View File

@ -0,0 +1,50 @@
name: inspect-nvr
services:
inspect-nvr:
platform: linux/amd64
build:
context: .
dockerfile: Dockerfile
args:
FFMPEG_IMAGE: ${FFMPEG_IMAGE:-docker.1ms.run/mwader/static-ffmpeg:6.1}
MAVEN_MIRROR_URL: ${MAVEN_MIRROR_URL:-https://maven.aliyun.com/repository/public}
image: inspect-nvr:local
container_name: inspect-nvr-app
restart: unless-stopped
environment:
TZ: ${TZ:-Asia/Shanghai}
SPRING_PROFILES_ACTIVE: docker
SERVER_PORT: 8081
DB_URL: ${DB_URL:?DB_URL_required_in_.env}
DB_USERNAME: ${DB_USERNAME:?DB_USERNAME_required_in_.env}
DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD_required_in_.env}
FFMPEG_PATH: /usr/bin/ffmpeg
ZLM_RTMP_BASE_URL: ${ZLM_RTMP_BASE_URL:?remote_ZLM_RTMP_BASE_URL_required_in_.env}
ZLM_HTTP_BASE_URL: ${ZLM_HTTP_BASE_URL:?remote_ZLM_HTTP_BASE_URL_required_in_.env}
JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS:--XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -Djava.library.path=/app/lib:/app/lib/HCNetSDKCom:/app/lib/linux64}
REDIS_HOST: ${REDIS_HOST:?REDIS_HOST_required_in_.env}
REDIS_PORT: ${REDIS_PORT:-6379}
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
REDIS_DATABASE: ${REDIS_DATABASE:-0}
ports:
- "${BIND_ADDRESS:-0.0.0.0}:${APP_PORT:-8081}:8081"
volumes:
- app_logs:/data/logs
- app_sdk_logs:/app/sdkLog
- app_dahua_sdk_logs:/app/sdklog
- app_images:/app/images
- app_runtime:/app/target
networks:
- inspect-nvr
networks:
inspect-nvr:
name: inspect-nvr
volumes:
app_logs:
app_sdk_logs:
app_dahua_sdk_logs:
app_images:
app_runtime:

+ 85
- 0
docs/docker-deployment.md View File

@ -0,0 +1,85 @@
# Docker Compose 部署
该部署会构建 `inspect-nvr` 应用镜像,并启动应用与 ZLMediaKit。Java 8、FFmpeg、海康 SDK 与大华 SDK 均位于应用镜像内,宿主机不需要另外安装 Java 或 Maven。业务数据直接连接远程 MySQL,Compose 不启动 MySQL 和 Redis 容器。
## 1. 准备配置
在 Ubuntu 项目根目录复制环境变量模板:
```bash
cp .env.example .env
```
至少修改 `.env` 中的 `DB_URL`、`DB_USERNAME`、`DB_PASSWORD` 和所有带 `change_me` 的密钥。远程 MySQL 必须允许 Ubuntu 宿主机所在地址连接。NVR 名称、IP、SDK/RTSP/HTTP 端口及账号密码全部维护在远程库的 `basedata_eqpbook_nvr` 表,摄像机维护在 `ivs_camera`,不再使用 `HIK_NVR_*` 环境变量。`ZLM_API_SECRET` 会在容器启动时写入临时配置,避免使用 ZLMediaKit 已禁止的公开示例密钥。若浏览器从局域网其他电脑访问,还要把 `ZLM_HTTP_BASE_URL` 改为 Docker 宿主机可访问的地址,例如:
```text
ZLM_HTTP_BASE_URL=http://192.168.1.20:18081
```
模板默认使用国内 Maven 镜像源。部署环境在海外时,可按 `.env.example` 中的注释切回 Maven Central。FFmpeg 与海康、大华 SDK 均使用 x86_64 版本,在 amd64 宿主机上不需要 QEMU 模拟。
## 2. 构建并启动
```bash
docker compose build inspect-nvr
docker compose up -d
docker compose ps
docker compose logs -f inspect-nvr
```
服务启动后可访问:
- 应用首页:`http://localhost:8081/`
- Swagger UI:`http://localhost:8081/swagger-ui/index.html`
- ZLMediaKit HTTP/HLS:`http://localhost:18081/`
停止服务:
```bash
docker compose down
```
Compose 使用命名卷保存 HLS、应用日志、SDK 日志和抓图数据,普通 `docker compose down` 不会删除这些数据。
Compose 不占用宿主机的 `3306`、`6379` 端口。应用通过 `.env` 中的连接参数直接访问远程 MySQL。
## 3. 数据库说明
远程 MySQL 至少需要包含项目 Mapper 使用的以下表:
- `basedata_eqpbook_nvr`
- `ivs_camera`
缺表时可参考 `deploy/mysql/init/001-basedata-eqpbook-nvr.sql``docs/sql/ivs_camera.sql`,但正式库应按现有数据库迁移流程执行,不要由容器自动建表。
`basedata_eqpbook_nvr` 中可以维护多台 NVR。页面会读取全部启用记录,并按各自 `nvr_code``#` 后缀关联 `ivs_camera.nvr_code`。每台可操作 NVR 必须配置名称、IP、SDK/RTSP/HTTP 端口及账号密码。可在远程数据库中检查:
```sql
SELECT nvr_id, patrol_device_name, nvr_code, nvr_ip,
sdk_port, rtsp_port, http_port, username, enabled
FROM basedata_eqpbook_nvr
WHERE enabled IS NULL OR enabled <> 0
ORDER BY nvr_id;
```
当前 Compose 不提供 Redis。项目中少量历史接口仍包含 Redis 缓存调用;不使用这些旧接口时不影响应用启动和当前海康 NVR 页面链路。若后续需要这些接口,应再接入外部 Redis 或移除对应缓存逻辑。
## 4. CPU 架构限制
Compose 将应用固定为 `linux/amd64`,并从 `vendor-sdk` 复制海康 HCNetSDK Linux64 与大华 NetSDK Linux64:
- x86_64 Ubuntu/Linux 服务器可原生构建和运行,不需要安装 QEMU。
- x86_64 Windows/macOS 的 Docker Desktop 可直接运行 Linux amd64 容器。
- ARM64 服务器不能运行当前镜像;如需 ARM64,应使用对应架构的两套厂商 SDK 另行构建镜像,不能混用 `.so`
## 5. 常用排查命令
```bash
docker compose ps
docker compose logs --tail 200 inspect-nvr
docker compose exec inspect-nvr java -version
docker compose exec inspect-nvr ffmpeg -version
docker compose exec inspect-nvr sh -c 'echo $LD_LIBRARY_PATH'
```
应用必须能从容器网络访问 NVR 的 SDK、RTSP 和 HTTP 端口。若宿主机能访问设备但容器不能访问,应优先检查 Docker Desktop/服务器路由、防火墙和设备所在网段,而不是修改 Java 配置。

+ 90
- 0
docs/hik-nvr-clip-download.md View File

@ -0,0 +1,90 @@
# 海康 NVR 一分钟录像下载接口
## 接口
`POST /hik/nvr/playback/clips/download`
接口以 `centerTime` 为中心,默认下载前 30 秒和后 30 秒,总计 1 分钟。NVR
端口、账号和密码全部从 `basedata_eqpbook_nvr` 读取;请求只提交共用设备树中的
`nvrIp + channel`
请求示例:
```json
{
"nvrIp": "192.168.1.249",
"channel": 1,
"centerTime": "2026-07-28 11:55:00"
}
```
该请求对应的录像范围为:
```text
2026-07-28 11:54:30 - 2026-07-28 11:55:30
```
`streamType` 默认是 `1`(主码流);`beforeSeconds` 和 `afterSeconds` 默认都是
`30`,也可以显式传入,单侧允许范围为 `0-300` 秒。
## PowerShell 下载命令
Windows PowerShell 中的 `curl` 可能是 `Invoke-WebRequest` 的别名,因此需要明确
使用 `curl.exe`
```powershell
curl.exe --fail-with-body -X POST "http://localhost:28081/hik/nvr/playback/clips/download" `
-H "Content-Type: application/json" `
--data-raw '{"nvrIp":"192.168.1.249","channel":1,"centerTime":"2026-07-28 11:55:00"}' `
--output "hik-clip-20260728-115500.mp4"
```
也可以使用 PowerShell 原生命令:
```powershell
$body = @{
nvrIp = "192.168.1.249"
channel = 1
centerTime = "2026-07-28 11:55:00"
} | ConvertTo-Json
Invoke-WebRequest `
-Method Post `
-Uri "http://localhost:28081/hik/nvr/playback/clips/download" `
-ContentType "application/json" `
-Body $body `
-OutFile "hik-clip-20260728-115500.mp4"
```
## 历史回放页面下载
历史回放页面顶部查询区已增加“下载时刻”和“下载1分钟”,并继续复用外层共用
设备树当前选择的 `nvrIp + channel`
1. 在“回放日期”中选择录像日期。
2. 在“下载时刻(前后各30秒)”中填写需要下载的时刻,例如 `11:55:00`
3. 点击“下载1分钟”,页面会下载 `11:54:30 - 11:55:30` 的 MP4。
如果“下载时刻”留空,页面会使用当前正在回放的设备时刻作为中心。下载期间不会
停止已有的历史回放会话;同一页面一次只会提交一个下载任务。
目标时间尚未到达时,页面会在发送请求前弹窗提醒;直接调用接口也会被后端拒绝。
目标时间没有录像、录像中间断档或前后不足 30 秒时,页面会弹窗展示后端返回的
具体原因,不会下载空文件或不完整片段。
## 处理规则
- 先查询目标一分钟是否由一段连续录像完整覆盖。
- 未来中心时刻返回 `400`
- 没有录像时返回 `404`
- 录像中间断档或前后不足 30 秒时返回 `409`,不会生成伪造的一分钟文件。
- 海康 SDK 把录像下载到服务端独立临时目录。
- FFmpeg 优先保留视频原码流并将音频转换为 AAC,封装成支持快速起播的 MP4。
- 音频封装失败时自动降级为纯视频 MP4。
- HTTP 下载完成、处理失败或客户端中途断开后,服务端都会清理该请求的临时文件。
Swagger UI 中可查看完整字段和错误响应:
```text
http://localhost:28081/swagger-ui/index.html
```

BIN
docs/inspect-nvr已实现接口文档_v1.0.docx View File


+ 156
- 0
docs/ivs-northbound.postman_collection.json View File

@ -0,0 +1,156 @@
{
"info": {
"_postman_id": "7f8d0e7b-4b3d-4af9-9d99-ivs-northbound",
"name": "inspect-nvr IVS\u5317\u5411\u63a5\u53e3",
"description": "inspect-nvr\\u9879\\u76eeIVS\\u5317\\u5411\\u63a5\\u53e3\\u96c6\\u5408\\u3002",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"variable": [
{"key": "baseUrl", "value": "http://127.0.0.1:8080", "type": "string"},
{"key": "cameraCode", "value": "22078710632508667001", "type": "string"},
{"key": "domainCode", "value": "ca837453aa964798abe9ff241c52c386", "type": "string"},
{"key": "fullCameraCode", "value": "22078710632508667001#ca837453aa964798abe9ff241c52c386", "type": "string"},
{"key": "startTime", "value": "20260715000000", "type": "string"},
{"key": "endTime", "value": "20260715235959", "type": "string"},
{"key": "fromIndex", "value": "1", "type": "string"},
{"key": "toIndex", "value": "10", "type": "string"},
{"key": "recordTime", "value": "300", "type": "string"},
{"key": "presetIndex", "value": "1", "type": "string"},
{"key": "playbackHandle", "value": "1", "type": "string"},
{"key": "userName", "value": "admin", "type": "string"},
{"key": "password", "value": "ChangeMe123456", "type": "string"},
{"key": "taskId", "value": "00000000000000000000000000000000", "type": "string"},
{"key": "snapType", "value": "4", "type": "string"}
],
"item": [
{
"name": "00 \u9274\u6743\u4e0e\u4f1a\u8bdd",
"item": [
{
"name": "\u767b\u5f55",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"userName\\\": \\\"{{userName}}\\\",\\n \\\"password\\\": \\\"{{password}}\\\",\\n \\\"loginLocation\\\": \\\"0\\\"\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/loginInfo/login/v1.0"
}
},
{
"name": "\u4f1a\u8bdd\u4fdd\u6d3b",
"request": {"method": "GET", "header": [], "url": "{{baseUrl}}/common/keepAlive"}
},
{
"name": "\u4fee\u6539\u9884\u7f6e\u8d26\u53f7\u5bc6\u7801",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"userName\\\": \\\"{{userName}}\\\",\\n \\\"password\\\": \\\"{{password}}\\\"\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/loginInfo/modifyPresetUserPwd/v1.0"
}
}
]
},
{
"name": "01 \u8bbe\u5907\u4e0e\u5b9e\u65f6\u89c6\u9891",
"item": [
{"name": "\u67e5\u8be2\u5b50\u8bbe\u5907\u5217\u8868", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/device/deviceList/v1.0?deviceType=35&fromIndex={{fromIndex}}&toIndex={{toIndex}}&groupMode=0"}},
{
"name": "\u83b7\u53d6\u5b9e\u65f6RTSP\u5730\u5740",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"cameraCode\\\": \\\"{{fullCameraCode}}\\\",\\n \\\"mediaURLParam\\\": {\\n \\\"serviceType\\\": 1,\\n \\\"packProtocolType\\\": 1,\\n \\\"streamType\\\": 1,\\n \\\"protocolType\\\": 2,\\n \\\"transMode\\\": 0,\\n \\\"broadCastType\\\": 0,\\n \\\"clientType\\\": 1\\n }\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/video/rtspurl/v1.0"
}
},
{
"name": "\u83b7\u53d6\u5f55\u50cfRTSP\u5730\u5740",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"cameraCode\\\": \\\"{{fullCameraCode}}\\\",\\n \\\"mediaURLParam\\\": {\\n \\\"serviceType\\\": 4,\\n \\\"streamType\\\": 1,\\n \\\"protocolType\\\": 2,\\n \\\"timeSpan\\\": {\\n \\\"startTime\\\": \\\"{{startTime}}\\\",\\n \\\"endTime\\\": \\\"{{endTime}}\\\"\\n }\\n }\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/api/record/url"
}
}
]
},
{
"name": "02 \u5f55\u50cf\u7ba1\u7406",
"item": [
{"name": "\u67e5\u8be2\u5e73\u53f0\u5f55\u50cf", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/recordlist/0/{{cameraCode}}/{{domainCode}}/{{startTime}}/{{endTime}}/{{fromIndex}}/{{toIndex}}"}},
{"name": "\u5f00\u59cb\u5e73\u53f0\u5f55\u50cf", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/startplatformrecord/{{recordTime}}/{{cameraCode}}/{{domainCode}}"}},
{"name": "\u505c\u6b62\u5e73\u53f0\u5f55\u50cf", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/stopplatformrecord/{{cameraCode}}/{{domainCode}}"}},
{"name": "\u505c\u6b62\u5e73\u53f0\u56de\u653e", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/playback/stopplatformplaybackbyip/{{playbackHandle}}"}}
]
},
{
"name": "03 \u9884\u7f6e\u4f4d",
"item": [
{
"name": "\u67e5\u8be2\u9884\u7f6e\u4f4d\u5217\u8868",
"request": {
"method": "GET",
"header": [],
"url": "{{baseUrl}}/device/ptzpresetlist/{{cameraCode}}/{{domainCode}}",
"description": "cameraCode is before #; domainCode is after #."
}
},
{
"name": "\u4e91\u53f0\u63a7\u5236/\u8c03\u7528\u9884\u7f6e\u4f4d",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"cameraCode\\\": \\\"{{fullCameraCode}}\\\",\\n \\\"controlCode\\\": 11,\\n \\\"controlPara1\\\": \\\"{{presetIndex}}\\\",\\n \\\"controlPara2\\\": \\\"\\\"\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/device/ptzcontrol"
}
},
{
"name": "\u65b0\u589e\u9884\u7f6e\u4f4d\uff08\u4fdd\u5b58\u5f53\u524d\u4f4d\u7f6e\uff09",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"cameraCode\\\": \\\"{{fullCameraCode}}\\\",\\n \\\"presetName\\\": \\\"\\u73b0\\u573a\\u6d4b\\u8bd5\\u9884\\u7f6e\\u4f4d\\\",\\n \\\"focusSwitch\\\": 0\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/ptz/presetposition/v1.0"
}
},
{
"name": "\u4fee\u6539\u9884\u7f6e\u4f4d\u540d\u79f0",
"request": {
"method": "PUT",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"cameraCode\\\": \\\"{{fullCameraCode}}\\\",\\n \\\"ptzPresetInfo\\\": {\\n \\\"presetIndex\\\": {{presetIndex}},\\n \\\"presetName\\\": \\\"\\u8bbe\\u5907\\u5168\\u666f\\\",\\n \\\"focusSwitch\\\": 0\\n }\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/ptz/presetposition/v1.0"
}
},
{"name": "\u5220\u9664\u9884\u7f6e\u4f4d", "request": {"method": "DELETE", "header": [], "url": "{{baseUrl}}/ptz/presetposition/{{cameraCode}}/{{domainCode}}/{{presetIndex}}/v1.0"}}
]
},
{
"name": "04 \u6293\u56fe",
"item": [
{"name": "\u521b\u5efa\u5e73\u53f0\u6293\u56fe\u4efb\u52a1", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/platformSnapshot/{{cameraCode}}/{{domainCode}}"}},
{"name": "\u65e7\u7248\u521b\u5efa\u5e73\u53f0\u6293\u56fe", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/platformSnapshot2/{{cameraCode}}/{{domainCode}}"}},
{
"name": "\u6309\u4efb\u52a1ID\u67e5\u8be2\u6293\u56fe\u5217\u8868",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"domainCode\\\": \\\"{{domainCode}}\\\",\\n \\\"cameraCode\\\": \\\"{{cameraCode}}\\\",\\n \\\"taskID\\\": \\\"{{taskId}}\\\"\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/platform/snapshotList"
}
},
{
"name": "\u6309\u660e\u7ec6\u6761\u4ef6\u67e5\u8be2\u6293\u56fe\u5217\u8868",
"request": {
"method": "POST",
"header": [{"key": "Content-Type", "value": "application/json"}],
"body": {"mode": "raw", "raw": "{\\n \\\"domainCode\\\": \\\"{{domainCode}}\\\",\\n \\\"cameraCode\\\": \\\"{{cameraCode}}\\\",\\n \\\"snapshotDetailInfo\\\": {\\n \\\"startTime\\\": \\\"{{startTime}}\\\",\\n \\\"endTime\\\": \\\"{{endTime}}\\\",\\n \\\"fromIndex\\\": 1,\\n \\\"toIndex\\\": 10,\\n \\\"snapType\\\": {{snapType}}\\n }\\n}", "options": {"raw": {"language": "json"}}},
"url": "{{baseUrl}}/platform/snapshotList2"
}
},
{"name": "\u4e0b\u8f7d\u5e73\u53f0\u6293\u56fe\u56fe\u7247", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/snapshot/{{taskId}}"}},
{"name": "\u67e5\u8be2\u6293\u56fe\u5217\u8868\uff08\u65e7\u7248\u8def\u5f84\uff09", "request": {"method": "GET", "header": [], "url": "{{baseUrl}}/platform/snapshotlist/{{cameraCode}}/{{domainCode}}/{{startTime}}/{{endTime}}/{{fromIndex}}/{{toIndex}}/{{snapType}}"}}
]
}
]
}

+ 7
- 0
docs/sql/basedata_eqpbook_nvr_nvr_code.sql View File

@ -0,0 +1,7 @@
-- 为 NVR 增加 IVS 设备编码。
-- nvr_code 格式:17 位数字前缀 + '#' + 32 位十六进制随机串。
ALTER TABLE `basedata_eqpbook_nvr`
ADD COLUMN `nvr_code` varchar(64) DEFAULT NULL COMMENT 'IVS NVR 编码' AFTER `vendor`;
ALTER TABLE `basedata_eqpbook_nvr`
ADD UNIQUE KEY `uk_basedata_eqpbook_nvr_nvr_code` (`nvr_code`);

+ 38
- 0
docs/sql/ivs_camera.sql View File

@ -0,0 +1,38 @@
-- IVS 摄像头信息表
-- 说明:使用 code 作为 IVS 设备唯一编码;脚本可重复执行,不会覆盖已有数据。
CREATE TABLE IF NOT EXISTS `ivs_camera` (
`code` varchar(128) NOT NULL COMMENT '摄像头编码',
`name` varchar(255) DEFAULT NULL COMMENT '摄像头名称',
`dev_group_code` varchar(128) DEFAULT NULL COMMENT '设备分组编码',
`parent_code` varchar(128) DEFAULT NULL COMMENT '上级设备编码',
`domain_code` varchar(128) DEFAULT NULL COMMENT '域编码',
`dev_model_type` varchar(128) DEFAULT NULL COMMENT '设备型号',
`vendor_type` varchar(64) DEFAULT NULL COMMENT '厂商类型',
`dev_form_type` int DEFAULT NULL COMMENT '设备形态类型',
`type` int DEFAULT NULL COMMENT '设备类型',
`camera_location` varchar(255) DEFAULT NULL COMMENT '摄像头位置',
`camera_status` tinyint DEFAULT NULL COMMENT '摄像头状态',
`status` tinyint DEFAULT NULL COMMENT '设备状态',
`net_type` tinyint DEFAULT NULL COMMENT '网络类型',
`support_intelligent` tinyint DEFAULT NULL COMMENT '是否支持智能能力',
`enable_voice` tinyint DEFAULT NULL COMMENT '是否启用语音',
`nvr_code` varchar(128) DEFAULT NULL COMMENT '所属 NVR 编码',
`dev_create_time` varchar(14) DEFAULT NULL COMMENT '设备创建时间,格式 yyyyMMddHHmmss',
`is_ex_domain` tinyint DEFAULT NULL COMMENT '是否外域设备',
`dev_ip` varchar(45) DEFAULT NULL COMMENT '设备 IP 地址',
`longitude` varchar(64) DEFAULT NULL COMMENT '经度',
`latitude` varchar(64) DEFAULT NULL COMMENT '纬度',
`height` decimal(10,3) DEFAULT NULL COMMENT '安装高度',
`reserve` varchar(500) DEFAULT NULL COMMENT '预留字段',
`custom_fields` text COMMENT '自定义字段',
`function_type` varchar(255) DEFAULT NULL COMMENT '功能类型',
`monitor_direction` varchar(32) DEFAULT NULL COMMENT '监控方向',
`owner_aps_id` varchar(128) DEFAULT NULL COMMENT '所属 APS 编码',
`security_level_code_string` varchar(32) DEFAULT NULL COMMENT '安全等级编码',
`encryption_status` tinyint DEFAULT NULL COMMENT '加密状态',
`signature_status` tinyint DEFAULT NULL COMMENT '签名状态',
PRIMARY KEY (`code`),
KEY `idx_ivs_camera_nvr_code` (`nvr_code`),
KEY `idx_ivs_camera_domain_code` (`domain_code`),
KEY `idx_ivs_camera_dev_ip` (`dev_ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='IVS 摄像头信息';

+ 171
- 0
docs/superpowers/plans/2026-07-13-api-documentation-coverage.md View File

@ -0,0 +1,171 @@
# API Documentation Coverage Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Give all 35 Spring MVC routes Chinese module names, operation descriptions, parameter documentation, response documentation, and readable core request/response schemas in Swagger UI.
**Architecture:** Keep documentation next to the code it describes: controller-level `@Tag`, handler-level `@Operation` and `@ApiResponse`, parameter-level `@Parameter`, and DTO-level `@Schema`. Add a reflection-based coverage test so future routes cannot silently omit documentation, then verify the generated `/v3/api-docs` at runtime.
**Tech Stack:** Java 8, Spring Boot 2.3.4, Springdoc OpenAPI 1.8.0, Swagger annotations 2.2.20, JUnit 4.13
---
### Task 1: Add documentation coverage tests
**Files:**
- Create: `src/test/java/com/inspect/nvr/config/ApiDocumentationCoverageTest.java`
- [ ] **Step 1: Add a reflection test for all controllers and routes**
The test must scan `CameraController`, `DahuaController`, `FileController`, `InfraredController`, `IvsCameraController`, `IvsServerController`, and `Test`. A handler is any declared method carrying `GetMapping`, `PostMapping`, `PutMapping`, `DeleteMapping`, `PatchMapping`, or method-level `RequestMapping`.
For every controller, assert a non-empty Chinese `@Tag`. For every handler, assert a non-empty `@Operation.summary` and at least one `@ApiResponse`. Assert the total is exactly 35.
- [ ] **Step 2: Add a core DTO schema test**
Assert that these API-facing models have a non-empty class-level `@Schema.description`: `Camera`, `NvrInfo`, `TemperatureData`, `InfraPictureInfo`, `InfraredBox`, `InfraredInfo`, `PtzControlParam`, `PtzControlResult`, `SnapshotCommandParam`, `SnapshotCommandResult`, `SnapshotInfoListParam`, `SnapshotInfoListResult`, `IvsPresetListView`, `Login`, `IvsResult`, `IvsVideoRtspVo`, `IvsVideoRtspView`, `IvsDevChanListVo`, `ResultEntity`, and `FileReturn`.
- [ ] **Step 3: Run the focused test and verify RED**
```powershell
$env:JAVA_HOME='C:\Program Files\Java\jdk1.8.0_191'
$env:Path="$env:JAVA_HOME\bin;$env:Path"
mvn -Dtest=ApiDocumentationCoverageTest test
```
Expected: failures report missing `@Tag`, `@Operation`, `@ApiResponse`, and `@Schema` documentation.
### Task 2: Document all controller modules and operations
**Files:**
- Modify: `src/main/java/com/inspect/nvr/controller/CameraController.java`
- Modify: `src/main/java/com/inspect/nvr/controller/DahuaController.java`
- Modify: `src/main/java/com/inspect/nvr/controller/FileController.java`
- Modify: `src/main/java/com/inspect/nvr/controller/InfraredController.java`
- Modify: `src/main/java/com/inspect/nvr/controller/IvsCameraController.java`
- Modify: `src/main/java/com/inspect/nvr/controller/IvsServerController.java`
- Modify: `src/main/java/com/inspect/nvr/controller/Test.java`
- [ ] **Step 1: Add controller tags**
Use these exact module names:
| Controller | Tag name | Description |
|---|---|---|
| `CameraController` | `通用摄像机` | `统一封装海康和大华摄像机的预置位与红外测温能力` |
| `DahuaController` | `大华设备` | `大华 NVR 登录、测温、云台控制和抓图接口` |
| `FileController` | `文件管理` | `文件上传接口` |
| `InfraredController` | `红外测温` | `海康红外测温、抓图、图片分析和 CSV 下载接口` |
| `IvsCameraController` | `IVS摄像机` | `IVS 平台预置位、抓图任务和图片下载接口` |
| `IvsServerController` | `IVS联调/模拟` | `IVS 协议联调接口;当前包含固定或模拟响应,请勿作为生产业务结果` |
| `Test` | `联调测试` | `FTPS 等联调测试接口,请勿在生产环境调用` |
- [ ] **Step 2: Add operation and response documentation**
Use the following exact summaries for the 35 routes; each handler also receives a successful `@ApiResponse(responseCode = "200", description = "请求成功")`, with more specific descriptions for binary responses and login/test routes.
| Route | Summary |
|---|---|
| `/hw/cameraYzwHikVision` | `查询海康摄像机预置位` |
| `/hw/cameraHong` | `统一读取红外测温数据` |
| `/hw/test` | `测试异步任务超时处理` |
| `/dahua/login` | `登录大华 NVR` |
| `/dahua/StartRemote` | `读取大华红外测温数据` |
| `/dahua/cameraControl` | `控制大华云台跳转预置位` |
| `/dahua/Picture` | `抓取大华摄像机图片` |
| `/file/upload` | `上传文件` |
| `/login` | `登录海康 NVR` |
| `/cameraHong` | `读取海康红外测温数据` |
| `/cameraAngleJump` | `控制海康云台跳转预置位` |
| `/camera` | `抓取海康 NVR 图片` |
| `/cameraHk` | `抓图并计算红外温度` |
| `/ir/capturePicture` | `设置红外图片分析参数` |
| `/ir/picAnalyse` | `提交红外图片算法分析` |
| `/device/radiometry-temper/{cameraCode}` | `查询测温规则结果(模拟)` |
| `/ir/downloadCsv` | `下载红外温度 CSV` |
| `/ir/addBoxData` | `添加红外分析框(模拟)` |
| `/ir/deleteBoxData` | `删除红外分析框(模拟)` |
| `/ir/selectBoxData` | `查询红外分析框(模拟)` |
| `/ir/status` | `查询红外流关闭状态` |
| `/device/ptzpresetlist/{cameraCode}/{domainCode}` | `查询 IVS 摄像机预置位` |
| `/device/ptzcontrol` | `控制 IVS 摄像机云台并测温` |
| `/platform/platformSnapshot/{cameraCode}/{domainCode}` | `创建平台抓图任务` |
| `/platform/snapshotList` | `查询平台抓图结果` |
| `/downloadfile_old` | `下载抓图文件(旧版)` |
| `/downloadfile` | `下载抓图文件` |
| `/digest` | `检测 Digest 抓图是否可用` |
| `/common/keepAlive2` | `IVS心跳检测(模拟)` |
| `/loginInfo/login2/v1.0` | `IVS登录(模拟)` |
| `/device/ptzpresetlist2/{cameraCode}/{domainCode}` | `查询IVS预置位(模拟)` |
| `/video/rtspurl2/v1.0` | `获取RTSP播放地址(模拟)` |
| `/device/deviceList2/v1.0` | `查询IVS设备列表(模拟)` |
| `/hw/test2` | `测试FTPS批量下载` |
| `/hw/test3` | `测试FTPS文件读取` |
- [ ] **Step 3: Document non-body parameters and binary responses**
Add `@Parameter` descriptions and safe examples to every `@PathVariable` and `@RequestParam`. Mark `filesessionid` as a temporary image session identifier and never include credentials in examples. Document `/dahua/Picture`, `/downloadfile_old`, and `/downloadfile` as `image/jpeg`; document `/ir/downloadCsv` as `text/csv`; document `/file/upload` parameters as filename and multipart file.
- [ ] **Step 4: Run the controller coverage test**
```powershell
mvn -Dtest=ApiDocumentationCoverageTest test
```
Expected: route count remains 35 and controller/handler coverage assertions pass; DTO assertions may still fail until Task 3.
### Task 3: Document API-facing schemas
**Files:**
- Modify the 20 DTO classes listed in Task 1 under `src/main/java/com/inspect/nvr/domain/**`.
- [ ] **Step 1: Add class-level schema descriptions**
Add `@Schema(description = "...")` to each listed class, using Chinese descriptions that match its role: device login, camera operation, temperature result, IVS command/result, snapshot command/result, or generic response.
- [ ] **Step 2: Add field descriptions and safe examples**
Annotate API-visible fields with `@Schema(description = "...", example = "...")`. Use documentation-only examples such as `192.168.1.100`, `8000`, `admin`, `camera-001`, `domain-001`, and `1`; do not include real passwords, RTSP URLs, FTP credentials, or internal production addresses. Password examples must be omitted or use `writeOnly = true` without a value.
- [ ] **Step 3: Run the coverage test and verify GREEN**
```powershell
mvn -Dtest=ApiDocumentationCoverageTest test
```
Expected: all documentation coverage tests pass with zero failures and zero errors.
### Task 4: Preserve parameter names and validate generated OpenAPI
**Files:**
- Modify: `pom.xml`
- [ ] **Step 1: Preserve Java method parameter names**
Add `<parameters>true</parameters>` to the existing `maven-compiler-plugin` configuration without changing source or target level.
- [ ] **Step 2: Run all tests**
```powershell
mvn test -DskipTests=false
```
Expected: all 3,505+ main sources compile and both Swagger tests pass.
- [ ] **Step 3: Start the application on a temporary port and inspect the document**
```powershell
mvn spring-boot:run '-Dspring-boot.run.arguments=--server.port=18080'
```
Query `http://127.0.0.1:18080/v3/api-docs` and verify:
- exactly 35 paths;
- seven expected Chinese tags;
- every operation has a Chinese summary and at least one response;
- request bodies reference documented schemas;
- binary endpoints advertise `image/jpeg` or `text/csv`.
- [ ] **Step 4: Review final local-only changes**
Run scoped `git diff --check` and `git status --short`. Do not stage or commit any file. Confirm the user's pre-existing staged file list is unchanged.

+ 48
- 0
docs/superpowers/plans/2026-07-13-hik-nvr-playback-rtsp-compatibility-fix.md View File

@ -0,0 +1,48 @@
# Hikvision NVR RTSP Playback Compatibility Fix Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Make the playback-search endpoint return an RTSP URL that the target Hikvision NVR can actually play while retaining SDK channel `33` for recording lookup.
**Architecture:** Extend the existing Hikvision login cache value with immutable device channel metadata read from `NET_DVR_DEVICEINFO_V40`. The playback service uses that metadata to map SDK channel numbers to RTSP display-channel numbers, then passes the resolved RTSP channel to a pure URL builder. RTSP query timestamps keep Beijing clock digits because the target firmware was verified to interpret them as device-local time.
**Tech Stack:** Java 8, Spring Boot 2.3.4, HCNetSDK/JNA, Caffeine, JUnit 4, Mockito, Maven.
**Execution constraint:** Modify the local `master` worktree only. Do not stage or commit any file.
---
## File map
- Create `src/main/java/com/inspect/nvr/service/HikLoginSession.java` — immutable login handle and channel-layout mapping.
- Modify `src/main/java/com/inspect/nvr/service/HikLoginService.java` — cache `HikLoginSession` and capture login device metadata while preserving existing `login(NvrInfo)` callers.
- Modify `src/main/java/com/inspect/nvr/hik/service/HikNvrPlaybackService.java` — use the login session for the SDK handle and resolved RTSP channel.
- Modify `src/main/java/com/inspect/nvr/hik/service/HikPlaybackUrlBuilder.java` — accept an RTSP channel explicitly and retain Beijing clock digits.
- Create `src/test/java/com/inspect/nvr/service/HikLoginSessionTest.java` — pure channel mapping coverage.
- Create `src/test/java/com/inspect/nvr/service/HikLoginServiceTest.java` — verify SDK device metadata is captured into the cached session.
- Modify `src/test/java/com/inspect/nvr/hik/service/HikPlaybackUrlBuilderTest.java` — reproduce `3301` and UTC-conversion regressions.
- Modify `src/test/java/com/inspect/nvr/hik/service/HikNvrPlaybackServiceTest.java` — prove SDK search still uses `33` while the URL uses `101`.
## Task 1: Lock down corrected RTSP behavior
- [x] Add a URL-builder test that calls `build(request, 1, start, end)` for SDK channel `33` and expects `/Streaming/tracks/101?starttime=20260713T120000Z&endtime=20260713T130000Z`.
- [x] Add mapping tests asserting pure-NVR `33 -> 1`, pure-NVR `34 -> 2`, hybrid-DVR `33 -> 17`, and analog-channel ordinal mapping.
- [x] Add a login-service test whose mocked `NET_DVR_Login_V40` returns `byChanNum=0`, `byIPChanNum=8`, and `byStartDChan=33`, then assert the returned session maps `33 -> 1`.
- [x] Add a playback-service test asserting `NET_DVR_FILECOND_V40.lChannel == 33` while the response URL contains `/Streaming/tracks/101?`.
- [x] Run `mvn -Dtest=HikPlaybackUrlBuilderTest,HikLoginSessionTest,HikLoginServiceTest,HikNvrPlaybackServiceTest test` and confirm RED failures are caused by the missing session API, explicit RTSP-channel builder signature, and old UTC behavior.
## Task 2: Implement the minimal production fix
- [x] Implement `HikLoginSession` with the existing user ID plus unsigned analog/digital channel counts and starts. Map a covered digital SDK channel after the analog channel count; map a covered analog SDK channel to its ordinal; otherwise return the original channel as a compatibility fallback.
- [x] Change `HikLoginService` to cache `HikLoginSession`, add `loginSession(NvrInfo)`, and keep `login(NvrInfo)` delegating to it so existing callers retain the same API.
- [x] Change `HikNvrPlaybackService` to use `loginSession`, keep the original request channel in `NET_DVR_FILECOND_V40`, resolve the RTSP channel once, and pass it into every generated record URL.
- [x] Change `HikPlaybackUrlBuilder` to calculate `trackId` from the explicit RTSP channel and format the supplied `LocalDateTime` directly as `yyyyMMdd'T'HHmmss'Z'` without converting to UTC.
- [x] Re-run the four focused test classes and confirm all are GREEN.
## Task 3: Verify regression safety and the real device
- [x] Run `mvn test -DskipTests=false` and confirm zero failures/errors.
- [x] Restart only the user-controlled application if explicitly permitted; otherwise use a temporary port to validate the endpoint without stopping the existing 8080 process.
- [x] POST the known `channel=33` query and verify the response URL contains track `101` and Beijing digits `120000Z` to `130000Z`, with credentials redacted from diagnostic output.
- [x] Probe that returned URL with VLC using the default RTSP transport and require `PLAY 200 OK` plus decoded H.264 NAL units.
- [x] Run scoped `git diff --check`, inspect `git status --short`, and confirm no new staging or commit occurred.

+ 341
- 0
docs/superpowers/plans/2026-07-13-hik-nvr-playback-search.md View File

@ -0,0 +1,341 @@
# Hikvision NVR Playback Search Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Add a documented HTTP endpoint that queries a Hikvision NVR for actual recording coverage and returns Beijing-time timestamp ranges plus credential-bearing RTSP playback URLs.
**Architecture:** A controller under `com.inspect.nvr.hik` delegates to a focused service. The service reuses `HikLoginService`, queries recordings with `NET_DVR_FindFile_V40`/`NET_DVR_FindNextFile_V40`, clips and merges actual file intervals, and delegates URL construction to a pure `HikPlaybackUrlBuilder`. Controller advice converts validation failures to HTTP 400 and device/SDK failures to HTTP 502.
**Tech Stack:** Java 8, Spring Boot 2.3.4, Hikvision HCNetSDK through JNA, Lombok, springdoc-openapi 1.8.0, JUnit 4, Mockito, Spring MockMvc.
**Execution constraint:** Keep all changes local. Do not stage or commit any file.
---
## File map
**Create:**
- `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRequest.java` — HTTP input and Swagger field contract.
- `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRecord.java` — one actual continuous range and its RTSP URL.
- `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackResponse.java` — successful search response.
- `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackErrorResponse.java` — parameter or SDK error response.
- `src/main/java/com/inspect/nvr/hik/exception/HikNvrPlaybackException.java` — status and SDK error carrier.
- `src/main/java/com/inspect/nvr/hik/service/HikPlaybackUrlBuilder.java` — pure Beijing-to-UTC RTSP URL builder.
- `src/main/java/com/inspect/nvr/hik/service/HikNvrPlaybackService.java` — validation, SDK query and interval processing.
- `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackController.java``POST /hik/nvr/playback/search`.
- `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackExceptionHandler.java` — scoped HTTP error mapping.
- `src/test/java/com/inspect/nvr/hik/service/HikPlaybackUrlBuilderTest.java` — URL and timestamp tests.
- `src/test/java/com/inspect/nvr/hik/service/HikNvrPlaybackServiceTest.java` — SDK state and interval tests.
- `src/test/java/com/inspect/nvr/hik/controller/HikNvrPlaybackControllerTest.java` — HTTP response tests.
**Modify:**
- `src/test/java/com/inspect/nvr/config/ApiDocumentationCoverageTest.java` — include the new controller, handler and schemas.
## Task 1: RTSP URL contract and domain models
**Files:**
- Test: `src/test/java/com/inspect/nvr/hik/service/HikPlaybackUrlBuilderTest.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRequest.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRecord.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackResponse.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackErrorResponse.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikPlaybackUrlBuilder.java`
- [ ] **Step 1: Write the failing URL builder test**
Create a JUnit 4 test that fixes the time-zone, track and credential-encoding behavior:
```java
@Test
public void buildsMainStreamPlaybackUrlUsingUtcQueryTimes() {
HikNvrPlaybackRequest request = request("admin", "p@ss word", 1, 1);
String url = builder.build(
request,
LocalDateTime.of(2026, 7, 13, 12, 30, 0),
LocalDateTime.of(2026, 7, 13, 13, 0, 0));
assertEquals("rtsp://admin:p%40ss%20word@192.168.1.100:554/Streaming/tracks/101"
+ "?starttime=20260713T043000Z&endtime=20260713T050000Z", url);
}
@Test
public void buildsSubStreamTrackForNvrChannelThirtyThree() {
HikNvrPlaybackRequest request = request("operator", "secret", 33, 2);
String url = builder.build(
request,
LocalDateTime.of(2026, 7, 13, 12, 0, 0),
LocalDateTime.of(2026, 7, 13, 13, 0, 0));
assertTrue(url.contains("/Streaming/tracks/3302?"));
}
```
- [ ] **Step 2: Run the URL test and verify RED**
Run:
```powershell
$env:JAVA_HOME='C:\Program Files\Java\jdk1.8.0_191'
mvn -Dtest=HikPlaybackUrlBuilderTest test
```
Expected: test compilation fails because `HikPlaybackUrlBuilder` and the new domain classes do not exist.
- [ ] **Step 3: Implement the four documented domain models**
Use Lombok `@Data`, `@Builder`, `@NoArgsConstructor`, `@AllArgsConstructor` and class/field `@Schema` descriptions. The request fields are exactly:
```java
private String nvrIp;
private Integer sdkPort;
private Integer rtspPort;
private Integer channel;
private Integer streamType;
private String username;
@Schema(description = "NVR登录密码", accessMode = Schema.AccessMode.WRITE_ONLY)
private String password;
private String startTime;
private String endTime;
```
`HikNvrPlaybackRecord` contains `List<String> timeRange` and `String rtspUrl`. `HikNvrPlaybackResponse` contains `int code`, `String message`, `boolean hasRecord`, and `List<HikNvrPlaybackRecord> records`, with a factory that always returns code `0` and a non-null list. `HikNvrPlaybackErrorResponse` contains `int code` and `String message`.
- [ ] **Step 4: Implement the pure URL builder**
Implement `HikPlaybackUrlBuilder.build(request, start, end)` with:
```java
private static final ZoneId BEIJING_ZONE = ZoneId.of("Asia/Shanghai");
private static final DateTimeFormatter RTSP_TIME =
DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'").withZone(ZoneOffset.UTC);
int trackId = request.getChannel() * 100 + request.getStreamType();
String utcStart = RTSP_TIME.format(start.atZone(BEIJING_ZONE).toInstant());
String utcEnd = RTSP_TIME.format(end.atZone(BEIJING_ZONE).toInstant());
```
Percent-encode every UTF-8 user-info byte except ASCII letters, digits, `-`, `.`, `_`, and `~`. Assemble the URL without logging it.
- [ ] **Step 5: Run the URL test and verify GREEN**
Run `mvn -Dtest=HikPlaybackUrlBuilderTest test`.
Expected: both tests pass with zero failures.
## Task 2: SDK recording search and interval merging
**Files:**
- Test: `src/test/java/com/inspect/nvr/hik/service/HikNvrPlaybackServiceTest.java`
- Create: `src/main/java/com/inspect/nvr/hik/exception/HikNvrPlaybackException.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikNvrPlaybackService.java`
- [ ] **Step 1: Write failing service tests for partial coverage, gaps and cleanup**
Use Mockito to return a login ID of `7`, find handle `88`, and populate `NET_DVR_FINDDATA_V40` outputs. The main behavior test must feed these file intervals:
```text
2026-07-13 12:20:00 - 12:40:00
2026-07-13 12:30:00 - 12:50:00
2026-07-13 12:55:00 - 13:10:00
```
For a request from `12:00:00` to `13:00:00`, assert exactly:
```java
assertEquals(Arrays.asList("20260713122000", "20260713125000"),
response.getRecords().get(0).getTimeRange());
assertEquals(Arrays.asList("20260713125500", "20260713130000"),
response.getRecords().get(1).getTimeRange());
assertTrue(response.isHasRecord());
verify(hcNetSDK).NET_DVR_FindClose_V30(88);
```
Add separate tests that assert:
- `NET_DVR_FILE_NOFIND` produces `hasRecord=false` and an empty list.
- `NET_DVR_ISFINDING` followed by success is retried and returns data.
- `NET_DVR_FILE_EXCEPTION` throws `HikNvrPlaybackException` with the value returned by `NET_DVR_GetLastError` and still closes handle `88`.
- an invalid end time is rejected before `HikLoginService.login` is invoked.
- [ ] **Step 2: Run the service test and verify RED**
Run `mvn -Dtest=HikNvrPlaybackServiceTest test`.
Expected: test compilation fails because `HikNvrPlaybackService` and `HikNvrPlaybackException` do not exist.
- [ ] **Step 3: Implement validation and SDK condition creation**
`HikNvrPlaybackService.search` must:
```java
LocalDateTime requestStart = parseBeijing(request.getStartTime());
LocalDateTime requestEnd = parseBeijing(request.getEndTime());
if (!requestEnd.isAfter(requestStart)) {
throw HikNvrPlaybackException.badRequest("结束时间必须晚于开始时间");
}
```
Validate nonblank NVR IP, username and password; ports in `1..65535`; channel greater than zero; stream type in `{1, 2}`; and reject URL delimiter characters in the NVR address. Build `NvrInfo`, call `HikLoginService.login`, and create a `NET_DVR_FILECOND_V40` with:
```java
condition.lChannel = request.getChannel();
condition.dwFileType = 0xff;
condition.dwIsLocked = 0xff;
condition.byFindType = 0;
condition.byQuickSearch = 0;
condition.byStreamType = request.getStreamType() == 1 ? (byte) 3 : (byte) 1;
condition.struStartTime = toSdkTime(requestStart);
condition.struStopTime = toSdkTime(requestEnd);
condition.write();
```
- [ ] **Step 4: Implement the bounded SDK result loop and guaranteed close**
Call `NET_DVR_FindFile_V40`; a negative handle becomes an HTTP-502 exception with `NET_DVR_GetLastError()`. In a `try/finally`, loop over `NET_DVR_FindNextFile_V40`:
```java
switch (status) {
case HCNetSDK.NET_DVR_FILE_SUCCESS:
rawRanges.add(rangeFrom(findData));
findingAttempts = 0;
break;
case HCNetSDK.NET_DVR_ISFINDING:
waitForSearch(++findingAttempts);
break;
case HCNetSDK.NET_DVR_FILE_NOFIND:
case HCNetSDK.NET_DVR_NOMOREFILE:
return buildResponse(request, requestStart, requestEnd, rawRanges);
default:
throw sdkFailure("查询海康NVR录像失败", hcNetSDK.NET_DVR_GetLastError());
}
```
Limit `NET_DVR_ISFINDING` to 100 attempts with a 50 ms wait, restore the interrupt flag when interrupted, and close with `NET_DVR_FindClose_V30(findHandle)` in `finally`.
- [ ] **Step 5: Implement clipping, sorting and exact-adjacency merging**
For each returned interval, use `max(fileStart, requestStart)` and `min(fileEnd, requestEnd)`, discard empty intervals, sort by start, and merge only when `next.start <= current.end`. Format response pairs using `yyyyMMddHHmmss`, and build one RTSP URL per merged interval.
- [ ] **Step 6: Run service and URL tests and verify GREEN**
Run:
```powershell
mvn -Dtest=HikNvrPlaybackServiceTest,HikPlaybackUrlBuilderTest test
```
Expected: all service and URL tests pass; Mockito verifies the find handle is closed.
## Task 3: HTTP endpoint, error mapping and Swagger coverage
**Files:**
- Test: `src/test/java/com/inspect/nvr/hik/controller/HikNvrPlaybackControllerTest.java`
- Create: `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackController.java`
- Create: `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackExceptionHandler.java`
- Modify: `src/test/java/com/inspect/nvr/config/ApiDocumentationCoverageTest.java`
- [ ] **Step 1: Write failing MockMvc tests**
Configure standalone MockMvc with the controller and advice. Assert a valid POST returns status 200 and JSON paths:
```java
andExpect(jsonPath("$.hasRecord").value(true))
andExpect(jsonPath("$.records[0].timeRange[0]").value("20260713123000"))
andExpect(jsonPath("$.records[0].timeRange[1]").value("20260713130000"))
andExpect(jsonPath("$.records[0].rtspUrl").value(expectedUrl));
```
Make the mocked service throw `HikNvrPlaybackException.badRequest("结束时间必须晚于开始时间")` and assert HTTP 400. Make it throw an SDK exception with code `7` and assert HTTP 502 plus `$.code == 7`.
- [ ] **Step 2: Run the controller test and verify RED**
Run `mvn -Dtest=HikNvrPlaybackControllerTest test`.
Expected: test compilation fails because the controller and handler do not exist.
- [ ] **Step 3: Implement the documented controller and scoped advice**
Create a controller with:
```java
@RestController
@RequestMapping("/hik/nvr/playback")
@Tag(name = "海康NVR回放", description = "查询海康NVR历史录像并生成RTSP回放地址")
public class HikNvrPlaybackController {
@PostMapping("/search")
public ResponseEntity<HikNvrPlaybackResponse> search(
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "海康NVR历史录像查询参数", required = true)
@RequestBody HikNvrPlaybackRequest request) {
return ResponseEntity.ok(playbackService.search(request));
}
}
```
Add Chinese `@Operation` and `@ApiResponses` for 200, 400 and 502 with concrete response schemas. The advice must use `@RestControllerAdvice(assignableTypes = HikNvrPlaybackController.class)` and return `HikNvrPlaybackErrorResponse` without logging credentials or RTSP URLs.
- [ ] **Step 4: Run the controller test and verify GREEN**
Run `mvn -Dtest=HikNvrPlaybackControllerTest test`.
Expected: all controller tests pass.
- [ ] **Step 5: Extend documentation coverage test and verify RED**
Change the scan root to `com.inspect.nvr`, add `com.inspect.nvr.hik.controller.HikNvrPlaybackController` to expected controllers, change expected handler count from 35 to 36, and add the four new API models to `API_MODEL_TYPES`. Run:
```powershell
mvn -Dtest=ApiDocumentationCoverageTest test
```
Expected before all schema annotations are complete: failure identifies any missing model or field description/example. Complete only the reported Swagger metadata until the test passes. Password must remain `WRITE_ONLY` with no example.
- [ ] **Step 6: Verify documentation coverage GREEN**
Run `mvn -Dtest=ApiDocumentationCoverageTest test`.
Expected: all coverage assertions pass with 8 controllers and 36 handler methods.
## Task 4: Full verification and local handoff
**Files:**
- Verify all files created or modified in Tasks 1–3.
- [ ] **Step 1: Run the full Maven test suite**
Run:
```powershell
$env:JAVA_HOME='C:\Program Files\Java\jdk1.8.0_191'
$env:Path="$env:JAVA_HOME\bin;$env:Path"
mvn test -DskipTests=false
```
Expected: build success with all existing and new tests passing.
- [ ] **Step 2: Run scoped whitespace and sensitive logging checks**
Run:
```powershell
git diff --check -- src/main/java/com/inspect/nvr/hik src/test/java/com/inspect/nvr/hik src/test/java/com/inspect/nvr/config/ApiDocumentationCoverageTest.java
rg -n 'log\..*(password|rtspUrl)|toString\(\).*HikNvrPlaybackRequest' src/main/java/com/inspect/nvr/hik
```
Expected: `git diff --check` exits 0 and the sensitive logging search returns no matches.
- [ ] **Step 3: Verify existing staged files were not changed**
Capture `git diff --cached --name-only` and compare it with the pre-task staged list. Do not run `git add`, `git commit`, branch creation, reset or checkout.
- [ ] **Step 4: Report the endpoint contract and limits**
Report the local endpoint, example request/response, test count, and the important limit that the URL contains credentials because the user explicitly requested it. State that no files were committed or newly staged.

+ 408
- 0
docs/superpowers/plans/2026-07-13-hik-nvr-sdk-controlled-hls.md View File

@ -0,0 +1,408 @@
# 海康 NVR SDK 受控 HLS 回放 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use `executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在当前 Spring 服务中提供由海康 SDK 实际控制的 HLS 历史回放,支持跳转、暂停/恢复和 1/2/4/8 倍速。
**Architecture:** 服务通过 `NET_DVR_PlayBackByTime_V40` 建立唯一可控回放句柄,从 `NET_DVR_SetPlayBackESCallBack` 获取 H.264 裸帧,异步写入本机 FFmpeg 标准输入,FFmpeg 推 RTMP 到本机 Docker ZLMediaKit,ZLM 输出 HLS。会话控制直接调用同一 SDK 句柄;定位时切换到新的 HLS 流代次。
**Tech Stack:** Java 8、Spring Boot 2.3、JNA/HCNetSDK、FFmpeg、Docker Desktop、ZLMediaKit、JUnit 4、Mockito。
**User constraint:** 在当前 `master` 本地直接修改,不创建 worktree、不暂存、不提交。
---
### Task 1: 部署本机媒体运行环境
**Files:**
- Create: `deploy/zlmediakit/docker-compose.yml`
- Create: `deploy/zlmediakit/config.ini`
- Modify: `.gitignore`
- External: `C:\tools\ffmpeg\bin\ffmpeg.exe`
- [ ] **Step 1: 增加 Docker 与端口配置的断言说明**
写入 compose,唯一暴露端口为:
```yaml
services:
zlmediakit:
image: zlmediakit/zlmediakit:master
container_name: inspect-nvr-zlmediakit
restart: unless-stopped
ports:
- "127.0.0.1:18081:80"
- "127.0.0.1:1935:1935"
```
- [ ] **Step 2: 启动 Docker Desktop 并验证失败前置条件**
Run: `docker info --format '{{.ServerVersion}}'`
Expected: Docker server version is printed; if it is unavailable, start Docker Desktop and retry.
- [ ] **Step 3: 下载 FFmpeg 到本机工具目录**
从 Windows FFmpeg 发行包解压到 `C:\tools\ffmpeg`,验证:
Run: `C:\tools\ffmpeg\bin\ffmpeg.exe -version`
Expected: command prints an FFmpeg version and exits with code 0.
- [ ] **Step 4: 写入最小 ZLM 配置**
`config.ini` 必须至少包含:
```ini
[http]
port=80
allow_cross_domains=1
[protocol]
enable_hls=1
enable_audio=0
hls_demand=0
[hls]
segDur=2
segNum=3
segRetain=5
```
compose 必须将本文件挂载为 `/opt/media/conf/config.ini:ro`;该镜像从 `/opt/media/bin` 启动 `MediaServer` 并以 `../conf/config.ini` 作为配置文件。
- [ ] **Step 5: 启动 ZLM 并验证 HTTP 与 RTMP 端口**
Run: `docker compose -f deploy/zlmediakit/docker-compose.yml up -d`
Expected: `inspect-nvr-zlmediakit` is running and `Test-NetConnection 127.0.0.1 -Port 18081` plus `Test-NetConnection 127.0.0.1 -Port 1935` return `TcpTestSucceeded : True`.
- [ ] **Step 6: 忽略本机凭据与运行时文件**
`.gitignore` 增加:
```gitignore
/deploy/zlmediakit/.env
/deploy/zlmediakit/log/
/deploy/zlmediakit/www/
```
验证 `git status --short` 中不出现本机 `.env`、日志或 HLS 切片。
### Task 2: 修正并覆盖 HCNetSDK 回放控制 JNA 契约
**Files:**
- Modify: `src/main/java/com/inspect/nvr/hikVision/utils/jna/HCNetSDK.java`
- Create: `src/test/java/com/inspect/nvr/hik/service/HikSdkPlaybackGatewayTest.java`
- [ ] **Step 1: 写出会失败的控制码与结构测试**
```java
@Test
public void exposesAbsoluteSeekControlAndStructuredPacketLayout() {
assertEquals(26, HCNetSDK.NET_DVR_PLAYSETTIME);
assertTrue(new HCNetSDK.NET_DVR_PACKET_INFO_EX().size() > 80);
}
```
- [ ] **Step 2: 运行测试确认当前契约缺失**
Run: `mvn -Dtest=HikSdkPlaybackGatewayTest#exposesAbsoluteSeekControlAndStructuredPacketLayout test`
Expected: compilation failure because `NET_DVR_PLAYSETTIME` is absent, or assertion failure because the packet structure is represented as a JNA union.
- [ ] **Step 3: 进行最小 JNA 修复**
在控制常量区加入:
```java
public static final int NET_DVR_PLAYSETTIME = 26;
```
`NET_DVR_PACKET_INFO_EX``Union` 改为 `HCStructure`,保留字段顺序和所有字段;它是 SDK 回调返回的顺序结构体,不是 union。
- [ ] **Step 4: 运行单测确认修复**
Run: `mvn -Dtest=HikSdkPlaybackGatewayTest#exposesAbsoluteSeekControlAndStructuredPacketLayout test`
Expected: PASS.
### Task 3: 定义 HLS 会话领域模型与 URL/控制映射
**Files:**
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsSession.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlRequest.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlAction.java`
- Create: `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsStatus.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikPlaybackHlsUrlBuilder.java`
- Create: `src/test/java/com/inspect/nvr/hik/service/HikPlaybackHlsUrlBuilderTest.java`
- Create: `src/test/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlRequestTest.java`
- [ ] **Step 1: 写出 HLS 地址和合法速度的失败测试**
```java
@Test
public void buildsLocalHlsUrlForStreamGeneration() {
assertEquals("http://127.0.0.1:18081/playback/a1-2/hls.m3u8",
builder.hlsUrl("a1", 2));
}
@Test
public void rejectsUnsupportedPlaybackSpeed() {
assertFalse(HikNvrPlaybackHlsControlRequest.isSupportedSpeed(3));
}
```
- [ ] **Step 2: 运行测试确认失败**
Run: `mvn -Dtest=HikPlaybackHlsUrlBuilderTest,HikNvrPlaybackHlsControlRequestTest test`
Expected: compilation failure because the classes do not exist.
- [ ] **Step 3: 实现最小领域模型**
`HikNvrPlaybackHlsControlAction` 只包含 `PAUSE`、`RESUME`、`SET_SPEED`、`SEEK`、`STOP`。`isSupportedSpeed` 只接受 1、2、4、8。HLS 地址固定为:
```java
return httpBaseUrl + "/playback/" + sessionId + "-" + generation + "/hls.m3u8";
```
- [ ] **Step 4: 运行测试确认通过**
Run: `mvn -Dtest=HikPlaybackHlsUrlBuilderTest,HikNvrPlaybackHlsControlRequestTest test`
Expected: PASS.
### Task 4: 以测试驱动实现异步 H.264 到 FFmpeg/RTMP 的帧桥
**Files:**
- Create: `src/main/java/com/inspect/nvr/hik/service/HikPlaybackFrame.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikPlaybackFrameSink.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikFfmpegProcessFactory.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikFfmpegH264Publisher.java`
- Create: `src/test/java/com/inspect/nvr/hik/service/HikFfmpegH264PublisherTest.java`
- [ ] **Step 1: 写出非阻塞入队、I 帧优先和 FFmpeg 命令的失败测试**
```java
@Test
public void usesPipeInputAndPublishesToSessionRtmpUrl() throws Exception {
publisher.start();
assertThat(processFactory.command()).contains("pipe:0");
assertThat(processFactory.command()).contains("rtmp://127.0.0.1:1935/playback/a1-1");
}
@Test
public void preservesIFrameWhenQueueIsFull() {
// fill bounded queue with B/P frames, then offer an I frame
assertTrue(publisher.offer(frameOfType(1)));
}
```
- [ ] **Step 2: 运行测试确认失败**
Run: `mvn -Dtest=HikFfmpegH264PublisherTest test`
Expected: compilation failure because the publisher does not exist.
- [ ] **Step 3: 实现最小帧桥**
FFmpeg 参数必须包含:
```text
-hide_banner -loglevel warning -fflags +genpts -use_wallclock_as_timestamps 1
-f h264 -i pipe:0 -c:v copy -an -f flv rtmp://127.0.0.1:1935/playback/{streamId}
```
JNA 回调只调用 `offer`;写线程把 `byte[]` 写入 `process.getOutputStream()`。关闭时停止接收、关闭 stdin、等待进程有限时间后强制销毁。
- [ ] **Step 4: 运行帧桥单测**
Run: `mvn -Dtest=HikFfmpegH264PublisherTest test`
Expected: PASS.
### Task 5: 以测试驱动实现海康 SDK 回放句柄和控制
**Files:**
- Create: `src/main/java/com/inspect/nvr/hik/service/HikSdkPlaybackGateway.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikSdkPlaybackHandle.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikSdkPlaybackGatewayImpl.java`
- Modify: `src/main/java/com/inspect/nvr/hik/exception/HikNvrPlaybackException.java`
- Modify: `src/test/java/com/inspect/nvr/hik/service/HikSdkPlaybackGatewayTest.java`
- [ ] **Step 1: 写出 VOD 创建、启动、倍速和定位的失败测试**
```java
@Test
public void startsSdkPlaybackWithOriginalSdkChannelAndActualRange() {
gateway.open(request, start, end, sink);
verify(sdk).NET_DVR_PlayBackByTime_V40(eq(7), vodCaptor.capture());
assertEquals(33, vodCaptor.getValue().struIDInfo.dwChannel);
verify(sdk).NET_DVR_PlayBackControl_V40(eq(91), eq(HCNetSDK.NET_DVR_PLAYSTART),
isNull(), eq(0), isNull(), any(IntByReference.class));
}
@Test
public void mapsSpeedEightToNormalThenThreeFastCommands() {
handle.setSpeed(8);
verifyControl(HCNetSDK.NET_DVR_PLAYNORMAL, 1);
verifyControl(HCNetSDK.NET_DVR_PLAYFAST, 3);
}
@Test
public void seeksUsingNetDvrTimePointer() {
handle.seek(LocalDateTime.of(2026, 7, 13, 12, 45));
verify(sdk).NET_DVR_PlayBackControl_V40(eq(91), eq(26), any(Pointer.class),
eq(new HCNetSDK.NET_DVR_TIME().size()), isNull(), any(IntByReference.class));
}
```
- [ ] **Step 2: 运行测试确认失败**
Run: `mvn -Dtest=HikSdkPlaybackGatewayTest test`
Expected: compilation failure because the gateway and handle do not exist.
- [ ] **Step 3: 实现 SDK 网关**
`open` 必须:登录缓存中获取 `userId`;填充 `NET_DVR_VOD_PARA.dwSize`、`struIDInfo.dwSize`、实际 SDK 通道、北京时间起止时间、主/子码流;调用 `NET_DVR_PlayBackByTime_V40`;保存回调强引用;注册 ES 回调;最后调用 `NET_DVR_PLAYSTART`
回调必须复制 `pPacketBuffer``dwPacketSize` 字节;只将视频 I/B/P 包写入当前 `AtomicReference<HikPlaybackFrameSink>`,忽略文件头、音频和私有包。`close` 必须先断开 sink,再 `NET_DVR_StopPlayBack`
- [ ] **Step 4: 运行 SDK 网关测试**
Run: `mvn -Dtest=HikSdkPlaybackGatewayTest test`
Expected: PASS.
### Task 6: 实现会话编排、定位代次切换和自动清理
**Files:**
- Create: `src/main/java/com/inspect/nvr/hik/service/HikNvrPlaybackHlsService.java`
- Create: `src/main/java/com/inspect/nvr/hik/service/HikNvrPlaybackHlsSessionRegistry.java`
- Create: `src/test/java/com/inspect/nvr/hik/service/HikNvrPlaybackHlsServiceTest.java`
- [ ] **Step 1: 写出创建、定位、倍速、删除的失败测试**
```java
@Test
public void createsSessionFromOneActualRecordingRangeWithoutReturningRtspUrl() {
HikNvrPlaybackHlsSession session = service.create(request);
assertEquals(HikNvrPlaybackHlsStatus.PLAYING, session.getStatus());
assertFalse(serialized(session).contains("rtsp://"));
}
@Test
public void seekCreatesNextGenerationAndReturnsNewHlsUrl() {
HikNvrPlaybackHlsSession moved = service.control(id, seek("2026-07-13 12:45:00"));
assertEquals(2, moved.getGeneration());
assertTrue(moved.getHlsUrl().contains("-2/hls.m3u8"));
}
```
- [ ] **Step 2: 运行测试确认失败**
Run: `mvn -Dtest=HikNvrPlaybackHlsServiceTest test`
Expected: compilation failure because the service and registry do not exist.
- [ ] **Step 3: 实现会话服务**
创建流程:调用已有 `HikNvrPlaybackService.search`;空记录抛 404;多个记录抛 409;将唯一实际区间解析为 `LocalDateTime`;创建 publisher 和 SDK handle;登记会话。
定位流程:暂停旧句柄,停止旧 publisher,启动新代次 publisher,切换句柄 sink,调用 SDK `PLAYSETTIME`;失败时关闭旧句柄并以目标时间重建;恢复目标速度;更新 HLS URL 与状态。自动清理使用当前已有 `@EnableScheduling`,过期时调用同一个 `stop` 路径。
- [ ] **Step 4: 运行会话服务测试**
Run: `mvn -Dtest=HikNvrPlaybackHlsServiceTest test`
Expected: PASS.
### Task 7: 暴露 Swagger 完整标注的 HLS REST 接口
**Files:**
- Create: `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackHlsController.java`
- Modify: `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackExceptionHandler.java`
- Create: `src/test/java/com/inspect/nvr/hik/controller/HikNvrPlaybackHlsControllerTest.java`
- Modify: `src/test/java/com/inspect/nvr/config/ApiDocumentationCoverageTest.java`
- [ ] **Step 1: 写出 MVC 失败测试**
```java
mockMvc.perform(post("/hik/nvr/playback/hls/sessions")
.contentType(MediaType.APPLICATION_JSON).content(REQUEST_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.hlsUrl").value("http://127.0.0.1:18081/playback/a1-1/hls.m3u8"))
.andExpect(jsonPath("$.rtspUrl").doesNotExist());
mockMvc.perform(post("/hik/nvr/playback/hls/sessions/a1/controls")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"action\":\"SET_SPEED\",\"speed\":8}"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.speed").value(8));
```
- [ ] **Step 2: 运行测试确认失败**
Run: `mvn -Dtest=HikNvrPlaybackHlsControllerTest test`
Expected: compilation failure because controller does not exist.
- [ ] **Step 3: 实现控制器和错误映射**
暴露:
```text
POST /hik/nvr/playback/hls/sessions
GET /hik/nvr/playback/hls/sessions/{sessionId}
POST /hik/nvr/playback/hls/sessions/{sessionId}/controls
DELETE /hik/nvr/playback/hls/sessions/{sessionId}
```
所有请求、响应、枚举加中文 `@Schema`、`@Operation` 和错误码说明。`HikNvrPlaybackException` 增加 `notFound`、`conflict` 和 `mediaFailure` 工厂方法,统一由既有 ControllerAdvice 返回。
- [ ] **Step 4: 运行 MVC 和 Swagger 覆盖测试**
Run: `mvn -Dtest=HikNvrPlaybackHlsControllerTest,ApiDocumentationCoverageTest test`
Expected: PASS.
### Task 8: 运行时验证与实际 NVR 验证
**Files:**
- Modify: `docs/superpowers/specs/2026-07-13-hik-nvr-sdk-controlled-hls-design.md`(仅记录实际验证结论)
- [ ] **Step 1: 运行完整 Java 测试套件**
Run: `mvn test -DskipTests=false`
Expected: all tests pass with zero failures and zero errors.
- [ ] **Step 2: 用临时端口启动服务**
Run: set `HIK_NVR_PLAYBACK_HLS_FFMPEG_PATH`, then start Spring on `18080`.
Expected: application starts without affecting the user-owned process on port 8080.
- [ ] **Step 3: 使用已验证的 NVR 实际录像区间创建 HLS 会话**
Run: call `POST /hik/nvr/playback/hls/sessions` with a known continuous Beijing-time recording interval.
Expected: `status=PLAYING`, no RTSP credential in response, and `hlsUrl` returns an m3u8 playlist after ZLM receives the stream.
- [ ] **Step 4: 验证控制行为**
依次调用 `PAUSE`、`RESUME`、`SET_SPEED` 2/4/8、`SEEK` 到区间内时间,并在每一步检查 SDK 控制返回值、会话状态与 HLS URL/playlist;定位后确认 `generation` 增加且前端必须加载返回的新 URL。
- [ ] **Step 5: 验证清理**
Run: `DELETE /hik/nvr/playback/hls/sessions/{sessionId}`.
Expected: SDK `NET_DVR_StopPlayBack` 被调用、FFmpeg 进程退出、ZLM 不再持续接收 RTMP,查询该会话返回 404。
- [ ] **Step 6: 核对 Git 边界**
Run: `git status --short` and `git diff --cached --name-status`.
Expected: no staging or commit action by this work; preserve all pre-existing user changes.

+ 61
- 0
docs/superpowers/plans/2026-07-14-hik-nvr-playback-console.md View File

@ -0,0 +1,61 @@
# 海康 NVR HLS 回放控制台实施计划
> 本计划对应 `docs/superpowers/specs/2026-07-14-hik-nvr-playback-console-design.md`。所有修改留在本地,不提交 Git。
## 1. 新增页面配置模型
**文件:**
- `src/main/java/com/inspect/nvr/hik/config/HikNvrPlaybackUiProperties.java`
- `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java`
- `src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiSessionRequest.java`
**实现:**
- 绑定 `hik.playback.ui`,保存 NVR 地址、端口、账号、密码、默认通道和设备树通道;
- `toPublicConfig()` 只返回页面所需非敏感字段;
- `toPlaybackRequest()` 将页面请求与后端固定配置合并,拒绝缺少密码或基础连接参数的配置;
- 请求 DTO 只允许 `channel`、`streamType`、`startTime`、`endTime`。
## 2. 新增页面接口
**文件:** `src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackUiController.java`
**实现:**
- `GET /hik/nvr/playback/hls/ui/config` 返回安全的页面配置;
- `POST /hik/nvr/playback/hls/ui/sessions` 合并固定配置后调用现有 HLS 服务;
- 复用已有异常处理和会话控制接口,不复制回放状态机;
- 增加 OpenAPI 中文说明和请求示例。
## 3. 增加运行配置
**文件:** `src/main/resources/application.yml`
增加 `hik.playback.ui` 默认项,地址默认使用当前 NVR `192.168.1.249`,密码默认空并支持环境变量覆盖;增加可配置的设备分组和通道列表。
## 4. 实现播放器页面
**文件:** `src/main/resources/static/playback.html`
**实现:**
- 工业监控台视觉:冷白网格背景、海军蓝文字、蓝色状态色、卡片和时间轨道;
- 设备树、日期/时间查询、视频舞台、状态徽标、录像区间轨道、控制栏和全屏;
- 使用 hls.js CDN 或浏览器原生 HLS 播放;
- 创建会话后轮询 `STARTING/PLAYING`,只在 HLS 就绪后加载 m3u8;
- 控制按钮调用暂停、恢复、1/2/4/8 倍速、SEEK 和删除接口;
- 处理 generation 变化、旧会话清理、错误提示、音量和时间轴点击跳转;
- 不在任何 HTML、脚本或请求体中出现 NVR 密码。
## 5. 测试与验证
**文件:** `src/test/java/com/inspect/nvr/hik/controller/HikNvrPlaybackUiControllerTest.java`
- 验证配置响应不包含 `password`
- 验证页面创建请求只向现有服务传入后端固定凭据和页面时间参数;
- 验证空密码配置返回明确的 400;
- 运行 `mvn test`,确认既有 62 个测试及新增测试通过;
- 使用 Maven 打包后检查 `target/classes/static/playback.html`
- 若本地应用可访问,使用 HTTP 请求验证配置接口、静态页面和缺少密码时的错误响应。

+ 176
- 0
docs/superpowers/specs/2026-07-13-hik-nvr-playback-search-design.md View File

@ -0,0 +1,176 @@
# 海康 NVR 历史录像查询与 RTSP 回放接口设计
## 目标
`com.inspect.nvr.hik` 下新增海康 NVR 历史录像查询接口。调用方传入 NVR 登录信息、通道、码流类型以及北京时间范围,服务端通过海康网络 SDK 查询该范围内实际存在的录像,返回实际连续录像区间及每个区间对应的 RTSP 回放地址。
本功能只查询录像并生成回放地址,不代理、转码或下载视频流。
## HTTP 接口
- 方法:`POST`
- 路径:`/hik/nvr/playback/search`
- Content-Type:`application/json`
- Swagger 分组:`海康NVR回放`
### 请求体
```json
{
"nvrIp": "192.168.1.100",
"sdkPort": 8000,
"rtspPort": 554,
"channel": 1,
"streamType": 1,
"username": "admin",
"password": "123456",
"startTime": "2026-07-13 12:00:00",
"endTime": "2026-07-13 13:00:00"
}
```
字段规则:
- `nvrIp`、`username`、`password` 必填。
- `sdkPort` 范围为 1~65535,用于 SDK 登录,通常为 8000。
- `rtspPort` 范围为 1~65535,通常为 554。
- `channel` 必须大于 0,使用海康 NVR 实际 SDK 通道号。
- `streamType` 取值 1 或 2;1 表示主码流,2 表示子码流。
- `startTime`、`endTime` 格式固定为 `yyyy-MM-dd HH:mm:ss`,语义固定为 `Asia/Shanghai`
- `endTime` 必须晚于 `startTime`
### 成功响应
有录像:
```json
{
"code": 0,
"message": "success",
"hasRecord": true,
"records": [
{
"timeRange": [
"20260713123000",
"20260713130000"
],
"rtspUrl": "rtsp://admin:123456@192.168.1.100:554/Streaming/tracks/101?starttime=20260713T043000Z&endtime=20260713T050000Z"
}
]
}
```
无录像:
```json
{
"code": 0,
"message": "success",
"hasRecord": false,
"records": []
}
```
`timeRange` 始终包含两个北京时间字符串,顺序为 `[开始时间, 结束时间]`,格式固定为 `yyyyMMddHHmmss`
## 组件划分
代码全部位于 `src/main/java/com/inspect/nvr/hik`
- `controller/HikNvrPlaybackController`:接收 HTTP 请求、调用服务并返回响应。
- `domain/HikNvrPlaybackRequest`:请求模型和 Swagger 字段说明;密码标记为只写字段。
- `domain/HikNvrPlaybackResponse`:查询状态、是否存在录像和录像区间列表。
- `domain/HikNvrPlaybackRecord`:单个连续录像区间及 RTSP 地址。
- `service/HikNvrPlaybackService`:参数校验、SDK 查询、区间裁剪与合并、SDK 通道到 RTSP 通道的衔接。
- `service/HikPlaybackUrlBuilder`:使用已解析的 RTSP 通道号和设备本地北京时间生成回放 URL。
- `com.inspect.nvr.service.HikLoginSession`:保存登录句柄及设备返回的模拟/数字通道布局,并提供 SDK 通道到 RTSP 通道的映射。
- `exception/HikNvrPlaybackException`:携带 SDK 错误码或参数错误信息。
- `controller/HikNvrPlaybackExceptionHandler`:将参数错误转换为 HTTP 400,将 NVR 登录或查询错误转换为 HTTP 502。
服务复用项目现有 `HikLoginService` 管理海康登录句柄,不重复创建独立登录缓存。登录缓存的值从单独的用户句柄扩展为 `HikLoginSession`,缓存时长、IP 键和登出策略保持不变。
## SDK 查询流程
1. 校验请求参数并按北京时间解析查询范围。
2. 构造 `NvrInfo`,通过 `HikLoginService.loginSession` 获取复用的登录句柄和设备通道布局。
3. 构造 `NET_DVR_FILECOND_V40`
- `lChannel` 使用请求通道号。
- `dwFileType=0xff`,查询所有录像类型。
- `dwIsLocked=0xff`,查询锁定和未锁定录像。
- `byFindType=0`,查询普通录像卷。
- `byQuickSearch=0`,获取完整文件信息。
- 主码流请求映射为 SDK `byStreamType=3`,子码流请求映射为 SDK `byStreamType=1`
- 开始和结束时间按设备本地北京时间填写 `NET_DVR_TIME`
4. 调用 `NET_DVR_FindFile_V40` 获取查询句柄;返回负数时读取 `NET_DVR_GetLastError` 并报错。
5. 循环调用 `NET_DVR_FindNextFile_V40`
- `NET_DVR_FILE_SUCCESS`:读取录像文件起止时间。
- `NET_DVR_ISFINDING`:短暂等待后继续,整体设置有限等待次数,避免请求无限阻塞。
- `NET_DVR_FILE_NOFIND``NET_DVR_NOMOREFILE`:正常结束查询。
- `NET_DVR_FILE_EXCEPTION``-1`:读取 SDK 错误码并报错。
6. 在 `finally` 中调用 `NET_DVR_FindClose_V30` 关闭查询句柄。
## 时间区间处理
- 将每个 SDK 录像区间裁剪到用户请求区间内,避免返回请求范围之外的时间。
- 丢弃裁剪后为空的区间。
- 按开始时间排序。
- 仅合并重叠或首尾完全相接的区间;存在真实时间间隔时分别返回,不能掩盖录像缺失。
- 返回时间使用北京时间 `yyyyMMddHHmmss`
- RTSP 参数保留设备本地北京时间数字,格式为 `yyyyMMdd'T'HHmmss'Z'`。目标 NVR 固件实测把参数数字按设备本地时间解释;将北京时间转换为 UTC 会建立会话但收不到录像数据。
例如用户查询 `12:00:00~13:00:00`,NVR 只存在 `12:30:00~13:00:00`,返回:
```json
"timeRange": ["20260713123000", "20260713130000"]
```
## RTSP URL
录像查询继续使用 SDK 通道号。RTSP 轨道使用设备展示通道序号,两者不能直接混用。登录返回的 `NET_DVR_DEVICEINFO_V30` 提供模拟通道数、模拟起始通道、数字通道数和数字起始通道,映射规则为:
```text
数字通道:rtspChannel = analogChannelCount + (sdkChannel - digitalStartChannel) + 1
模拟通道:rtspChannel = (sdkChannel - analogStartChannel) + 1
trackId = rtspChannel * 100 + streamType
```
例如纯 NVR 的模拟通道数为 `0`、数字起始通道为 `33`,则 SDK 通道 `33` 映射为 RTSP 通道 `1`,主码流轨道为 `101`。如果设备通道元数据无法覆盖请求通道,则保留原通道号作为兼容回退。
地址格式:
```text
rtsp://<编码后的用户名>:<编码后的密码>@<NVR地址>:<RTSP端口>/Streaming/tracks/<trackId>?starttime=<北京时间开始>&endtime=<北京时间结束>
```
账号和密码按照 URL user-info 规则进行百分号编码。服务端日志禁止输出完整请求对象、密码或最终 RTSP URL。
## 错误处理
- 请求字段缺失、端口或通道非法、时间格式错误、结束时间不晚于开始时间:HTTP 400。
- SDK 登录失败、NVR 离线、通道错误、权限不足、查询失败或查询超时:HTTP 502,响应中包含 SDK 错误码和中文错误信息。
- 查询成功但没有录像:HTTP 200,`hasRecord=false`,`records=[]`。
- 查询句柄关闭失败只记录不包含敏感信息的警告,不覆盖原始查询结果或异常。
## 测试
测试先于生产代码编写,覆盖:
- 北京时间解析及 RTSP 设备本地时间格式化。
- 纯 NVR 和混合 DVR 的 SDK 通道到 RTSP 通道映射。
- 主、子码流轨道号和 SDK 码流类型映射。
- 用户名、密码特殊字符的安全编码。
- 查询范围内只有部分录像时,返回裁剪后的完整时间戳。
- 重叠和首尾相接区间被合并,存在时间缺口的区间保持分离。
- 无录像返回空列表。
- SDK 查找中状态能够有限重试。
- 登录、查询和通道错误返回对应错误码。
- 成功、无录像及异常路径都关闭查询句柄。
- Swagger 覆盖测试更新为包含新增接口、参数和响应模型。
## 非目标
- 不转码为 HLS、FLV 或 MP4。
- 不在服务端代理 RTSP 码流。
- 不下载录像文件。
- 不修改现有海康登录缓存的过期时长、键和登出策略。
- 不提交或暂存任何文件。

+ 124
- 0
docs/superpowers/specs/2026-07-13-hik-nvr-sdk-controlled-hls-design.md View File

@ -0,0 +1,124 @@
# 海康 NVR SDK 受控 HLS 回放设计
**状态:** 用户已确认直接实现;所有变更保留在当前本地工作区,不提交。
## 目标
让本机浏览器以 HLS 播放海康 NVR 的历史录像,并由服务端控制同一个海康 SDK 回放句柄,支持:
- 指定北京时间开始、结束时间创建回放;
- 暂停、恢复、正常速度;
- 真正调用 NVR 回放控制实现 2 倍、4 倍、8 倍;
- 跳转到任意录像时间点;
- 不向浏览器返回 NVR RTSP 地址、NVR 密码或媒体服务控制密钥。
## 约束与结论
ZLMediaKit 自行拉取 RTSP 时会创建一条独立的 NVR RTSP 会话,无法让 Spring 服务通过 `NET_DVR_PlayBackControl_V40` 控制那条会话。因此不能使用“ZLM 直接拉 NVR RTSP”作为可控回放链路。
本实现采用 SDK 回放句柄作为唯一的控制源:SDK 的裸 H.264 帧回调写入本机 FFmpeg,FFmpeg 推 RTMP 给本机 ZLMediaKit,ZLMediaKit 再生成 HLS。这样暂停、快放、定位都作用于实际向浏览器输送帧数据的回放句柄。
当前已验证的 NVR 历史回放是 H.264。第一版只支持标准 H.264 视频;H.265 或私有/加密码流会在建立会话时失败并返回明确错误,不伪装成可播放 HLS。
## 架构
```mermaid
flowchart LR
Browser["本机前端浏览器"] -->|"HLS m3u8"| ZLM["ZLMediaKit Docker\n127.0.0.1:18081"]
App["Spring 服务 :8080"] -->|"SDK 登录、回放、控制"| NVR["海康 NVR :8000"]
NVR -->|"H.264 裸帧回调"| App
App -->|"stdin 原始 H.264"| FFmpeg["本机 FFmpeg"]
FFmpeg -->|"RTMP"| ZLM
Browser -->|"会话/控制 API"| App
```
每个 HLS 会话拥有一套独立资源:海康 SDK 回放句柄、持久化 JNA 回调对象、帧队列与写入线程、FFmpeg 进程,以及 ZLM 的 `playback/{streamId}` RTMP 流。
## API
### 创建会话
`POST /hik/nvr/playback/hls/sessions`
请求体复用 `HikNvrPlaybackRequest`。服务先调用已有录像查询逻辑,得到实际连续录像区间;无录像返回 `404`,请求范围内存在多个不连续区间时返回 `409` 并要求前端先按一个连续区间重新发起请求。
成功响应:
```json
{
"sessionId": "4c3b0cf0-2a92-4ddc-a36a-7e5f31b01f10",
"status": "PLAYING",
"speed": 1,
"actualTimeRange": ["20260713123000", "20260713130000"],
"hlsUrl": "http://127.0.0.1:18081/playback/4c3b0cf02a924ddca36a7e5f31b01f10-1/hls.m3u8"
}
```
前端通过 hls.js(Chrome/Edge)或原生 HLS(Safari)加载 `hlsUrl`。前端不能再对 `video.playbackRate` 做 2/4/8 倍设置;倍速必须调用后端控制接口,避免把客户端倍速与 NVR 倍速叠加。
### 查询会话
`GET /hik/nvr/playback/hls/sessions/{sessionId}`
返回会话状态、当前速度、实际录像区间、当前 HLS 地址和失败原因(如有)。状态为 `STARTING`、`PLAYING`、`PAUSED`、`STOPPED` 或 `FAILED`
### 控制会话
`POST /hik/nvr/playback/hls/sessions/{sessionId}/controls`
```json
{
"action": "SET_SPEED",
"speed": 4
}
```
可用动作:
- `PAUSE`:调用 `NET_DVR_PLAYPAUSE`
- `RESUME`:调用 `NET_DVR_PLAYRESTART`
- `SET_SPEED`:仅接受 `1`、`2`、`4`、`8`。先调用 `NET_DVR_PLAYNORMAL`,再按指数次数调用 `NET_DVR_PLAYFAST`
- `SEEK`:请求 `targetTime`(固定 `yyyy-MM-dd HH:mm:ss`,北京时间)。先校验目标时间位于当前实际录像区间,再调用 `NET_DVR_PLAYSETTIME`(控制码 26)。为避免旧 HLS 缓冲与新 GOP 混合,控制成功后会切换到新的流代次和新的 HLS 地址;若设备不支持绝对定位,则停止旧回放并以目标时间重建 SDK 回放句柄作为兼容回退;
- `STOP`:停止 SDK 回放、关闭帧桥和 FFmpeg,并使会话进入 `STOPPED`
`SEEK` 的响应始终带回新的 `hlsUrl`。前端收到后销毁旧 hls.js 实例并加载新地址。
### 销毁会话
`DELETE /hik/nvr/playback/hls/sessions/{sessionId}`
`STOP` 等价并从会话表删除。服务关闭时也会关闭自己创建的所有会话。定时清理会在“请求录像时长 + 10 分钟”后关闭仍未结束的会话,防止孤儿 SDK 句柄和 FFmpeg 进程。
## SDK、帧桥与倍速
创建 SDK 会话时使用 `NET_DVR_PlayBackByTime_V40`,注册 `NET_DVR_SetPlayBackESCallBack`,再调用 `NET_DVR_PLAYSTART`。回调每次提供一帧裸码流及帧类型、时间戳。JNA 回调中只复制帧数据并放入有界队列,绝不执行网络、FFmpeg 或 SDK 控制调用。
单独写入线程将 H.264 帧写入 FFmpeg 的标准输入。FFmpeg 不使用 `-re`,并基于接收时间生成时间戳后推送 RTMP,因此 NVR SDK 的快放输出会以更短的媒体时间进入 ZLM/HLS。队列压力时优先丢弃 B/P 帧,不丢 I 帧;连续无法写入则会停止会话并标记为 `FAILED`
海康 SDK 中的 `NET_DVR_PLAYFAST` 每调用一次将当前速度乘以 2;本设计通过先恢复 1 倍再调用 1、2、3 次,保证目标值准确为 2、4、8 倍。
## 本机媒体环境
- Docker Desktop 启动后拉取 ZLMediaKit 镜像;
- ZLM 仅映射 `127.0.0.1:18081 -> 80`(HLS/HTTP)和 `127.0.0.1:1935 -> 1935`(FFmpeg RTMP 推流);
- ZLM 显式启用 HLS、2 秒切片、跨域响应;
- FFmpeg 安装到 `C:\tools\ffmpeg`,应用从 `HIK_NVR_HLS_FFMPEG_PATH` 读取 `ffmpeg.exe` 路径;
- 应用从 `HIK_NVR_HLS_ZLM_RTMP_BASE_URL``HIK_NVR_HLS_ZLM_HTTP_BASE_URL` 读取 ZLM 地址,默认分别为 `rtmp://127.0.0.1:1935``http://127.0.0.1:18081`
- 本地 ZLM 配置和环境文件不含在 Git 提交中,且不开放到局域网。
## 错误处理与安全
- ZLM/FFmpeg 未就绪:`502`,返回组件状态但不泄露 NVR 密码;
- SDK 登录、创建回放、注册回调、控制失败:`502`,保留海康错误码;
- 无录像:`404`;跨越多个不连续录像段:`409`;非法速度或跳转时间:`400`;会话不存在:`404`;
- 日志和异常响应统一脱敏 RTSP 用户信息;
- NVR 密码只存在于入站请求、SDK 登录和内存中,浏览器响应不返回密码;
- FFmpeg 命令的输入来自 SDK 标准输入,不把 RTSP 密码放到操作系统进程命令行。
## 验证标准
1. 单元测试验证控制码、速度映射、SDK VOD 参数、HLS/RTMP URL、队列背压和资源清理。
2. MVC 测试验证创建、查询、暂停、恢复、1/2/4/8 倍、定位、停止和异常响应。
3. Docker 运行 ZLM 后,服务可创建 HLS 会话并在 `127.0.0.1:18081` 返回 m3u8。
4. 使用当前 NVR 的已知录像区间手工验证:1 倍播放、暂停/恢复、2/4/8 倍切换、跳转到指定时间并重新加载返回的 HLS 地址。

+ 103
- 0
docs/superpowers/specs/2026-07-14-hik-nvr-playback-console-design.md View File

@ -0,0 +1,103 @@
# 海康 NVR HLS 回放控制台设计
**状态:** 已获用户确认,修改仅保留在本地工作区,不提交 Git。
## 1. 目标
为现有海康 NVR SDK 控制的 HLS 回放能力增加一个可直接打开的浏览器播放器。用户只需要在页面选择设备、日期和时间并点击查询,页面负责创建、轮询和控制回放会话,不再手工重复调用 Swagger 接口。
播放器覆盖当前后端已经支持的能力:
- 固定按北京时间输入和展示查询、跳转时间;
- 展示实际存在的连续录像区间;
- 自动创建 HLS 会话并等待 `STARTING -> PLAYING`
- 播放、暂停、恢复、1/2/4/8 倍速、时间轴跳转和全屏;
- HLS 地址只在浏览器同源页面中使用,不向页面返回 NVR 密码。
## 2. 已确认的配置策略
采用用户选择的 B 方案:NVR IP、SDK/RTSP 端口、账号和密码固定在 Spring Boot 后端配置中。页面只接收通道、码流类型和时间范围。
配置前缀为 `hik.playback.ui`
```yaml
hik:
playback:
ui:
device-name: 海康 NVR
nvr-ip: ${HIK_NVR_IP:192.168.1.249}
sdk-port: ${HIK_NVR_SDK_PORT:8000}
rtsp-port: ${HIK_NVR_RTSP_PORT:554}
username: ${HIK_NVR_USERNAME:admin}
password: ${HIK_NVR_PASSWORD:}
default-channel: 1
default-stream-type: 1
```
密码使用环境变量 `HIK_NVR_PASSWORD`,不会写入 HTML、Swagger 响应或日志。若密码为空,配置接口仍可打开页面,但创建会话时返回明确的配置错误。
## 3. 后端接口
### 3.1 读取页面配置
`GET /hik/nvr/playback/hls/ui/config`
返回页面需要的非敏感配置、设备树和默认通道。返回对象不包含 `password`,并通过 `configured` 标识后端是否已经具备创建会话的必要配置。
### 3.2 页面创建回放
`POST /hik/nvr/playback/hls/ui/sessions`
请求体只包含:
```json
{
"channel": 1,
"streamType": 1,
"startTime": "2026-07-13 12:00:00",
"endTime": "2026-07-13 13:00:00"
}
```
控制台控制请求继续复用现有 `/sessions/{sessionId}/controls``DELETE /sessions/{sessionId}`,避免复制回放状态机。
## 4. 前端实现
不引入 Node、React 或 Thymeleaf,使用 Spring Boot 静态资源目录中的 `playback.html`,通过 `http://localhost:18080/playback.html` 打开。这样与后端同源,接口无需额外 CORS 配置。
页面采用“工业监控台”视觉方向:冷白工作区、深海军蓝文字、单一高亮蓝色、细边框卡片、淡网格背景和有限的入场动画。布局包含:
1. 左侧设备树:固定 NVR、分组和可选通道;
2. 顶部时间查询栏:日期、开始时间、结束时间、查询和重置;
3. 中央视频舞台:HLS 视频、状态徽标、错误/等待提示和当前北京时间;
4. 下方录像轨道:按请求时间范围绘制实际录像块,点击轨道发送 `SEEK`
5. 控制栏:到起点、暂停/恢复、到末尾、当前时间、音量、1/2/4/8 倍速和全屏。
播放器使用 hls.js CDN,在 Chrome/Edge 中加载 HLS;Safari 等支持原生 HLS 的浏览器直接设置 `video.src`。当后端返回新的 `generation` 或 HLS 地址时,销毁旧实例并重新加载,防止跳转后继续使用旧切片。
## 5. 状态与错误处理
- 页面加载时读取配置;读取失败显示连接错误,不阻止页面布局展示。
- 查询时禁用查询按钮,创建成功后轮询会话状态;`STARTING` 显示“等待首个关键帧”,`PLAYING` 才加载 m3u8。
- 404、409、502、503 等后端错误解析 `message` 并显示在视频舞台和顶部状态栏。
- 页面关闭或切换查询时,删除旧会话,释放 SDK、FFmpeg 和 ZLMediaKit 资源。
- 暂停、恢复、倍速和跳转均由后端 SDK 控制;前端不使用 `video.playbackRate` 伪造 NVR 倍速。
## 6. 文件变更
- 新增 `HikNvrPlaybackUiProperties`、页面配置 DTO、页面创建请求 DTO;
- 新增 `HikNvrPlaybackUiController`
- 在 `application.yml` 增加 `hik.playback.ui` 固定配置;
- 新增 `src/main/resources/static/playback.html`
- 新增后端控制器单元测试和页面接口契约测试;
- 更新设计文档与实施计划,所有变更不提交 Git。
## 7. 自审结论
- 配置策略与用户确认的 B 方案一致,页面不要求用户输入 NVR 账号密码;
- 页面只依赖现有 HLS 会话服务,不改变 SDK、FFmpeg 或 ZLMediaKit 数据通路;
- 倍速范围与现有服务的 1/2/4/8 约束一致;
- HLS `STARTING` 轮询和 generation 重载覆盖了此前 VLC/HLS 首帧延迟及跳转旧切片问题;
- 静态页面无需新增前端构建环境,适合当前 Spring Boot 项目;
- 密码使用环境变量,避免将用户提供的凭据硬编码到仓库。

BIN
docs/中国华电盐源升压站智巡接口梳理及接口文档_v0.1.docx View File


+ 315
- 0
export-inspect-nvr-amd64.bat View File

@ -0,0 +1,315 @@
@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Build and export only the linux/amd64 inspect-nvr application image.
rem The BAT file intentionally contains ASCII only so cmd.exe cannot corrupt
rem UTF-8 comments or messages into executable command fragments.
rem
rem Usage:
rem export-inspect-nvr-amd64.bat
rem export-inspect-nvr-amd64.bat --no-cache
rem export-inspect-nvr-amd64.bat D:\backup\inspect-nvr-app-amd64.tar --no-cache
rem export-inspect-nvr-amd64.bat --preflight
rem export-inspect-nvr-amd64.bat --help
cd /d "%~dp0"
if not exist "%~dp0deploy-package" mkdir "%~dp0deploy-package"
set "IMAGE=inspect-nvr:local"
set "FFMPEG_IMAGE="
set "FFMPEG_DIGEST=sha256:3d1966c91f65f7e7a4ea09203852c8563ef9e48c3ca2cd5e79c8bc80bde02569"
set "OUTPUT=%~dp0deploy-package\inspect-nvr-app-amd64-latest.tar"
set "NO_CACHE=0"
set "PREFLIGHT=0"
set "OLD_CONTAINER_ID="
set "OLD_IMAGE_ID="
set "NEW_IMAGE_ID="
if /I "%~1"=="--help" goto :usage
if /I "%~1"=="--preflight" set "PREFLIGHT=1"
if /I "%~1"=="--no-cache" set "NO_CACHE=1"
if not "%~1"=="" if /I not "%~1"=="--preflight" if /I not "%~1"=="--no-cache" set "OUTPUT=%~1"
if /I "%~2"=="--no-cache" set "NO_CACHE=1"
echo [1/10] Checking Docker...
where docker >nul 2>&1
if errorlevel 1 (
echo [ERROR] Docker was not found. Start Docker Desktop first.
goto :fail
)
docker info >nul 2>&1
if errorlevel 1 (
echo [ERROR] The Docker engine is not running.
goto :fail
)
docker compose version >nul 2>&1
if errorlevel 1 (
echo [ERROR] The docker compose plugin is not available.
goto :fail
)
docker buildx version >nul 2>&1
if errorlevel 1 (
echo [ERROR] Docker Buildx is not available.
goto :fail
)
if not exist "%~dp0docker-compose.yml" (
echo [ERROR] docker-compose.yml was not found in %~dp0
goto :fail
)
rem Compose only needs placeholder ZLM URLs while resolving the build model.
rem Real remote ZLM URLs are still mandatory before the local container starts.
findstr /R /B /C:"ZLM_RTMP_BASE_URL=" "%~dp0.env" >nul 2>&1
if errorlevel 1 (
set "ZLM_RTMP_BASE_URL=rtmp://build-only.invalid:1935"
echo [INFO] ZLM_RTMP_BASE_URL is missing. Using a build-only placeholder.
)
findstr /R /B /C:"ZLM_HTTP_BASE_URL=" "%~dp0.env" >nul 2>&1
if errorlevel 1 (
set "ZLM_HTTP_BASE_URL=http://build-only.invalid:18081"
echo [INFO] ZLM_HTTP_BASE_URL is missing. Using a build-only placeholder.
)
echo [2/10] Checking the FFmpeg base image...
rem Try verified mirrors first. The digest check prevents a mirror from
rem returning content that differs from the official 6.1 manifest.
call :try_ffmpeg_image "docker.1ms.run/mwader/static-ffmpeg:6.1"
call :try_ffmpeg_image "dockerproxy.net/mwader/static-ffmpeg:6.1"
call :try_ffmpeg_image "hub.rat.dev/mwader/static-ffmpeg:6.1"
call :try_ffmpeg_image "registry-1.docker.io/mwader/static-ffmpeg:6.1"
if not defined FFMPEG_IMAGE (
echo [ERROR] No verified FFmpeg registry is reachable.
echo [ERROR] Check Docker Desktop proxy, DNS, or registry connectivity.
goto :fail
)
echo Selected: !FFMPEG_IMAGE!
echo Verified digest: %FFMPEG_DIGEST%
if "!PREFLIGHT!"=="1" (
echo.
echo Preflight passed. No image was removed or built.
endlocal
exit /b 0
)
echo [3/10] Removing the old %IMAGE% image...
rem Read the image from the existing Compose container first. This also finds
rem an untagged image left behind when an earlier build stopped with an error.
for /f "delims=" %%C in ('docker compose ps --all -q inspect-nvr 2^>nul') do set "OLD_CONTAINER_ID=%%C"
if defined OLD_CONTAINER_ID (
for /f "delims=" %%I in ('docker inspect --format "{{.Image}}" "!OLD_CONTAINER_ID!" 2^>nul') do set "OLD_IMAGE_ID=%%I"
)
docker image inspect "%IMAGE%" >nul 2>&1
if errorlevel 1 (
if defined OLD_IMAGE_ID (
echo The running container uses an already untagged old image.
) else (
echo No old image with this name exists.
)
) else (
rem Remember the exact old image so its untagged data can be deleted after
rem Compose replaces the running application container.
if not defined OLD_IMAGE_ID (
for /f "delims=" %%I in ('docker image inspect --format "{{.Id}}" "%IMAGE%" 2^>nul') do set "OLD_IMAGE_ID=%%I"
)
if not defined OLD_IMAGE_ID (
echo [ERROR] Failed to read the old %IMAGE% image ID.
goto :fail
)
rem Force only removes the image tag when a running container still uses
rem the old image ID, so the current container can keep running during build.
docker image rm --force "%IMAGE%"
if errorlevel 1 (
echo [ERROR] Failed to remove the old %IMAGE% image.
goto :fail
)
)
echo [4/10] Building %IMAGE%...
if "!NO_CACHE!"=="1" (
echo Building with --no-cache. The first build can take a while.
docker compose build --no-cache inspect-nvr
) else (
echo Using the build cache. Source or pom.xml changes rebuild the JAR.
docker compose build inspect-nvr
)
if errorlevel 1 (
echo [ERROR] Docker image build failed. Review the Maven or Docker log above.
echo [INFO] An existing running container was not stopped by this script.
goto :fail
)
echo [5/10] Checking the image platform...
docker image inspect "%IMAGE%" >nul 2>&1
if errorlevel 1 (
echo [ERROR] The build finished without creating %IMAGE%.
goto :fail
)
for /f "delims=" %%I in ('docker image inspect --format "{{.Id}}" "%IMAGE%" 2^>nul') do set "NEW_IMAGE_ID=%%I"
if not defined NEW_IMAGE_ID (
echo [ERROR] Failed to read the new %IMAGE% image ID.
goto :fail
)
set "PLATFORM_FILE=%TEMP%\inspect-nvr-platform-%RANDOM%.txt"
docker image inspect --format "{{.Os}}/{{.Architecture}}" "%IMAGE%" > "%PLATFORM_FILE%"
if errorlevel 1 (
echo [ERROR] Failed to read the image platform.
del /f /q "%PLATFORM_FILE%" >nul 2>&1
goto :fail
)
set "PLATFORM="
set /p PLATFORM=<"%PLATFORM_FILE%"
del /f /q "%PLATFORM_FILE%" >nul 2>&1
if /I not "!PLATFORM!"=="linux/amd64" (
echo [ERROR] Image platform is !PLATFORM!, expected linux/amd64.
goto :fail
)
echo Platform confirmed: !PLATFORM!
if exist "%OUTPUT%" (
echo [INFO] Output file already exists: %OUTPUT%
choice /C YN /N /M "Overwrite it? [Y/N]"
if errorlevel 2 (
echo Cancelled.
goto :fail
)
del /f /q "%OUTPUT%" >nul 2>&1
)
if exist "%OUTPUT%.sha256" del /f /q "%OUTPUT%.sha256" >nul 2>&1
echo [6/10] Exporting the application image...
docker save -o "%OUTPUT%" "%IMAGE%"
if errorlevel 1 (
echo [ERROR] docker save failed. The output file may be in use.
goto :fail
)
echo [7/10] Checking the tar contents...
where tar >nul 2>&1
if not errorlevel 1 (
tar -xOf "%OUTPUT%" manifest.json | findstr /I /C:"zlmediakit" >nul
if not errorlevel 1 (
echo [ERROR] ZLMediaKit was found in the application tar.
goto :fail
)
echo ZLMediaKit is not present in the tar.
) else (
echo [INFO] tar was not found. docker save only exported %IMAGE%.
)
echo [8/10] Generating the SHA256 file...
where powershell >nul 2>&1
if errorlevel 1 (
echo [ERROR] PowerShell was not found.
goto :fail
)
set "HASH_FILE=%OUTPUT%.sha256"
rem Use .NET directly because Windows PowerShell launched through cmd.exe can
rem inherit PowerShell 7 module paths and then fail to autoload Get-FileHash.
powershell -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference='Stop'; try { $stream=[IO.File]::OpenRead($env:OUTPUT); try { $sha=[Security.Cryptography.SHA256]::Create(); try { $hash=([BitConverter]::ToString($sha.ComputeHash($stream))).Replace('-','').ToLowerInvariant() } finally { if ($null -ne $sha) { $sha.Dispose() } } } finally { if ($null -ne $stream) { $stream.Dispose() } }; if ($hash.Length -ne 64) { throw 'Unexpected SHA256 length.' }; $name=[IO.Path]::GetFileName($env:OUTPUT); [IO.File]::WriteAllText($env:HASH_FILE, ($hash + ' ' + $name + [char]10), [Text.Encoding]::ASCII) } catch { [Console]::Error.WriteLine($_.Exception.Message); exit 1 }"
if errorlevel 1 (
echo [ERROR] SHA256 generation failed.
goto :fail
)
set "HASH="
set /p HASH=<"%HASH_FILE%"
echo [9/10] Recreating the local application container...
rem Build placeholders must never be used when the application starts.
findstr /R /B /C:"ZLM_RTMP_BASE_URL=" "%~dp0.env" >nul 2>&1
if errorlevel 1 (
echo [ERROR] The image was built and exported, but the container was not recreated.
echo [ERROR] Set a real ZLM_RTMP_BASE_URL in .env and run Compose again.
goto :fail
)
findstr /R /B /C:"ZLM_HTTP_BASE_URL=" "%~dp0.env" >nul 2>&1
if errorlevel 1 (
echo [ERROR] The image was built and exported, but the container was not recreated.
echo [ERROR] Set a real ZLM_HTTP_BASE_URL in .env and run Compose again.
goto :fail
)
docker compose up -d --force-recreate --no-build inspect-nvr
if errorlevel 1 (
echo [ERROR] The image was exported, but the local container recreate failed.
goto :fail
)
echo [10/10] Releasing the previous application image...
if not defined OLD_IMAGE_ID (
echo No previous image data needs cleanup.
) else if /I "!OLD_IMAGE_ID!"=="!NEW_IMAGE_ID!" (
rem An unchanged cached build can reproduce the same image ID. That ID now
rem belongs to the new tag and container, so there is no duplicate to delete.
echo The rebuilt image reused the same image ID. No duplicate remains.
) else (
rem The old Compose container is gone, so deleting its exact image ID frees
rem only obsolete inspect-nvr layers and leaves other project images intact.
docker image rm "!OLD_IMAGE_ID!"
if errorlevel 1 (
echo [WARN] The previous image is still used by another container.
echo [WARN] Docker kept it to avoid breaking that container.
) else (
echo Previous image data released: !OLD_IMAGE_ID!
)
)
echo.
echo Export completed:
echo Image: %IMAGE%
echo File: %OUTPUT%
echo Hash: %HASH_FILE%
echo SHA256: !HASH!
echo Local container: recreated with the new image
echo.
echo Ubuntu import command:
echo sudo docker load -i inspect-nvr-app-amd64-latest.tar
echo.
echo For a clean rebuild:
echo export-inspect-nvr-amd64.bat --no-cache
echo.
pause
endlocal
exit /b 0
:usage
echo Usage:
echo export-inspect-nvr-amd64.bat
echo export-inspect-nvr-amd64.bat --no-cache
echo export-inspect-nvr-amd64.bat OUTPUT_FILE [--no-cache]
echo export-inspect-nvr-amd64.bat --preflight
endlocal
exit /b 0
:try_ffmpeg_image
if defined FFMPEG_IMAGE exit /b 0
set "FFMPEG_CANDIDATE=%~1"
set "FFMPEG_CHECK_FILE=%TEMP%\inspect-nvr-ffmpeg-%RANDOM%.txt"
echo Trying !FFMPEG_CANDIDATE!...
docker buildx imagetools inspect "!FFMPEG_CANDIDATE!" >"!FFMPEG_CHECK_FILE!" 2>&1
if errorlevel 1 (
echo Unavailable.
del /f /q "!FFMPEG_CHECK_FILE!" >nul 2>&1
exit /b 0
)
findstr /L /C:"!FFMPEG_DIGEST!" "!FFMPEG_CHECK_FILE!" >nul 2>&1
if errorlevel 1 (
echo Rejected because the manifest digest does not match.
del /f /q "!FFMPEG_CHECK_FILE!" >nul 2>&1
exit /b 0
)
del /f /q "!FFMPEG_CHECK_FILE!" >nul 2>&1
set "FFMPEG_IMAGE=!FFMPEG_CANDIDATE!"
echo Available and digest verified.
exit /b 0
:fail
echo.
echo Script stopped. Press any key to close this window.
pause >nul
endlocal
exit /b 1

BIN
lib.rar View File


+ 1
- 0
pom.xml View File

@ -238,6 +238,7 @@
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>


+ 11
- 0
sdkLog/2025-08-08.log View File

@ -0,0 +1,11 @@
Begin Time:2025-08-08T16:15:04.191
[2025-08-08T16:15:04.192 info Netsdk:87378 23964:17588 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-08-08T16:15:04.193 info Netsdk:87378 23964:17588 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034FC0000
[2025-08-08T16:15:04.193 info Netsdk:87378 23964:17588 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-08-08T16:15:04.196 info Netsdk:87378 23964:17588 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002CFF0090, dwUser=0000000000000000].
[2025-08-08T16:15:04.196 info Netsdk:87378 23964:17588 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-08-08T16:15:04.196 info Netsdk:87378 23964:17588 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-08-08T16:15:04.196 info Netsdk:87378 23964:17588 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-08-08T16:15:04.198 info Netsdk:87378 23964:17588 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-08-08T16:15:04.198 info Netsdk:87378 23964:17588 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 22
- 0
sdkLog/2025-08-15.log View File

@ -0,0 +1,22 @@
Begin Time:2025-08-15T18:48:25.428
[2025-08-15T18:48:25.428 info Netsdk:87378 28828:30576 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-08-15T18:48:25.430 info Netsdk:87378 28828:30576 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000349B0000
[2025-08-15T18:48:25.430 info Netsdk:87378 28828:30576 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-08-15T18:48:25.432 info Netsdk:87378 28828:30576 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002D60090, dwUser=0000000000000000].
[2025-08-15T18:48:25.433 info Netsdk:87378 28828:30576 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-08-15T18:48:25.433 info Netsdk:87378 28828:30576 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-08-15T18:48:25.433 info Netsdk:87378 28828:30576 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-08-15T18:48:25.433 info Netsdk:87378 28828:30576 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-08-15T18:48:25.433 info Netsdk:87378 28828:30576 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-08-15T19:12:36.854
[2025-08-15T19:12:36.854 info Netsdk:87378 26944:32452 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-08-15T19:12:36.855 info Netsdk:87378 26944:32452 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000033F20000
[2025-08-15T19:12:36.855 info Netsdk:87378 26944:32452 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-08-15T19:12:36.857 info Netsdk:87378 26944:32452 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002D70090, dwUser=0000000000000000].
[2025-08-15T19:12:36.857 info Netsdk:87378 26944:32452 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-08-15T19:12:36.857 info Netsdk:87378 26944:32452 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-08-15T19:12:36.857 info Netsdk:87378 26944:32452 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-08-15T19:12:36.858 info Netsdk:87378 26944:32452 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-08-15T19:12:36.858 info Netsdk:87378 26944:32452 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 22
- 0
sdkLog/2025-08-18.log View File

@ -0,0 +1,22 @@
Begin Time:2025-08-18T11:23:01.777
[2025-08-18T11:23:01.777 info Netsdk:87378 25592:42172 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-08-18T11:23:01.782 info Netsdk:87378 25592:42172 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000347D0000
[2025-08-18T11:23:01.782 info Netsdk:87378 25592:42172 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-08-18T11:23:01.788 info Netsdk:87378 25592:42172 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002C740090, dwUser=0000000000000000].
[2025-08-18T11:23:01.788 info Netsdk:87378 25592:42172 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-08-18T11:23:01.789 info Netsdk:87378 25592:42172 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-08-18T11:23:01.789 info Netsdk:87378 25592:42172 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-08-18T11:23:01.791 info Netsdk:87378 25592:42172 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-08-18T11:23:01.791 info Netsdk:87378 25592:42172 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-08-18T11:30:56.676
[2025-08-18T11:30:56.676 info Netsdk:87378 22052:27440 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-08-18T11:30:56.680 info Netsdk:87378 22052:27440 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034550000
[2025-08-18T11:30:56.680 info Netsdk:87378 22052:27440 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-08-18T11:30:56.685 info Netsdk:87378 22052:27440 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000028D0090, dwUser=0000000000000000].
[2025-08-18T11:30:56.685 info Netsdk:87378 22052:27440 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-08-18T11:30:56.685 info Netsdk:87378 22052:27440 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-08-18T11:30:56.686 info Netsdk:87378 22052:27440 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-08-18T11:30:56.687 info Netsdk:87378 22052:27440 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-08-18T11:30:56.687 info Netsdk:87378 22052:27440 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 11
- 0
sdkLog/2025-08-31.log View File

@ -0,0 +1,11 @@
Begin Time:2025-08-31T02:08:45.885
[2025-08-31T02:08:45.886 info Netsdk:87378 11640:4000 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-08-31T02:08:45.890 info Netsdk:87378 11640:4000 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034D90000
[2025-08-31T02:08:45.891 info Netsdk:87378 11640:4000 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-08-31T02:08:45.896 info Netsdk:87378 11640:4000 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002CDD0090, dwUser=0000000000000000].
[2025-08-31T02:08:45.896 info Netsdk:87378 11640:4000 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-08-31T02:08:45.897 info Netsdk:87378 11640:4000 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-08-31T02:08:45.897 info Netsdk:87378 11640:4000 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-08-31T02:08:45.899 info Netsdk:87378 11640:4000 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-08-31T02:08:45.899 info Netsdk:87378 11640:4000 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 33
- 0
sdkLog/2025-09-01.log View File

@ -0,0 +1,33 @@
Begin Time:2025-09-01T09:42:32.204
[2025-09-01T09:42:32.204 info Netsdk:87378 30944:31580 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-01T09:42:32.205 info Netsdk:87378 30944:31580 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000344A0000
[2025-09-01T09:42:32.205 info Netsdk:87378 30944:31580 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-01T09:42:32.208 info Netsdk:87378 30944:31580 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002970090, dwUser=0000000000000000].
[2025-09-01T09:42:32.208 info Netsdk:87378 30944:31580 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-01T09:42:32.208 info Netsdk:87378 30944:31580 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-01T09:42:32.208 info Netsdk:87378 30944:31580 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-01T09:42:32.209 info Netsdk:87378 30944:31580 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-01T09:42:32.209 info Netsdk:87378 30944:31580 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-01T09:44:01.510
[2025-09-01T09:44:01.510 info Netsdk:87378 31500:30292 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-01T09:44:01.512 info Netsdk:87378 31500:30292 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034DB0000
[2025-09-01T09:44:01.512 info Netsdk:87378 31500:30292 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-01T09:44:01.513 info Netsdk:87378 31500:30292 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002CDE0090, dwUser=0000000000000000].
[2025-09-01T09:44:01.513 info Netsdk:87378 31500:30292 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-01T09:44:01.513 info Netsdk:87378 31500:30292 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-01T09:44:01.513 info Netsdk:87378 31500:30292 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-01T09:44:01.514 info Netsdk:87378 31500:30292 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-01T09:44:01.514 info Netsdk:87378 31500:30292 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-01T16:05:10.349
[2025-09-01T16:05:10.350 info Netsdk:87378 33720:33840 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-01T16:05:10.356 info Netsdk:87378 33720:33840 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034CB0000
[2025-09-01T16:05:10.356 info Netsdk:87378 33720:33840 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-01T16:05:10.363 info Netsdk:87378 33720:33840 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002CC90090, dwUser=0000000000000000].
[2025-09-01T16:05:10.363 info Netsdk:87378 33720:33840 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-01T16:05:10.363 info Netsdk:87378 33720:33840 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-01T16:05:10.363 info Netsdk:87378 33720:33840 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-01T16:05:10.365 info Netsdk:87378 33720:33840 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-01T16:05:10.365 info Netsdk:87378 33720:33840 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 55
- 0
sdkLog/2025-09-02.log View File

@ -0,0 +1,55 @@
Begin Time:2025-09-02T17:17:27.785
[2025-09-02T17:17:27.785 info Netsdk:87378 25548:32252 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-02T17:17:27.787 info Netsdk:87378 25548:32252 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034EE0000
[2025-09-02T17:17:27.787 info Netsdk:87378 25548:32252 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-02T17:17:27.789 info Netsdk:87378 25548:32252 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002CE70090, dwUser=0000000000000000].
[2025-09-02T17:17:27.789 info Netsdk:87378 25548:32252 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-02T17:17:27.790 info Netsdk:87378 25548:32252 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-02T17:17:27.790 info Netsdk:87378 25548:32252 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-02T17:17:27.790 info Netsdk:87378 25548:32252 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-02T17:17:27.790 info Netsdk:87378 25548:32252 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-02T17:18:23.561
[2025-09-02T17:18:23.561 info Netsdk:87378 39976:13208 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-02T17:18:23.563 info Netsdk:87378 39976:13208 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034650000
[2025-09-02T17:18:23.563 info Netsdk:87378 39976:13208 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-02T17:18:23.565 info Netsdk:87378 39976:13208 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002C5F0090, dwUser=0000000000000000].
[2025-09-02T17:18:23.565 info Netsdk:87378 39976:13208 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-02T17:18:23.565 info Netsdk:87378 39976:13208 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-02T17:18:23.565 info Netsdk:87378 39976:13208 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-02T17:18:23.565 info Netsdk:87378 39976:13208 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-02T17:18:23.565 info Netsdk:87378 39976:13208 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-02T17:21:34.081
[2025-09-02T17:21:34.081 info Netsdk:87378 40456:1940 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-02T17:21:34.086 info Netsdk:87378 40456:1940 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034610000
[2025-09-02T17:21:34.086 info Netsdk:87378 40456:1940 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-02T17:21:34.091 info Netsdk:87378 40456:1940 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000026E0090, dwUser=0000000000000000].
[2025-09-02T17:21:34.091 info Netsdk:87378 40456:1940 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-02T17:21:34.091 info Netsdk:87378 40456:1940 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-02T17:21:34.091 info Netsdk:87378 40456:1940 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-02T17:21:34.093 info Netsdk:87378 40456:1940 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-02T17:21:34.093 info Netsdk:87378 40456:1940 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-02T17:23:14.733
[2025-09-02T17:23:14.733 info Netsdk:87378 39508:31920 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-02T17:23:14.735 info Netsdk:87378 39508:31920 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000349E0000
[2025-09-02T17:23:14.735 info Netsdk:87378 39508:31920 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-02T17:23:14.737 info Netsdk:87378 39508:31920 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003170090, dwUser=0000000000000000].
[2025-09-02T17:23:14.737 info Netsdk:87378 39508:31920 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-02T17:23:14.737 info Netsdk:87378 39508:31920 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-02T17:23:14.737 info Netsdk:87378 39508:31920 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-02T17:23:14.738 info Netsdk:87378 39508:31920 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-02T17:23:14.738 info Netsdk:87378 39508:31920 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-02T17:23:31.465
[2025-09-02T17:23:31.465 info Netsdk:87378 33884:16544 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-02T17:23:31.470 info Netsdk:87378 33884:16544 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000035090000
[2025-09-02T17:23:31.470 info Netsdk:87378 33884:16544 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-02T17:23:31.475 info Netsdk:87378 33884:16544 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003B00090, dwUser=0000000000000000].
[2025-09-02T17:23:31.475 info Netsdk:87378 33884:16544 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-02T17:23:31.476 info Netsdk:87378 33884:16544 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-02T17:23:31.476 info Netsdk:87378 33884:16544 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-02T17:23:31.478 info Netsdk:87378 33884:16544 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-02T17:23:31.478 info Netsdk:87378 33884:16544 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 33
- 0
sdkLog/2025-09-03.log View File

@ -0,0 +1,33 @@
Begin Time:2025-09-03T11:44:33.840
[2025-09-03T11:44:33.840 info Netsdk:87378 34576:25056 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-03T11:44:33.842 info Netsdk:87378 34576:25056 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034560000
[2025-09-03T11:44:33.842 info Netsdk:87378 34576:25056 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-03T11:44:33.844 info Netsdk:87378 34576:25056 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002C610090, dwUser=0000000000000000].
[2025-09-03T11:44:33.844 info Netsdk:87378 34576:25056 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-03T11:44:33.844 info Netsdk:87378 34576:25056 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-03T11:44:33.844 info Netsdk:87378 34576:25056 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-03T11:44:33.845 info Netsdk:87378 34576:25056 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-03T11:44:33.845 info Netsdk:87378 34576:25056 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-03T14:03:15.572
[2025-09-03T14:03:15.572 info Netsdk:87378 43820:44620 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-03T14:03:15.574 info Netsdk:87378 43820:44620 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034160000
[2025-09-03T14:03:15.574 info Netsdk:87378 43820:44620 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-03T14:03:15.576 info Netsdk:87378 43820:44620 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000FB0090, dwUser=0000000000000000].
[2025-09-03T14:03:15.576 info Netsdk:87378 43820:44620 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-03T14:03:15.576 info Netsdk:87378 43820:44620 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-03T14:03:15.576 info Netsdk:87378 43820:44620 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-03T14:03:15.576 info Netsdk:87378 43820:44620 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-03T14:03:15.576 info Netsdk:87378 43820:44620 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2025-09-03T14:03:42.525
[2025-09-03T14:03:42.526 info Netsdk:87378 26544:37068 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-03T14:03:42.527 info Netsdk:87378 26544:37068 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000347F0000
[2025-09-03T14:03:42.527 info Netsdk:87378 26544:37068 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-03T14:03:42.530 info Netsdk:87378 26544:37068 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002C810090, dwUser=0000000000000000].
[2025-09-03T14:03:42.530 info Netsdk:87378 26544:37068 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-03T14:03:42.530 info Netsdk:87378 26544:37068 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-03T14:03:42.530 info Netsdk:87378 26544:37068 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-03T14:03:42.530 info Netsdk:87378 26544:37068 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-03T14:03:42.530 info Netsdk:87378 26544:37068 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 11
- 0
sdkLog/2025-09-16.log View File

@ -0,0 +1,11 @@
Begin Time:2025-09-16T11:20:35.041
[2025-09-16T11:20:35.041 info Netsdk:87378 18204:8668 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2025-09-16T11:20:35.042 info Netsdk:87378 18204:8668 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000034D90000
[2025-09-16T11:20:35.042 info Netsdk:87378 18204:8668 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2025-09-16T11:20:35.046 info Netsdk:87378 18204:8668 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003010090, dwUser=0000000000000000].
[2025-09-16T11:20:35.046 info Netsdk:87378 18204:8668 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2025-09-16T11:20:35.046 info Netsdk:87378 18204:8668 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2025-09-16T11:20:35.046 info Netsdk:87378 18204:8668 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2025-09-16T11:20:35.047 info Netsdk:87378 18204:8668 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2025-09-16T11:20:35.047 info Netsdk:87378 18204:8668 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 263
- 0
sdkLog/2026-07-13.log View File

@ -0,0 +1,263 @@
Begin Time:2026-07-13T11:22:17.457
[2026-07-13T11:22:17.457 info Netsdk:87378 44220:41484 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T11:22:17.460 info Netsdk:87378 44220:41484 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D5D0000
[2026-07-13T11:22:17.460 info Netsdk:87378 44220:41484 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T11:22:17.463 info Netsdk:87378 44220:41484 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003360090, dwUser=0000000000000000].
[2026-07-13T11:22:17.463 info Netsdk:87378 44220:41484 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T11:22:17.463 info Netsdk:87378 44220:41484 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T11:22:17.463 info Netsdk:87378 44220:41484 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T11:22:17.464 info Netsdk:87378 44220:41484 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T11:22:17.464 info Netsdk:87378 44220:41484 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T11:27:02.817
[2026-07-13T11:27:02.817 info Netsdk:87378 41564:44848 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T11:27:02.818 info Netsdk:87378 41564:44848 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DEC0000
[2026-07-13T11:27:02.818 info Netsdk:87378 41564:44848 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T11:27:02.821 info Netsdk:87378 41564:44848 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000031E0090, dwUser=0000000000000000].
[2026-07-13T11:27:02.821 info Netsdk:87378 41564:44848 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T11:27:02.821 info Netsdk:87378 41564:44848 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T11:27:02.821 info Netsdk:87378 41564:44848 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T11:27:02.822 info Netsdk:87378 41564:44848 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T11:27:02.822 info Netsdk:87378 41564:44848 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T12:38:32.759
[2026-07-13T12:38:32.759 info Netsdk:87378 22792:19924 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T12:38:32.760 info Netsdk:87378 22792:19924 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D170000
[2026-07-13T12:38:32.760 info Netsdk:87378 22792:19924 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T12:38:32.762 info Netsdk:87378 22792:19924 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001380090, dwUser=0000000000000000].
[2026-07-13T12:38:32.762 info Netsdk:87378 22792:19924 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T12:38:32.762 info Netsdk:87378 22792:19924 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T12:38:32.762 info Netsdk:87378 22792:19924 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T12:38:32.762 info Netsdk:87378 22792:19924 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T12:38:32.762 info Netsdk:87378 22792:19924 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T13:08:51.152
[2026-07-13T13:08:51.152 info Netsdk:87378 11828:30456 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T13:08:51.154 info Netsdk:87378 11828:30456 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D9A0000
[2026-07-13T13:08:51.154 info Netsdk:87378 11828:30456 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T13:08:51.156 info Netsdk:87378 11828:30456 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001820090, dwUser=0000000000000000].
[2026-07-13T13:08:51.156 info Netsdk:87378 11828:30456 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T13:08:51.156 info Netsdk:87378 11828:30456 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T13:08:51.156 info Netsdk:87378 11828:30456 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T13:08:51.156 info Netsdk:87378 11828:30456 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T13:08:51.156 info Netsdk:87378 11828:30456 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T13:26:18.463
[2026-07-13T13:26:18.463 info Netsdk:87378 44672:25260 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T13:26:18.466 info Netsdk:87378 44672:25260 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D330000
[2026-07-13T13:26:18.466 info Netsdk:87378 44672:25260 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T13:26:18.467 info Netsdk:87378 44672:25260 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002AC0090, dwUser=0000000000000000].
[2026-07-13T13:26:18.467 info Netsdk:87378 44672:25260 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T13:26:18.467 info Netsdk:87378 44672:25260 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T13:26:18.467 info Netsdk:87378 44672:25260 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T13:26:18.468 info Netsdk:87378 44672:25260 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T13:26:18.468 info Netsdk:87378 44672:25260 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T13:33:12.672
[2026-07-13T13:33:12.672 info Netsdk:87378 44916:37252 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T13:33:12.674 info Netsdk:87378 44916:37252 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D900000
[2026-07-13T13:33:12.674 info Netsdk:87378 44916:37252 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T13:33:12.676 info Netsdk:87378 44916:37252 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003750090, dwUser=0000000000000000].
[2026-07-13T13:33:12.676 info Netsdk:87378 44916:37252 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T13:33:12.676 info Netsdk:87378 44916:37252 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T13:33:12.676 info Netsdk:87378 44916:37252 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T13:33:12.676 info Netsdk:87378 44916:37252 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T13:33:12.676 info Netsdk:87378 44916:37252 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T13:49:15.882
[2026-07-13T13:49:15.882 info Netsdk:87378 11516:2424 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T13:49:15.884 info Netsdk:87378 11516:2424 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E1D0000
[2026-07-13T13:49:15.884 info Netsdk:87378 11516:2424 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T13:49:15.886 info Netsdk:87378 11516:2424 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001A20090, dwUser=0000000000000000].
[2026-07-13T13:49:15.886 info Netsdk:87378 11516:2424 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T13:49:15.886 info Netsdk:87378 11516:2424 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T13:49:15.886 info Netsdk:87378 11516:2424 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T13:49:15.886 info Netsdk:87378 11516:2424 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T13:49:15.886 info Netsdk:87378 11516:2424 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
[2026-07-13T14:41:05.400 info Netsdk:87378 11516:1392 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:0000000035E0E160, pstOutParam:0000000035CCBCD0.
[2026-07-13T14:41:05.400 info Netsdk:87378 11516:1392 netsdk.cpp:1009]IP:192.168.1.100, port:8000, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:41:05.401 info Netsdk:87378 11516:1392 devprob.cpp:3567]login with localIP:
[2026-07-13T14:41:15.404 info Netsdk:87378 11516:1392 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:41:15.404 info Netsdk:87378 11516:1392 TPTCPClient.cpp:541]Connect Client Port : 52100
[2026-07-13T14:41:15.404 error Netsdk:87378 11516:1392 TPTCPClient.cpp:546]Connect host failed, ip:192.168.1.100
[2026-07-13T14:41:15.404 error Netsdk:87378 11516:1392 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:41:15.405 error Netsdk:87378 11516:1392 Manager.cpp:12446]device is NULL
[2026-07-13T14:41:15.405 error Netsdk:87378 11516:1392 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:41:15.405 error Netsdk:87378 11516:1392 netsdk.cpp:1053]Login failed, ip:192.168.1.100, port:8000, specCap:0!
[2026-07-13T14:41:15.405 info Netsdk:87378 11516:1392 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:41:15.410 info Netsdk:87378 11516:1392 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:41:15.410 info Netsdk:87378 11516:1392 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
[2026-07-13T14:42:04.156 info Netsdk:87378 11516:44288 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:00000000011F2090, pstOutParam:0000000035E2F190.
[2026-07-13T14:42:04.156 info Netsdk:87378 11516:44288 netsdk.cpp:1009]IP:192.168.1.100, port:8000, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:42:04.156 info Netsdk:87378 11516:44288 devprob.cpp:3567]login with localIP:
[2026-07-13T14:42:14.157 info Netsdk:87378 11516:44288 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:42:14.157 info Netsdk:87378 11516:44288 TPTCPClient.cpp:541]Connect Client Port : 50742
[2026-07-13T14:42:14.157 error Netsdk:87378 11516:44288 TPTCPClient.cpp:546]Connect host failed, ip:192.168.1.100
[2026-07-13T14:42:14.157 error Netsdk:87378 11516:44288 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:42:14.157 error Netsdk:87378 11516:44288 Manager.cpp:12446]device is NULL
[2026-07-13T14:42:14.157 error Netsdk:87378 11516:44288 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:42:14.157 error Netsdk:87378 11516:44288 netsdk.cpp:1053]Login failed, ip:192.168.1.100, port:8000, specCap:0!
[2026-07-13T14:42:14.157 info Netsdk:87378 11516:44288 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:42:14.158 info Netsdk:87378 11516:44288 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:42:14.158 info Netsdk:87378 11516:44288 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
[2026-07-13T14:43:18.618 info Netsdk:87378 11516:26924 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:0000000035DFE540, pstOutParam:00000000011A7400.
[2026-07-13T14:43:18.618 info Netsdk:87378 11516:26924 netsdk.cpp:1009]IP:192.168.1.134, port:8000, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:43:18.618 info Netsdk:87378 11516:26924 devprob.cpp:3567]login with localIP:
[2026-07-13T14:43:28.618 info Netsdk:87378 11516:26924 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:43:28.618 info Netsdk:87378 11516:26924 TPTCPClient.cpp:541]Connect Client Port : 64796
[2026-07-13T14:43:28.618 error Netsdk:87378 11516:26924 TPTCPClient.cpp:546]Connect host failed, ip:192.168.1.134
[2026-07-13T14:43:28.618 error Netsdk:87378 11516:26924 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:43:28.618 error Netsdk:87378 11516:26924 Manager.cpp:12446]device is NULL
[2026-07-13T14:43:28.618 error Netsdk:87378 11516:26924 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:43:28.618 error Netsdk:87378 11516:26924 netsdk.cpp:1053]Login failed, ip:192.168.1.134, port:8000, specCap:0!
[2026-07-13T14:43:28.618 info Netsdk:87378 11516:26924 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:43:28.618 info Netsdk:87378 11516:26924 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:43:28.618 info Netsdk:87378 11516:26924 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
[2026-07-13T14:44:26.703 info Netsdk:87378 11516:6404 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:000000000121E410, pstOutParam:00000000011A8F80.
[2026-07-13T14:44:26.703 info Netsdk:87378 11516:6404 netsdk.cpp:1009]IP:192.168.1.134, port:37777, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:44:26.703 info Netsdk:87378 11516:6404 devprob.cpp:3567]login with localIP:
[2026-07-13T14:44:26.715 info Netsdk:87378 11516:6404 TPTCPClient.cpp:540]Connect Client Ip : 192.168.1.86
[2026-07-13T14:44:26.715 info Netsdk:87378 11516:6404 TPTCPClient.cpp:541]Connect Client Port : 64786
[2026-07-13T14:44:26.917 info Netsdk:87378 11516:6404 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:0, login ID:0000000038677D40.
[2026-07-13T14:46:34.509 info Netsdk:87378 11516:10904 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:00000000011BA080, pstOutParam:00000000011BDCD0.
[2026-07-13T14:46:34.509 info Netsdk:87378 11516:10904 netsdk.cpp:1009]IP:192.168.1.100, port:8000, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:46:34.509 info Netsdk:87378 11516:10904 devprob.cpp:3567]login with localIP:
[2026-07-13T14:46:44.509 info Netsdk:87378 11516:10904 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:46:44.509 info Netsdk:87378 11516:10904 TPTCPClient.cpp:541]Connect Client Port : 65357
[2026-07-13T14:46:44.509 error Netsdk:87378 11516:10904 TPTCPClient.cpp:546]Connect host failed, ip:192.168.1.100
[2026-07-13T14:46:44.509 error Netsdk:87378 11516:10904 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:46:44.509 error Netsdk:87378 11516:10904 Manager.cpp:12446]device is NULL
[2026-07-13T14:46:44.509 error Netsdk:87378 11516:10904 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:46:44.509 error Netsdk:87378 11516:10904 netsdk.cpp:1053]Login failed, ip:192.168.1.100, port:8000, specCap:0!
[2026-07-13T14:46:44.509 info Netsdk:87378 11516:10904 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:46:44.509 info Netsdk:87378 11516:10904 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:46:44.509 info Netsdk:87378 11516:10904 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
[2026-07-13T14:47:06.589 info Netsdk:87378 11516:5880 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:000000000121EDF0, pstOutParam:0000000035DE8400.
[2026-07-13T14:47:06.589 info Netsdk:87378 11516:5880 netsdk.cpp:1009]IP:192.168.1.100, port:8000, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:47:06.589 info Netsdk:87378 11516:5880 devprob.cpp:3567]login with localIP:
[2026-07-13T14:47:16.591 info Netsdk:87378 11516:5880 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:47:16.591 info Netsdk:87378 11516:5880 TPTCPClient.cpp:541]Connect Client Port : 54518
[2026-07-13T14:47:16.591 error Netsdk:87378 11516:5880 TPTCPClient.cpp:546]Connect host failed, ip:192.168.1.100
[2026-07-13T14:47:16.591 error Netsdk:87378 11516:5880 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:47:16.591 error Netsdk:87378 11516:5880 Manager.cpp:12446]device is NULL
[2026-07-13T14:47:16.591 error Netsdk:87378 11516:5880 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:47:16.591 error Netsdk:87378 11516:5880 netsdk.cpp:1053]Login failed, ip:192.168.1.100, port:8000, specCap:0!
[2026-07-13T14:47:16.591 info Netsdk:87378 11516:5880 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:47:16.591 info Netsdk:87378 11516:5880 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:47:16.591 info Netsdk:87378 11516:5880 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
[2026-07-13T14:47:23.529 info Netsdk:87378 11516:47280 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:00000000011A9D80, pstOutParam:0000000035CCABC0.
[2026-07-13T14:47:23.529 info Netsdk:87378 11516:47280 netsdk.cpp:1009]IP:192.168.1.100, port:8000, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:47:23.529 info Netsdk:87378 11516:47280 devprob.cpp:3567]login with localIP:
[2026-07-13T14:47:33.530 info Netsdk:87378 11516:47280 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:47:33.530 info Netsdk:87378 11516:47280 TPTCPClient.cpp:541]Connect Client Port : 53498
[2026-07-13T14:47:33.530 error Netsdk:87378 11516:47280 TPTCPClient.cpp:546]Connect host failed, ip:192.168.1.100
[2026-07-13T14:47:33.530 error Netsdk:87378 11516:47280 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:47:33.530 error Netsdk:87378 11516:47280 Manager.cpp:12446]device is NULL
[2026-07-13T14:47:33.530 error Netsdk:87378 11516:47280 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:47:33.530 error Netsdk:87378 11516:47280 netsdk.cpp:1053]Login failed, ip:192.168.1.100, port:8000, specCap:0!
[2026-07-13T14:47:33.530 info Netsdk:87378 11516:47280 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:47:33.530 info Netsdk:87378 11516:47280 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:47:33.530 info Netsdk:87378 11516:47280 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
[2026-07-13T14:51:31.585 info Netsdk:87378 11516:18720 netsdk.cpp:993]Enter CLIENT_LoginWithHighLevelSecurity. pstInParam:00000000011A9A80, pstOutParam:00000000011A26C0.
[2026-07-13T14:51:31.585 info Netsdk:87378 11516:18720 netsdk.cpp:1009]IP:10.1.1.65, port:37777, SpeCap:0, CapParam:0000000000000000, TLSCap:0
[2026-07-13T14:51:31.585 info Netsdk:87378 11516:18720 devprob.cpp:3567]login with localIP:
[2026-07-13T14:51:41.585 info Netsdk:87378 11516:18720 TPTCPClient.cpp:540]Connect Client Ip : 0.0.0.0
[2026-07-13T14:51:41.585 info Netsdk:87378 11516:18720 TPTCPClient.cpp:541]Connect Client Port : 57026
[2026-07-13T14:51:41.585 error Netsdk:87378 11516:18720 TPTCPClient.cpp:546]Connect host failed, ip:10.1.1.65
[2026-07-13T14:51:41.585 error Netsdk:87378 11516:18720 devprob.cpp:3606]Login failed, Failed to create main connection
[2026-07-13T14:51:41.585 error Netsdk:87378 11516:18720 Manager.cpp:12446]device is NULL
[2026-07-13T14:51:41.585 error Netsdk:87378 11516:18720 Manager.cpp:12554]Login device failed, errorcode:9!
[2026-07-13T14:51:41.585 error Netsdk:87378 11516:18720 netsdk.cpp:1053]Login failed, ip:10.1.1.65, port:37777, specCap:0!
[2026-07-13T14:51:41.585 info Netsdk:87378 11516:18720 netsdk.cpp:1057]Leave CLIENT_LoginWithHighLevelSecurity. error:9, login ID:0000000000000000.
[2026-07-13T14:51:41.585 info Netsdk:87378 11516:18720 netsdk.cpp:8477]Enter CLIENT_GetLastError.
[2026-07-13T14:51:41.585 info Netsdk:87378 11516:18720 netsdk.cpp:8480]Leave CLIENT_GetLastError.[Error code=8000006b.]
Begin Time:2026-07-13T16:30:32.416
[2026-07-13T16:30:32.416 info Netsdk:87378 47912:42884 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T16:30:32.418 info Netsdk:87378 47912:42884 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D940000
[2026-07-13T16:30:32.418 info Netsdk:87378 47912:42884 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T16:30:32.420 info Netsdk:87378 47912:42884 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003800090, dwUser=0000000000000000].
[2026-07-13T16:30:32.420 info Netsdk:87378 47912:42884 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T16:30:32.420 info Netsdk:87378 47912:42884 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T16:30:32.420 info Netsdk:87378 47912:42884 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T16:30:32.421 info Netsdk:87378 47912:42884 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T16:30:32.421 info Netsdk:87378 47912:42884 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
[2026-07-13T16:43:46.861 error Netsdk:87378 11516:40792 TPTCPClient.cpp:748]Device is not online, ip:192.168.1.134
Begin Time:2026-07-13T16:43:55.762
[2026-07-13T16:43:55.762 info Netsdk:87378 28664:22296 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T16:43:55.763 info Netsdk:87378 28664:22296 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E000000
[2026-07-13T16:43:55.763 info Netsdk:87378 28664:22296 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T16:43:55.764 info Netsdk:87378 28664:22296 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001590090, dwUser=0000000000000000].
[2026-07-13T16:43:55.764 info Netsdk:87378 28664:22296 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T16:43:55.764 info Netsdk:87378 28664:22296 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T16:43:55.764 info Netsdk:87378 28664:22296 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T16:43:55.766 info Netsdk:87378 28664:22296 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T16:43:55.766 info Netsdk:87378 28664:22296 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T17:08:03.146
[2026-07-13T17:08:03.147 info Netsdk:87378 24216:41144 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T17:08:03.148 info Netsdk:87378 24216:41144 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D8D0000
[2026-07-13T17:08:03.148 info Netsdk:87378 24216:41144 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T17:08:03.151 info Netsdk:87378 24216:41144 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002E430090, dwUser=0000000000000000].
[2026-07-13T17:08:03.151 info Netsdk:87378 24216:41144 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T17:08:03.151 info Netsdk:87378 24216:41144 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T17:08:03.151 info Netsdk:87378 24216:41144 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T17:08:03.151 info Netsdk:87378 24216:41144 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T17:08:03.151 info Netsdk:87378 24216:41144 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T17:10:10.745
[2026-07-13T17:10:10.745 info Netsdk:87378 44456:34584 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T17:10:10.747 info Netsdk:87378 44456:34584 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E4C0000
[2026-07-13T17:10:10.747 info Netsdk:87378 44456:34584 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T17:10:10.750 info Netsdk:87378 44456:34584 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000019F0090, dwUser=0000000000000000].
[2026-07-13T17:10:10.750 info Netsdk:87378 44456:34584 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T17:10:10.750 info Netsdk:87378 44456:34584 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T17:10:10.750 info Netsdk:87378 44456:34584 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T17:10:10.751 info Netsdk:87378 44456:34584 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T17:10:10.751 info Netsdk:87378 44456:34584 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T18:26:59.739
[2026-07-13T18:26:59.739 info Netsdk:87378 21600:50248 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T18:26:59.743 info Netsdk:87378 21600:50248 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D9A0000
[2026-07-13T18:26:59.743 info Netsdk:87378 21600:50248 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T18:26:59.744 info Netsdk:87378 21600:50248 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003720090, dwUser=0000000000000000].
[2026-07-13T18:26:59.744 info Netsdk:87378 21600:50248 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T18:26:59.744 info Netsdk:87378 21600:50248 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T18:26:59.744 info Netsdk:87378 21600:50248 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T18:26:59.745 info Netsdk:87378 21600:50248 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T18:26:59.745 info Netsdk:87378 21600:50248 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T18:32:36.087
[2026-07-13T18:32:36.087 info Netsdk:87378 49416:27612 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T18:32:36.090 info Netsdk:87378 49416:27612 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D3D0000
[2026-07-13T18:32:36.090 info Netsdk:87378 49416:27612 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T18:32:36.093 info Netsdk:87378 49416:27612 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002B20090, dwUser=0000000000000000].
[2026-07-13T18:32:36.093 info Netsdk:87378 49416:27612 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T18:32:36.093 info Netsdk:87378 49416:27612 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T18:32:36.093 info Netsdk:87378 49416:27612 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T18:32:36.094 info Netsdk:87378 49416:27612 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T18:32:36.094 info Netsdk:87378 49416:27612 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T18:35:33.844
[2026-07-13T18:35:33.844 info Netsdk:87378 10000:29284 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T18:35:33.846 info Netsdk:87378 10000:29284 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D970000
[2026-07-13T18:35:33.846 info Netsdk:87378 10000:29284 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T18:35:33.848 info Netsdk:87378 10000:29284 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000345C0090, dwUser=0000000000000000].
[2026-07-13T18:35:33.848 info Netsdk:87378 10000:29284 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T18:35:33.848 info Netsdk:87378 10000:29284 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T18:35:33.848 info Netsdk:87378 10000:29284 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T18:35:33.849 info Netsdk:87378 10000:29284 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T18:35:33.849 info Netsdk:87378 10000:29284 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-13T18:39:24.365
[2026-07-13T18:39:24.365 info Netsdk:87378 1164:34620 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-13T18:39:24.368 info Netsdk:87378 1164:34620 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DBA0000
[2026-07-13T18:39:24.368 info Netsdk:87378 1164:34620 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-13T18:39:24.369 info Netsdk:87378 1164:34620 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001E50090, dwUser=0000000000000000].
[2026-07-13T18:39:24.369 info Netsdk:87378 1164:34620 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-13T18:39:24.370 info Netsdk:87378 1164:34620 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-13T18:39:24.370 info Netsdk:87378 1164:34620 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-13T18:39:24.370 info Netsdk:87378 1164:34620 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-13T18:39:24.370 info Netsdk:87378 1164:34620 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 385
- 0
sdkLog/2026-07-14.log View File

@ -0,0 +1,385 @@
Begin Time:2026-07-14T09:08:08.523
[2026-07-14T09:08:08.523 info Netsdk:87378 29832:9608 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T09:08:08.525 info Netsdk:87378 29832:9608 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DC00000
[2026-07-14T09:08:08.525 info Netsdk:87378 29832:9608 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T09:08:08.527 info Netsdk:87378 29832:9608 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002930090, dwUser=0000000000000000].
[2026-07-14T09:08:08.527 info Netsdk:87378 29832:9608 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T09:08:08.528 info Netsdk:87378 29832:9608 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T09:08:08.528 info Netsdk:87378 29832:9608 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T09:08:08.528 info Netsdk:87378 29832:9608 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T09:08:08.528 info Netsdk:87378 29832:9608 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T09:27:50.514
[2026-07-14T09:27:50.514 info Netsdk:87378 14216:51516 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T09:27:50.517 info Netsdk:87378 14216:51516 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D780000
[2026-07-14T09:27:50.517 info Netsdk:87378 14216:51516 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T09:27:50.521 info Netsdk:87378 14216:51516 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000015F0090, dwUser=0000000000000000].
[2026-07-14T09:27:50.521 info Netsdk:87378 14216:51516 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T09:27:50.521 info Netsdk:87378 14216:51516 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T09:27:50.521 info Netsdk:87378 14216:51516 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T09:27:50.522 info Netsdk:87378 14216:51516 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T09:27:50.522 info Netsdk:87378 14216:51516 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:20:35.206
[2026-07-14T10:20:35.207 info Netsdk:87378 53804:55048 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:20:35.211 info Netsdk:87378 53804:55048 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D4F0000
[2026-07-14T10:20:35.211 info Netsdk:87378 53804:55048 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:20:35.218 info Netsdk:87378 53804:55048 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002DFC0090, dwUser=0000000000000000].
[2026-07-14T10:20:35.218 info Netsdk:87378 53804:55048 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:20:35.218 info Netsdk:87378 53804:55048 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:20:35.218 info Netsdk:87378 53804:55048 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:20:35.219 info Netsdk:87378 53804:55048 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:20:35.219 info Netsdk:87378 53804:55048 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:26:10.297
[2026-07-14T10:26:10.297 info Netsdk:87378 54584:52420 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:26:10.299 info Netsdk:87378 54584:52420 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DA90000
[2026-07-14T10:26:10.299 info Netsdk:87378 54584:52420 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:26:10.304 info Netsdk:87378 54584:52420 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003880090, dwUser=0000000000000000].
[2026-07-14T10:26:10.304 info Netsdk:87378 54584:52420 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:26:10.304 info Netsdk:87378 54584:52420 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:26:10.304 info Netsdk:87378 54584:52420 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:26:10.304 info Netsdk:87378 54584:52420 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:26:10.304 info Netsdk:87378 54584:52420 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:34:22.986
[2026-07-14T10:34:22.986 info Netsdk:87378 55140:54260 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:34:22.989 info Netsdk:87378 55140:54260 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D120000
[2026-07-14T10:34:22.989 info Netsdk:87378 55140:54260 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:34:22.992 info Netsdk:87378 55140:54260 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000033DB0090, dwUser=0000000000000000].
[2026-07-14T10:34:22.992 info Netsdk:87378 55140:54260 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:34:22.992 info Netsdk:87378 55140:54260 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:34:22.992 info Netsdk:87378 55140:54260 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:34:22.993 info Netsdk:87378 55140:54260 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:34:22.993 info Netsdk:87378 55140:54260 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:41:50.268
[2026-07-14T10:41:50.268 info Netsdk:87378 51212:28840 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:41:50.271 info Netsdk:87378 51212:28840 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DA50000
[2026-07-14T10:41:50.271 info Netsdk:87378 51212:28840 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:41:50.275 info Netsdk:87378 51212:28840 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000019F0090, dwUser=0000000000000000].
[2026-07-14T10:41:50.275 info Netsdk:87378 51212:28840 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:41:50.275 info Netsdk:87378 51212:28840 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:41:50.275 info Netsdk:87378 51212:28840 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:41:50.276 info Netsdk:87378 51212:28840 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:41:50.276 info Netsdk:87378 51212:28840 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:46:07.969
[2026-07-14T10:46:07.969 info Netsdk:87378 35988:20748 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:46:07.971 info Netsdk:87378 35988:20748 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DDF0000
[2026-07-14T10:46:07.971 info Netsdk:87378 35988:20748 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:46:07.973 info Netsdk:87378 35988:20748 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000016F0090, dwUser=0000000000000000].
[2026-07-14T10:46:07.973 info Netsdk:87378 35988:20748 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:46:07.973 info Netsdk:87378 35988:20748 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:46:07.973 info Netsdk:87378 35988:20748 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:46:07.973 info Netsdk:87378 35988:20748 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:46:07.973 info Netsdk:87378 35988:20748 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:48:08.996
[2026-07-14T10:48:08.996 info Netsdk:87378 42872:38752 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:48:08.998 info Netsdk:87378 42872:38752 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E0E0000
[2026-07-14T10:48:08.998 info Netsdk:87378 42872:38752 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:48:09.001 info Netsdk:87378 42872:38752 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003760090, dwUser=0000000000000000].
[2026-07-14T10:48:09.001 info Netsdk:87378 42872:38752 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:48:09.001 info Netsdk:87378 42872:38752 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:48:09.001 info Netsdk:87378 42872:38752 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:48:09.002 info Netsdk:87378 42872:38752 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:48:09.002 info Netsdk:87378 42872:38752 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T10:59:57.508
[2026-07-14T10:59:57.508 info Netsdk:87378 39536:52744 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T10:59:57.510 info Netsdk:87378 39536:52744 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D860000
[2026-07-14T10:59:57.510 info Netsdk:87378 39536:52744 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T10:59:57.513 info Netsdk:87378 39536:52744 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002E330090, dwUser=0000000000000000].
[2026-07-14T10:59:57.513 info Netsdk:87378 39536:52744 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T10:59:57.513 info Netsdk:87378 39536:52744 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T10:59:57.513 info Netsdk:87378 39536:52744 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T10:59:57.513 info Netsdk:87378 39536:52744 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T10:59:57.513 info Netsdk:87378 39536:52744 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T11:06:24.721
[2026-07-14T11:06:24.721 info Netsdk:87378 53484:19620 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T11:06:24.723 info Netsdk:87378 53484:19620 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D260000
[2026-07-14T11:06:24.723 info Netsdk:87378 53484:19620 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T11:06:24.725 info Netsdk:87378 53484:19620 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000033F10090, dwUser=0000000000000000].
[2026-07-14T11:06:24.725 info Netsdk:87378 53484:19620 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T11:06:24.725 info Netsdk:87378 53484:19620 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T11:06:24.725 info Netsdk:87378 53484:19620 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T11:06:24.726 info Netsdk:87378 53484:19620 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T11:06:24.726 info Netsdk:87378 53484:19620 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T11:16:41.064
[2026-07-14T11:16:41.064 info Netsdk:87378 5044:43880 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T11:16:41.068 info Netsdk:87378 5044:43880 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D0C0000
[2026-07-14T11:16:41.068 info Netsdk:87378 5044:43880 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T11:16:41.071 info Netsdk:87378 5044:43880 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000033DE0090, dwUser=0000000000000000].
[2026-07-14T11:16:41.071 info Netsdk:87378 5044:43880 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T11:16:41.072 info Netsdk:87378 5044:43880 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T11:16:41.072 info Netsdk:87378 5044:43880 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T11:16:41.072 info Netsdk:87378 5044:43880 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T11:16:41.073 info Netsdk:87378 5044:43880 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T11:18:41.840
[2026-07-14T11:18:41.841 info Netsdk:87378 33992:53836 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T11:18:41.844 info Netsdk:87378 33992:53836 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E010000
[2026-07-14T11:18:41.844 info Netsdk:87378 33992:53836 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T11:18:41.846 info Netsdk:87378 33992:53836 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003620090, dwUser=0000000000000000].
[2026-07-14T11:18:41.846 info Netsdk:87378 33992:53836 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T11:18:41.847 info Netsdk:87378 33992:53836 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T11:18:41.847 info Netsdk:87378 33992:53836 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T11:18:41.847 info Netsdk:87378 33992:53836 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T11:18:41.847 info Netsdk:87378 33992:53836 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T11:31:00.043
[2026-07-14T11:31:00.043 info Netsdk:87378 17496:54444 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T11:31:00.045 info Netsdk:87378 17496:54444 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E390000
[2026-07-14T11:31:00.045 info Netsdk:87378 17496:54444 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T11:31:00.048 info Netsdk:87378 17496:54444 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000036000090, dwUser=0000000000000000].
[2026-07-14T11:31:00.048 info Netsdk:87378 17496:54444 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T11:31:00.048 info Netsdk:87378 17496:54444 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T11:31:00.048 info Netsdk:87378 17496:54444 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T11:31:00.048 info Netsdk:87378 17496:54444 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T11:31:00.048 info Netsdk:87378 17496:54444 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T11:42:44.640
[2026-07-14T11:42:44.640 info Netsdk:87378 42672:40076 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T11:42:44.643 info Netsdk:87378 42672:40076 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D8E0000
[2026-07-14T11:42:44.643 info Netsdk:87378 42672:40076 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T11:42:44.647 info Netsdk:87378 42672:40076 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000354B0090, dwUser=0000000000000000].
[2026-07-14T11:42:44.647 info Netsdk:87378 42672:40076 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T11:42:44.647 info Netsdk:87378 42672:40076 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T11:42:44.647 info Netsdk:87378 42672:40076 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T11:42:44.648 info Netsdk:87378 42672:40076 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T11:42:44.648 info Netsdk:87378 42672:40076 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T11:57:24.590
[2026-07-14T11:57:24.590 info Netsdk:87378 51756:40748 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T11:57:24.591 info Netsdk:87378 51756:40748 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D1F0000
[2026-07-14T11:57:24.591 info Netsdk:87378 51756:40748 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T11:57:24.594 info Netsdk:87378 51756:40748 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000014F0090, dwUser=0000000000000000].
[2026-07-14T11:57:24.594 info Netsdk:87378 51756:40748 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T11:57:24.594 info Netsdk:87378 51756:40748 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T11:57:24.594 info Netsdk:87378 51756:40748 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T11:57:24.595 info Netsdk:87378 51756:40748 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T11:57:24.595 info Netsdk:87378 51756:40748 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T13:36:32.412
[2026-07-14T13:36:32.412 info Netsdk:87378 54420:20032 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T13:36:32.414 info Netsdk:87378 54420:20032 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D820000
[2026-07-14T13:36:32.414 info Netsdk:87378 54420:20032 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T13:36:32.416 info Netsdk:87378 54420:20032 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000E50090, dwUser=0000000000000000].
[2026-07-14T13:36:32.416 info Netsdk:87378 54420:20032 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T13:36:32.416 info Netsdk:87378 54420:20032 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T13:36:32.416 info Netsdk:87378 54420:20032 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T13:36:32.417 info Netsdk:87378 54420:20032 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T13:36:32.417 info Netsdk:87378 54420:20032 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T14:33:32.325
[2026-07-14T14:33:32.325 info Netsdk:87378 47304:41688 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T14:33:32.329 info Netsdk:87378 47304:41688 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D6E0000
[2026-07-14T14:33:32.330 info Netsdk:87378 47304:41688 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T14:33:32.334 info Netsdk:87378 47304:41688 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002F80090, dwUser=0000000000000000].
[2026-07-14T14:33:32.334 info Netsdk:87378 47304:41688 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T14:33:32.334 info Netsdk:87378 47304:41688 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T14:33:32.334 info Netsdk:87378 47304:41688 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T14:33:32.336 info Netsdk:87378 47304:41688 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T14:33:32.336 info Netsdk:87378 47304:41688 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T15:02:35.635
[2026-07-14T15:02:35.635 info Netsdk:87378 32236:54212 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T15:02:35.639 info Netsdk:87378 32236:54212 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003CD20000
[2026-07-14T15:02:35.639 info Netsdk:87378 32236:54212 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T15:02:35.642 info Netsdk:87378 32236:54212 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000339C0090, dwUser=0000000000000000].
[2026-07-14T15:02:35.642 info Netsdk:87378 32236:54212 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T15:02:35.642 info Netsdk:87378 32236:54212 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T15:02:35.642 info Netsdk:87378 32236:54212 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T15:02:35.643 info Netsdk:87378 32236:54212 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T15:02:35.643 info Netsdk:87378 32236:54212 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T15:05:03.387
[2026-07-14T15:05:03.387 info Netsdk:87378 10524:19664 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T15:05:03.389 info Netsdk:87378 10524:19664 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D9D0000
[2026-07-14T15:05:03.389 info Netsdk:87378 10524:19664 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T15:05:03.391 info Netsdk:87378 10524:19664 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000035590090, dwUser=0000000000000000].
[2026-07-14T15:05:03.391 info Netsdk:87378 10524:19664 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T15:05:03.391 info Netsdk:87378 10524:19664 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T15:05:03.391 info Netsdk:87378 10524:19664 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T15:05:03.392 info Netsdk:87378 10524:19664 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T15:05:03.392 info Netsdk:87378 10524:19664 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T15:07:13.957
[2026-07-14T15:07:13.957 info Netsdk:87378 45460:6060 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T15:07:13.958 info Netsdk:87378 45460:6060 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D940000
[2026-07-14T15:07:13.958 info Netsdk:87378 45460:6060 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T15:07:13.961 info Netsdk:87378 45460:6060 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003100090, dwUser=0000000000000000].
[2026-07-14T15:07:13.961 info Netsdk:87378 45460:6060 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T15:07:13.961 info Netsdk:87378 45460:6060 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T15:07:13.961 info Netsdk:87378 45460:6060 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T15:07:13.962 info Netsdk:87378 45460:6060 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T15:07:13.962 info Netsdk:87378 45460:6060 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T15:09:52.973
[2026-07-14T15:09:52.973 info Netsdk:87378 26556:12776 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T15:09:52.974 info Netsdk:87378 26556:12776 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D450000
[2026-07-14T15:09:52.975 info Netsdk:87378 26556:12776 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T15:09:52.979 info Netsdk:87378 26556:12776 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000034060090, dwUser=0000000000000000].
[2026-07-14T15:09:52.979 info Netsdk:87378 26556:12776 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T15:09:52.979 info Netsdk:87378 26556:12776 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T15:09:52.979 info Netsdk:87378 26556:12776 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T15:09:52.980 info Netsdk:87378 26556:12776 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T15:09:52.980 info Netsdk:87378 26556:12776 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T15:17:53.549
[2026-07-14T15:17:53.549 info Netsdk:87378 44736:52508 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T15:17:53.552 info Netsdk:87378 44736:52508 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D710000
[2026-07-14T15:17:53.552 info Netsdk:87378 44736:52508 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T15:17:53.554 info Netsdk:87378 44736:52508 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000F60090, dwUser=0000000000000000].
[2026-07-14T15:17:53.554 info Netsdk:87378 44736:52508 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T15:17:53.554 info Netsdk:87378 44736:52508 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T15:17:53.554 info Netsdk:87378 44736:52508 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T15:17:53.555 info Netsdk:87378 44736:52508 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T15:17:53.555 info Netsdk:87378 44736:52508 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T15:22:22.830
[2026-07-14T15:22:22.830 info Netsdk:87378 42308:51564 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T15:22:22.833 info Netsdk:87378 42308:51564 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003CF30000
[2026-07-14T15:22:22.833 info Netsdk:87378 42308:51564 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T15:22:22.837 info Netsdk:87378 42308:51564 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000E30090, dwUser=0000000000000000].
[2026-07-14T15:22:22.837 info Netsdk:87378 42308:51564 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T15:22:22.837 info Netsdk:87378 42308:51564 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T15:22:22.837 info Netsdk:87378 42308:51564 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T15:22:22.838 info Netsdk:87378 42308:51564 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T15:22:22.838 info Netsdk:87378 42308:51564 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T16:42:30.262
[2026-07-14T16:42:30.262 info Netsdk:87378 44192:8984 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T16:42:30.264 info Netsdk:87378 44192:8984 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DC30000
[2026-07-14T16:42:30.264 info Netsdk:87378 44192:8984 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T16:42:30.267 info Netsdk:87378 44192:8984 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003460090, dwUser=0000000000000000].
[2026-07-14T16:42:30.267 info Netsdk:87378 44192:8984 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T16:42:30.267 info Netsdk:87378 44192:8984 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T16:42:30.267 info Netsdk:87378 44192:8984 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T16:42:30.267 info Netsdk:87378 44192:8984 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T16:42:30.267 info Netsdk:87378 44192:8984 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T16:48:52.054
[2026-07-14T16:48:52.054 info Netsdk:87378 42008:43000 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T16:48:52.058 info Netsdk:87378 42008:43000 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D700000
[2026-07-14T16:48:52.058 info Netsdk:87378 42008:43000 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T16:48:52.061 info Netsdk:87378 42008:43000 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002EE0090, dwUser=0000000000000000].
[2026-07-14T16:48:52.061 info Netsdk:87378 42008:43000 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T16:48:52.061 info Netsdk:87378 42008:43000 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T16:48:52.062 info Netsdk:87378 42008:43000 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T16:48:52.063 info Netsdk:87378 42008:43000 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T16:48:52.063 info Netsdk:87378 42008:43000 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T16:50:25.849
[2026-07-14T16:50:25.849 info Netsdk:87378 34776:42964 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T16:50:25.852 info Netsdk:87378 34776:42964 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DAF0000
[2026-07-14T16:50:25.852 info Netsdk:87378 34776:42964 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T16:50:25.855 info Netsdk:87378 34776:42964 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001DE0090, dwUser=0000000000000000].
[2026-07-14T16:50:25.855 info Netsdk:87378 34776:42964 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T16:50:25.856 info Netsdk:87378 34776:42964 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T16:50:25.856 info Netsdk:87378 34776:42964 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T16:50:25.857 info Netsdk:87378 34776:42964 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T16:50:25.857 info Netsdk:87378 34776:42964 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T16:57:11.087
[2026-07-14T16:57:11.087 info Netsdk:87378 34088:42800 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T16:57:11.089 info Netsdk:87378 34088:42800 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043380000
[2026-07-14T16:57:11.089 info Netsdk:87378 34088:42800 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T16:57:11.090 info Netsdk:87378 34088:42800 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000031500090, dwUser=0000000000000000].
[2026-07-14T16:57:11.090 info Netsdk:87378 34088:42800 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T16:57:11.091 info Netsdk:87378 34088:42800 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T16:57:11.091 info Netsdk:87378 34088:42800 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T16:57:11.091 info Netsdk:87378 34088:42800 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T16:57:11.092 info Netsdk:87378 34088:42800 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T17:29:24.576
[2026-07-14T17:29:24.576 info Netsdk:87378 15652:49292 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T17:29:24.580 info Netsdk:87378 15652:49292 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043C40000
[2026-07-14T17:29:24.580 info Netsdk:87378 15652:49292 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T17:29:24.582 info Netsdk:87378 15652:49292 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001850090, dwUser=0000000000000000].
[2026-07-14T17:29:24.582 info Netsdk:87378 15652:49292 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T17:29:24.582 info Netsdk:87378 15652:49292 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T17:29:24.582 info Netsdk:87378 15652:49292 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T17:29:24.583 info Netsdk:87378 15652:49292 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T17:29:24.583 info Netsdk:87378 15652:49292 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T17:44:17.389
[2026-07-14T17:44:17.389 info Netsdk:87378 32756:31420 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T17:44:17.391 info Netsdk:87378 32756:31420 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042940000
[2026-07-14T17:44:17.391 info Netsdk:87378 32756:31420 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T17:44:17.394 info Netsdk:87378 32756:31420 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000015C0090, dwUser=0000000000000000].
[2026-07-14T17:44:17.394 info Netsdk:87378 32756:31420 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T17:44:17.394 info Netsdk:87378 32756:31420 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T17:44:17.394 info Netsdk:87378 32756:31420 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T17:44:17.395 info Netsdk:87378 32756:31420 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T17:44:17.395 info Netsdk:87378 32756:31420 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T17:54:58.373
[2026-07-14T17:54:58.373 info Netsdk:87378 11028:28412 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T17:54:58.375 info Netsdk:87378 11028:28412 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000427D0000
[2026-07-14T17:54:58.375 info Netsdk:87378 11028:28412 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T17:54:58.378 info Netsdk:87378 11028:28412 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000030F50090, dwUser=0000000000000000].
[2026-07-14T17:54:58.378 info Netsdk:87378 11028:28412 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T17:54:58.378 info Netsdk:87378 11028:28412 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T17:54:58.378 info Netsdk:87378 11028:28412 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T17:54:58.378 info Netsdk:87378 11028:28412 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T17:54:58.378 info Netsdk:87378 11028:28412 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T17:57:45.243
[2026-07-14T17:57:45.243 info Netsdk:87378 40920:43756 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T17:57:45.245 info Netsdk:87378 40920:43756 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000436B0000
[2026-07-14T17:57:45.245 info Netsdk:87378 40920:43756 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T17:57:45.248 info Netsdk:87378 40920:43756 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000EA0090, dwUser=0000000000000000].
[2026-07-14T17:57:45.248 info Netsdk:87378 40920:43756 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T17:57:45.248 info Netsdk:87378 40920:43756 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T17:57:45.248 info Netsdk:87378 40920:43756 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T17:57:45.249 info Netsdk:87378 40920:43756 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T17:57:45.249 info Netsdk:87378 40920:43756 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T18:04:57.095
[2026-07-14T18:04:57.095 info Netsdk:87378 47140:17496 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T18:04:57.098 info Netsdk:87378 47140:17496 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000442F0000
[2026-07-14T18:04:57.098 info Netsdk:87378 47140:17496 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T18:04:57.100 info Netsdk:87378 47140:17496 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000F80090, dwUser=0000000000000000].
[2026-07-14T18:04:57.100 info Netsdk:87378 47140:17496 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T18:04:57.100 info Netsdk:87378 47140:17496 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T18:04:57.100 info Netsdk:87378 47140:17496 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T18:04:57.101 info Netsdk:87378 47140:17496 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T18:04:57.101 info Netsdk:87378 47140:17496 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T18:06:14.089
[2026-07-14T18:06:14.089 info Netsdk:87378 11448:49828 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T18:06:14.090 info Netsdk:87378 11448:49828 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000436E0000
[2026-07-14T18:06:14.090 info Netsdk:87378 11448:49828 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T18:06:14.095 info Netsdk:87378 11448:49828 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000027D0090, dwUser=0000000000000000].
[2026-07-14T18:06:14.095 info Netsdk:87378 11448:49828 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T18:06:14.095 info Netsdk:87378 11448:49828 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T18:06:14.095 info Netsdk:87378 11448:49828 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T18:06:14.096 info Netsdk:87378 11448:49828 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T18:06:14.096 info Netsdk:87378 11448:49828 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T18:13:00.686
[2026-07-14T18:13:00.686 info Netsdk:87378 44492:33468 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T18:13:00.689 info Netsdk:87378 44492:33468 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042E60000
[2026-07-14T18:13:00.689 info Netsdk:87378 44492:33468 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T18:13:00.692 info Netsdk:87378 44492:33468 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000032F00090, dwUser=0000000000000000].
[2026-07-14T18:13:00.693 info Netsdk:87378 44492:33468 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T18:13:00.693 info Netsdk:87378 44492:33468 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T18:13:00.693 info Netsdk:87378 44492:33468 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T18:13:00.694 info Netsdk:87378 44492:33468 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T18:13:00.694 info Netsdk:87378 44492:33468 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-14T18:14:40.292
[2026-07-14T18:14:40.292 info Netsdk:87378 14612:53356 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-14T18:14:40.295 info Netsdk:87378 14612:53356 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042C90000
[2026-07-14T18:14:40.295 info Netsdk:87378 14612:53356 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-14T18:14:40.299 info Netsdk:87378 14612:53356 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003330090, dwUser=0000000000000000].
[2026-07-14T18:14:40.299 info Netsdk:87378 14612:53356 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-14T18:14:40.299 info Netsdk:87378 14612:53356 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-14T18:14:40.299 info Netsdk:87378 14612:53356 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-14T18:14:40.301 info Netsdk:87378 14612:53356 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-14T18:14:40.301 info Netsdk:87378 14612:53356 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 275
- 0
sdkLog/2026-07-15.log View File

@ -0,0 +1,275 @@
Begin Time:2026-07-15T11:33:43.604
[2026-07-15T11:33:43.604 info Netsdk:87378 54040:51812 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T11:33:43.605 info Netsdk:87378 54040:51812 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042220000
[2026-07-15T11:33:43.605 info Netsdk:87378 54040:51812 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T11:33:43.607 info Netsdk:87378 54040:51812 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000031170090, dwUser=0000000000000000].
[2026-07-15T11:33:43.607 info Netsdk:87378 54040:51812 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T11:33:43.607 info Netsdk:87378 54040:51812 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T11:33:43.607 info Netsdk:87378 54040:51812 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T11:33:43.608 info Netsdk:87378 54040:51812 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T11:33:43.608 info Netsdk:87378 54040:51812 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T11:58:29.687
[2026-07-15T11:58:29.687 info Netsdk:87378 31208:8484 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T11:58:29.688 info Netsdk:87378 31208:8484 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043550000
[2026-07-15T11:58:29.688 info Netsdk:87378 31208:8484 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T11:58:29.691 info Netsdk:87378 31208:8484 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000031320090, dwUser=0000000000000000].
[2026-07-15T11:58:29.691 info Netsdk:87378 31208:8484 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T11:58:29.691 info Netsdk:87378 31208:8484 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T11:58:29.691 info Netsdk:87378 31208:8484 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T11:58:29.692 info Netsdk:87378 31208:8484 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T11:58:29.692 info Netsdk:87378 31208:8484 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T13:43:55.243
[2026-07-15T13:43:55.243 info Netsdk:87378 16736:42940 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T13:43:55.245 info Netsdk:87378 16736:42940 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042560000
[2026-07-15T13:43:55.245 info Netsdk:87378 16736:42940 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T13:43:55.249 info Netsdk:87378 16736:42940 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000032BD0090, dwUser=0000000000000000].
[2026-07-15T13:43:55.249 info Netsdk:87378 16736:42940 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T13:43:55.249 info Netsdk:87378 16736:42940 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T13:43:55.249 info Netsdk:87378 16736:42940 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T13:43:55.250 info Netsdk:87378 16736:42940 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T13:43:55.250 info Netsdk:87378 16736:42940 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T13:57:31.372
[2026-07-15T13:57:31.372 info Netsdk:87378 41428:36576 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T13:57:31.374 info Netsdk:87378 41428:36576 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042260000
[2026-07-15T13:57:31.374 info Netsdk:87378 41428:36576 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T13:57:31.376 info Netsdk:87378 41428:36576 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000030EA0090, dwUser=0000000000000000].
[2026-07-15T13:57:31.376 info Netsdk:87378 41428:36576 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T13:57:31.376 info Netsdk:87378 41428:36576 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T13:57:31.376 info Netsdk:87378 41428:36576 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T13:57:31.377 info Netsdk:87378 41428:36576 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T13:57:31.377 info Netsdk:87378 41428:36576 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T14:27:20.242
[2026-07-15T14:27:20.242 info Netsdk:87378 6764:25780 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T14:27:20.243 info Netsdk:87378 6764:25780 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000044360000
[2026-07-15T14:27:20.243 info Netsdk:87378 6764:25780 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T14:27:20.247 info Netsdk:87378 6764:25780 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000FD0090, dwUser=0000000000000000].
[2026-07-15T14:27:20.247 info Netsdk:87378 6764:25780 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T14:27:20.247 info Netsdk:87378 6764:25780 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T14:27:20.247 info Netsdk:87378 6764:25780 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T14:27:20.248 info Netsdk:87378 6764:25780 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T14:27:20.248 info Netsdk:87378 6764:25780 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T14:36:25.335
[2026-07-15T14:36:25.335 info Netsdk:87378 17728:52160 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T14:36:25.337 info Netsdk:87378 17728:52160 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043DE0000
[2026-07-15T14:36:25.337 info Netsdk:87378 17728:52160 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T14:36:25.339 info Netsdk:87378 17728:52160 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000034C20090, dwUser=0000000000000000].
[2026-07-15T14:36:25.339 info Netsdk:87378 17728:52160 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T14:36:25.339 info Netsdk:87378 17728:52160 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T14:36:25.339 info Netsdk:87378 17728:52160 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T14:36:25.340 info Netsdk:87378 17728:52160 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T14:36:25.340 info Netsdk:87378 17728:52160 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T14:42:57.141
[2026-07-15T14:42:57.141 info Netsdk:87378 29988:46068 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T14:42:57.143 info Netsdk:87378 29988:46068 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043BB0000
[2026-07-15T14:42:57.143 info Netsdk:87378 29988:46068 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T14:42:57.146 info Netsdk:87378 29988:46068 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001890090, dwUser=0000000000000000].
[2026-07-15T14:42:57.146 info Netsdk:87378 29988:46068 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T14:42:57.146 info Netsdk:87378 29988:46068 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T14:42:57.146 info Netsdk:87378 29988:46068 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T14:42:57.147 info Netsdk:87378 29988:46068 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T14:42:57.147 info Netsdk:87378 29988:46068 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T14:51:11.223
[2026-07-15T14:51:11.223 info Netsdk:87378 2860:50360 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T14:51:11.227 info Netsdk:87378 2860:50360 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043780000
[2026-07-15T14:51:11.227 info Netsdk:87378 2860:50360 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T14:51:11.232 info Netsdk:87378 2860:50360 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000030D50090, dwUser=0000000000000000].
[2026-07-15T14:51:11.232 info Netsdk:87378 2860:50360 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T14:51:11.232 info Netsdk:87378 2860:50360 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T14:51:11.232 info Netsdk:87378 2860:50360 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T14:51:11.233 info Netsdk:87378 2860:50360 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T14:51:11.233 info Netsdk:87378 2860:50360 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T14:58:16.056
[2026-07-15T14:58:16.056 info Netsdk:87378 11428:37688 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T14:58:16.058 info Netsdk:87378 11428:37688 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042EA0000
[2026-07-15T14:58:16.058 info Netsdk:87378 11428:37688 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T14:58:16.064 info Netsdk:87378 11428:37688 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000019E0090, dwUser=0000000000000000].
[2026-07-15T14:58:16.064 info Netsdk:87378 11428:37688 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T14:58:16.064 info Netsdk:87378 11428:37688 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T14:58:16.064 info Netsdk:87378 11428:37688 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T14:58:16.065 info Netsdk:87378 11428:37688 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T14:58:16.065 info Netsdk:87378 11428:37688 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T15:01:30.704
[2026-07-15T15:01:30.704 info Netsdk:87378 20040:42508 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T15:01:30.707 info Netsdk:87378 20040:42508 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042300000
[2026-07-15T15:01:30.707 info Netsdk:87378 20040:42508 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T15:01:30.709 info Netsdk:87378 20040:42508 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002C50090, dwUser=0000000000000000].
[2026-07-15T15:01:30.709 info Netsdk:87378 20040:42508 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T15:01:30.709 info Netsdk:87378 20040:42508 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T15:01:30.709 info Netsdk:87378 20040:42508 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T15:01:30.710 info Netsdk:87378 20040:42508 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T15:01:30.710 info Netsdk:87378 20040:42508 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T15:06:00.795
[2026-07-15T15:06:00.795 info Netsdk:87378 11656:50380 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T15:06:00.796 info Netsdk:87378 11656:50380 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000425B0000
[2026-07-15T15:06:00.797 info Netsdk:87378 11656:50380 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T15:06:00.800 info Netsdk:87378 11656:50380 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000035180090, dwUser=0000000000000000].
[2026-07-15T15:06:00.800 info Netsdk:87378 11656:50380 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T15:06:00.800 info Netsdk:87378 11656:50380 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T15:06:00.800 info Netsdk:87378 11656:50380 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T15:06:00.801 info Netsdk:87378 11656:50380 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T15:06:00.801 info Netsdk:87378 11656:50380 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T15:28:49.337
[2026-07-15T15:28:49.338 info Netsdk:87378 51444:55056 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T15:28:49.340 info Netsdk:87378 51444:55056 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DCF0000
[2026-07-15T15:28:49.341 info Netsdk:87378 51444:55056 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T15:28:49.344 info Netsdk:87378 51444:55056 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002580090, dwUser=0000000000000000].
[2026-07-15T15:28:49.344 info Netsdk:87378 51444:55056 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T15:28:49.344 info Netsdk:87378 51444:55056 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T15:28:49.344 info Netsdk:87378 51444:55056 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T15:28:49.344 info Netsdk:87378 51444:55056 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T15:28:49.345 info Netsdk:87378 51444:55056 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T16:16:35.941
[2026-07-15T16:16:35.941 info Netsdk:87378 23384:16088 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T16:16:35.943 info Netsdk:87378 23384:16088 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043780000
[2026-07-15T16:16:35.943 info Netsdk:87378 23384:16088 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T16:16:35.946 info Netsdk:87378 23384:16088 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000F50090, dwUser=0000000000000000].
[2026-07-15T16:16:35.946 info Netsdk:87378 23384:16088 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T16:16:35.946 info Netsdk:87378 23384:16088 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T16:16:35.946 info Netsdk:87378 23384:16088 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T16:16:35.947 info Netsdk:87378 23384:16088 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T16:16:35.947 info Netsdk:87378 23384:16088 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T16:17:07.291
[2026-07-15T16:17:07.291 info Netsdk:87378 55884:15408 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T16:17:07.294 info Netsdk:87378 55884:15408 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043B80000
[2026-07-15T16:17:07.294 info Netsdk:87378 55884:15408 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T16:17:07.298 info Netsdk:87378 55884:15408 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000331B0090, dwUser=0000000000000000].
[2026-07-15T16:17:07.298 info Netsdk:87378 55884:15408 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T16:17:07.298 info Netsdk:87378 55884:15408 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T16:17:07.298 info Netsdk:87378 55884:15408 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T16:17:07.298 info Netsdk:87378 55884:15408 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T16:17:07.298 info Netsdk:87378 55884:15408 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T16:37:35.227
[2026-07-15T16:37:35.228 info Netsdk:87378 41232:17592 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T16:37:35.229 info Netsdk:87378 41232:17592 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000045170000
[2026-07-15T16:37:35.229 info Netsdk:87378 41232:17592 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T16:37:35.231 info Netsdk:87378 41232:17592 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001970090, dwUser=0000000000000000].
[2026-07-15T16:37:35.231 info Netsdk:87378 41232:17592 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T16:37:35.231 info Netsdk:87378 41232:17592 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T16:37:35.231 info Netsdk:87378 41232:17592 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T16:37:35.232 info Netsdk:87378 41232:17592 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T16:37:35.232 info Netsdk:87378 41232:17592 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T17:32:37.183
[2026-07-15T17:32:37.183 info Netsdk:87378 55788:38500 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T17:32:37.185 info Netsdk:87378 55788:38500 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000046BC0000
[2026-07-15T17:32:37.185 info Netsdk:87378 55788:38500 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T17:32:37.187 info Netsdk:87378 55788:38500 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003530090, dwUser=0000000000000000].
[2026-07-15T17:32:37.187 info Netsdk:87378 55788:38500 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T17:32:37.187 info Netsdk:87378 55788:38500 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T17:32:37.188 info Netsdk:87378 55788:38500 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T17:32:37.188 info Netsdk:87378 55788:38500 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T17:32:37.188 info Netsdk:87378 55788:38500 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T17:50:35.489
[2026-07-15T17:50:35.489 info Netsdk:87378 19644:14788 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T17:50:35.491 info Netsdk:87378 19644:14788 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000430A0000
[2026-07-15T17:50:35.491 info Netsdk:87378 19644:14788 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T17:50:35.494 info Netsdk:87378 19644:14788 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003720090, dwUser=0000000000000000].
[2026-07-15T17:50:35.494 info Netsdk:87378 19644:14788 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T17:50:35.494 info Netsdk:87378 19644:14788 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T17:50:35.494 info Netsdk:87378 19644:14788 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T17:50:35.495 info Netsdk:87378 19644:14788 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T17:50:35.495 info Netsdk:87378 19644:14788 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T18:31:56.191
[2026-07-15T18:31:56.191 info Netsdk:87378 9592:54760 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T18:31:56.194 info Netsdk:87378 9592:54760 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043A70000
[2026-07-15T18:31:56.194 info Netsdk:87378 9592:54760 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T18:31:56.198 info Netsdk:87378 9592:54760 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000016A0090, dwUser=0000000000000000].
[2026-07-15T18:31:56.198 info Netsdk:87378 9592:54760 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T18:31:56.198 info Netsdk:87378 9592:54760 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T18:31:56.198 info Netsdk:87378 9592:54760 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T18:31:56.199 info Netsdk:87378 9592:54760 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T18:31:56.199 info Netsdk:87378 9592:54760 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T18:33:59.057
[2026-07-15T18:33:59.057 info Netsdk:87378 34048:36188 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T18:33:59.061 info Netsdk:87378 34048:36188 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000414B0000
[2026-07-15T18:33:59.061 info Netsdk:87378 34048:36188 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T18:33:59.064 info Netsdk:87378 34048:36188 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000032480090, dwUser=0000000000000000].
[2026-07-15T18:33:59.064 info Netsdk:87378 34048:36188 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T18:33:59.065 info Netsdk:87378 34048:36188 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T18:33:59.065 info Netsdk:87378 34048:36188 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T18:33:59.066 info Netsdk:87378 34048:36188 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T18:33:59.066 info Netsdk:87378 34048:36188 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T18:35:39.522
[2026-07-15T18:35:39.522 info Netsdk:87378 54292:15972 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T18:35:39.525 info Netsdk:87378 54292:15972 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000041770000
[2026-07-15T18:35:39.525 info Netsdk:87378 54292:15972 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T18:35:39.528 info Netsdk:87378 54292:15972 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000029E0090, dwUser=0000000000000000].
[2026-07-15T18:35:39.528 info Netsdk:87378 54292:15972 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T18:35:39.528 info Netsdk:87378 54292:15972 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T18:35:39.528 info Netsdk:87378 54292:15972 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T18:35:39.529 info Netsdk:87378 54292:15972 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T18:35:39.529 info Netsdk:87378 54292:15972 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T18:41:26.810
[2026-07-15T18:41:26.810 info Netsdk:87378 50372:20700 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T18:41:26.812 info Netsdk:87378 50372:20700 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000041BC0000
[2026-07-15T18:41:26.812 info Netsdk:87378 50372:20700 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T18:41:26.816 info Netsdk:87378 50372:20700 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000313A0090, dwUser=0000000000000000].
[2026-07-15T18:41:26.816 info Netsdk:87378 50372:20700 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T18:41:26.816 info Netsdk:87378 50372:20700 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T18:41:26.816 info Netsdk:87378 50372:20700 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T18:41:26.817 info Netsdk:87378 50372:20700 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T18:41:26.817 info Netsdk:87378 50372:20700 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T18:46:16.507
[2026-07-15T18:46:16.507 info Netsdk:87378 52488:41684 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T18:46:16.510 info Netsdk:87378 52488:41684 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043B30000
[2026-07-15T18:46:16.511 info Netsdk:87378 52488:41684 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T18:46:16.514 info Netsdk:87378 52488:41684 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002CB0090, dwUser=0000000000000000].
[2026-07-15T18:46:16.514 info Netsdk:87378 52488:41684 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T18:46:16.514 info Netsdk:87378 52488:41684 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T18:46:16.514 info Netsdk:87378 52488:41684 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T18:46:16.515 info Netsdk:87378 52488:41684 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T18:46:16.515 info Netsdk:87378 52488:41684 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T18:58:04.636
[2026-07-15T18:58:04.636 info Netsdk:87378 2604:30184 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T18:58:04.639 info Netsdk:87378 2604:30184 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042ED0000
[2026-07-15T18:58:04.639 info Netsdk:87378 2604:30184 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T18:58:04.643 info Netsdk:87378 2604:30184 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000031150090, dwUser=0000000000000000].
[2026-07-15T18:58:04.643 info Netsdk:87378 2604:30184 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T18:58:04.643 info Netsdk:87378 2604:30184 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T18:58:04.643 info Netsdk:87378 2604:30184 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T18:58:04.644 info Netsdk:87378 2604:30184 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T18:58:04.644 info Netsdk:87378 2604:30184 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T19:01:19.664
[2026-07-15T19:01:19.664 info Netsdk:87378 46356:55996 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T19:01:19.667 info Netsdk:87378 46356:55996 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000440D0000
[2026-07-15T19:01:19.667 info Netsdk:87378 46356:55996 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T19:01:19.671 info Netsdk:87378 46356:55996 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003900090, dwUser=0000000000000000].
[2026-07-15T19:01:19.671 info Netsdk:87378 46356:55996 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T19:01:19.671 info Netsdk:87378 46356:55996 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T19:01:19.671 info Netsdk:87378 46356:55996 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T19:01:19.673 info Netsdk:87378 46356:55996 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T19:01:19.673 info Netsdk:87378 46356:55996 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-15T19:04:49.474
[2026-07-15T19:04:49.474 info Netsdk:87378 10012:13148 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-15T19:04:49.476 info Netsdk:87378 10012:13148 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000423F0000
[2026-07-15T19:04:49.476 info Netsdk:87378 10012:13148 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-15T19:04:49.481 info Netsdk:87378 10012:13148 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000032BC0090, dwUser=0000000000000000].
[2026-07-15T19:04:49.481 info Netsdk:87378 10012:13148 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-15T19:04:49.481 info Netsdk:87378 10012:13148 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-15T19:04:49.481 info Netsdk:87378 10012:13148 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-15T19:04:49.482 info Netsdk:87378 10012:13148 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-15T19:04:49.482 info Netsdk:87378 10012:13148 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 143
- 0
sdkLog/2026-07-16.log View File

@ -0,0 +1,143 @@
Begin Time:2026-07-16T09:15:07.494
[2026-07-16T09:15:07.494 info Netsdk:87378 26040:21780 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T09:15:07.496 info Netsdk:87378 26040:21780 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D960000
[2026-07-16T09:15:07.496 info Netsdk:87378 26040:21780 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T09:15:07.498 info Netsdk:87378 26040:21780 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002B40090, dwUser=0000000000000000].
[2026-07-16T09:15:07.498 info Netsdk:87378 26040:21780 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T09:15:07.498 info Netsdk:87378 26040:21780 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T09:15:07.498 info Netsdk:87378 26040:21780 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T09:15:07.498 info Netsdk:87378 26040:21780 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T09:15:07.498 info Netsdk:87378 26040:21780 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T09:27:45.778
[2026-07-16T09:27:45.778 info Netsdk:87378 19024:30132 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T09:27:45.780 info Netsdk:87378 19024:30132 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DB70000
[2026-07-16T09:27:45.780 info Netsdk:87378 19024:30132 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T09:27:45.782 info Netsdk:87378 19024:30132 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003210090, dwUser=0000000000000000].
[2026-07-16T09:27:45.782 info Netsdk:87378 19024:30132 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T09:27:45.782 info Netsdk:87378 19024:30132 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T09:27:45.782 info Netsdk:87378 19024:30132 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T09:27:45.783 info Netsdk:87378 19024:30132 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T09:27:45.783 info Netsdk:87378 19024:30132 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T10:21:30.002
[2026-07-16T10:21:30.002 info Netsdk:87378 36120:30244 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T10:21:30.004 info Netsdk:87378 36120:30244 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000043000000
[2026-07-16T10:21:30.004 info Netsdk:87378 36120:30244 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T10:21:30.006 info Netsdk:87378 36120:30244 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003350090, dwUser=0000000000000000].
[2026-07-16T10:21:30.006 info Netsdk:87378 36120:30244 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T10:21:30.006 info Netsdk:87378 36120:30244 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T10:21:30.006 info Netsdk:87378 36120:30244 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T10:21:30.006 info Netsdk:87378 36120:30244 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T10:21:30.006 info Netsdk:87378 36120:30244 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T10:26:00.681
[2026-07-16T10:26:00.681 info Netsdk:87378 30332:12796 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T10:26:00.682 info Netsdk:87378 30332:12796 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000042E30000
[2026-07-16T10:26:00.682 info Netsdk:87378 30332:12796 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T10:26:00.685 info Netsdk:87378 30332:12796 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000018A0090, dwUser=0000000000000000].
[2026-07-16T10:26:00.685 info Netsdk:87378 30332:12796 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T10:26:00.685 info Netsdk:87378 30332:12796 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T10:26:00.685 info Netsdk:87378 30332:12796 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T10:26:00.686 info Netsdk:87378 30332:12796 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T10:26:00.686 info Netsdk:87378 30332:12796 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T10:28:31.231
[2026-07-16T10:28:31.231 info Netsdk:87378 11372:44312 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T10:28:31.232 info Netsdk:87378 11372:44312 AVNetSDKMgr.cpp:551]avnetsdk module handle: 0000000044800000
[2026-07-16T10:28:31.232 info Netsdk:87378 11372:44312 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T10:28:31.234 info Netsdk:87378 11372:44312 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001530090, dwUser=0000000000000000].
[2026-07-16T10:28:31.234 info Netsdk:87378 11372:44312 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T10:28:31.234 info Netsdk:87378 11372:44312 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T10:28:31.234 info Netsdk:87378 11372:44312 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T10:28:31.235 info Netsdk:87378 11372:44312 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T10:28:31.235 info Netsdk:87378 11372:44312 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T11:46:29.281
[2026-07-16T11:46:29.281 info Netsdk:87378 42712:15536 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T11:46:29.283 info Netsdk:87378 42712:15536 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DE80000
[2026-07-16T11:46:29.283 info Netsdk:87378 42712:15536 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T11:46:29.284 info Netsdk:87378 42712:15536 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002BD0090, dwUser=0000000000000000].
[2026-07-16T11:46:29.284 info Netsdk:87378 42712:15536 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T11:46:29.284 info Netsdk:87378 42712:15536 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T11:46:29.284 info Netsdk:87378 42712:15536 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T11:46:29.285 info Netsdk:87378 42712:15536 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T11:46:29.285 info Netsdk:87378 42712:15536 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T11:47:36.840
[2026-07-16T11:47:36.840 info Netsdk:87378 3712:11748 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T11:47:36.842 info Netsdk:87378 3712:11748 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003CCF0000
[2026-07-16T11:47:36.842 info Netsdk:87378 3712:11748 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T11:47:36.844 info Netsdk:87378 3712:11748 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=000000002D830090, dwUser=0000000000000000].
[2026-07-16T11:47:36.844 info Netsdk:87378 3712:11748 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T11:47:36.844 info Netsdk:87378 3712:11748 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T11:47:36.844 info Netsdk:87378 3712:11748 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T11:47:36.844 info Netsdk:87378 3712:11748 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T11:47:36.844 info Netsdk:87378 3712:11748 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T11:48:43.807
[2026-07-16T11:48:43.807 info Netsdk:87378 9080:42116 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T11:48:43.808 info Netsdk:87378 9080:42116 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D8E0000
[2026-07-16T11:48:43.808 info Netsdk:87378 9080:42116 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T11:48:43.811 info Netsdk:87378 9080:42116 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003650090, dwUser=0000000000000000].
[2026-07-16T11:48:43.811 info Netsdk:87378 9080:42116 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T11:48:43.811 info Netsdk:87378 9080:42116 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T11:48:43.811 info Netsdk:87378 9080:42116 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T11:48:43.811 info Netsdk:87378 9080:42116 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T11:48:43.811 info Netsdk:87378 9080:42116 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T11:50:21.648
[2026-07-16T11:50:21.648 info Netsdk:87378 22944:46096 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T11:50:21.650 info Netsdk:87378 22944:46096 AVNetSDKMgr.cpp:551]avnetsdk module handle: 00000000445D0000
[2026-07-16T11:50:21.650 info Netsdk:87378 22944:46096 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T11:50:21.652 info Netsdk:87378 22944:46096 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000030A80090, dwUser=0000000000000000].
[2026-07-16T11:50:21.652 info Netsdk:87378 22944:46096 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T11:50:21.652 info Netsdk:87378 22944:46096 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T11:50:21.652 info Netsdk:87378 22944:46096 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T11:50:21.653 info Netsdk:87378 22944:46096 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T11:50:21.653 info Netsdk:87378 22944:46096 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T13:45:13.672
[2026-07-16T13:45:13.672 info Netsdk:87378 44892:30208 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T13:45:13.673 info Netsdk:87378 44892:30208 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003D8C0000
[2026-07-16T13:45:13.673 info Netsdk:87378 44892:30208 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T13:45:13.675 info Netsdk:87378 44892:30208 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000000FF0090, dwUser=0000000000000000].
[2026-07-16T13:45:13.675 info Netsdk:87378 44892:30208 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T13:45:13.675 info Netsdk:87378 44892:30208 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T13:45:13.675 info Netsdk:87378 44892:30208 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T13:45:13.675 info Netsdk:87378 44892:30208 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T13:45:13.675 info Netsdk:87378 44892:30208 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T15:34:08.682
[2026-07-16T15:34:08.682 info Netsdk:87378 47556:49440 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T15:34:08.683 info Netsdk:87378 47556:49440 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DEC0000
[2026-07-16T15:34:08.683 info Netsdk:87378 47556:49440 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T15:34:08.686 info Netsdk:87378 47556:49440 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000035B10090, dwUser=0000000000000000].
[2026-07-16T15:34:08.686 info Netsdk:87378 47556:49440 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T15:34:08.686 info Netsdk:87378 47556:49440 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T15:34:08.686 info Netsdk:87378 47556:49440 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T15:34:08.686 info Netsdk:87378 47556:49440 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T15:34:08.686 info Netsdk:87378 47556:49440 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T16:04:16.810
[2026-07-16T16:04:16.810 info Netsdk:87378 50048:30748 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T16:04:16.814 info Netsdk:87378 50048:30748 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E5A0000
[2026-07-16T16:04:16.815 info Netsdk:87378 50048:30748 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T16:04:16.818 info Netsdk:87378 50048:30748 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000003A00090, dwUser=0000000000000000].
[2026-07-16T16:04:16.818 info Netsdk:87378 50048:30748 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T16:04:16.818 info Netsdk:87378 50048:30748 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T16:04:16.818 info Netsdk:87378 50048:30748 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T16:04:16.819 info Netsdk:87378 50048:30748 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T16:04:16.819 info Netsdk:87378 50048:30748 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-16T17:04:47.158
[2026-07-16T17:04:47.158 info Netsdk:87378 47900:39216 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-16T17:04:47.160 info Netsdk:87378 47900:39216 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E4F0000
[2026-07-16T17:04:47.160 info Netsdk:87378 47900:39216 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-16T17:04:47.162 info Netsdk:87378 47900:39216 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000036190090, dwUser=0000000000000000].
[2026-07-16T17:04:47.162 info Netsdk:87378 47900:39216 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-16T17:04:47.162 info Netsdk:87378 47900:39216 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-16T17:04:47.162 info Netsdk:87378 47900:39216 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-16T17:04:47.163 info Netsdk:87378 47900:39216 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-16T17:04:47.163 info Netsdk:87378 47900:39216 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 66
- 0
sdkLog/2026-07-17.log View File

@ -0,0 +1,66 @@
Begin Time:2026-07-17T09:16:43.790
[2026-07-17T09:16:43.790 info Netsdk:87378 35492:36132 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-17T09:16:43.791 info Netsdk:87378 35492:36132 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DE90000
[2026-07-17T09:16:43.791 info Netsdk:87378 35492:36132 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-17T09:16:43.793 info Netsdk:87378 35492:36132 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001500090, dwUser=0000000000000000].
[2026-07-17T09:16:43.794 info Netsdk:87378 35492:36132 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-17T09:16:43.794 info Netsdk:87378 35492:36132 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-17T09:16:43.794 info Netsdk:87378 35492:36132 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-17T09:16:43.794 info Netsdk:87378 35492:36132 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-17T09:16:43.794 info Netsdk:87378 35492:36132 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-17T10:27:15.280
[2026-07-17T10:27:15.280 info Netsdk:87378 39052:35572 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-17T10:27:15.281 info Netsdk:87378 39052:35572 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E400000
[2026-07-17T10:27:15.281 info Netsdk:87378 39052:35572 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-17T10:27:15.283 info Netsdk:87378 39052:35572 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000039B0090, dwUser=0000000000000000].
[2026-07-17T10:27:15.283 info Netsdk:87378 39052:35572 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-17T10:27:15.283 info Netsdk:87378 39052:35572 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-17T10:27:15.283 info Netsdk:87378 39052:35572 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-17T10:27:15.285 info Netsdk:87378 39052:35572 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-17T10:27:15.285 info Netsdk:87378 39052:35572 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-17T11:07:53.020
[2026-07-17T11:07:53.020 info Netsdk:87378 40860:19880 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-17T11:07:53.022 info Netsdk:87378 40860:19880 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E1C0000
[2026-07-17T11:07:53.022 info Netsdk:87378 40860:19880 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-17T11:07:53.023 info Netsdk:87378 40860:19880 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000035D80090, dwUser=0000000000000000].
[2026-07-17T11:07:53.023 info Netsdk:87378 40860:19880 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-17T11:07:53.024 info Netsdk:87378 40860:19880 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-17T11:07:53.024 info Netsdk:87378 40860:19880 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-17T11:07:53.024 info Netsdk:87378 40860:19880 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-17T11:07:53.024 info Netsdk:87378 40860:19880 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-17T11:38:35.631
[2026-07-17T11:38:35.631 info Netsdk:87378 24152:42184 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-17T11:38:35.632 info Netsdk:87378 24152:42184 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DE10000
[2026-07-17T11:38:35.632 info Netsdk:87378 24152:42184 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-17T11:38:35.635 info Netsdk:87378 24152:42184 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=00000000015D0090, dwUser=0000000000000000].
[2026-07-17T11:38:35.635 info Netsdk:87378 24152:42184 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-17T11:38:35.635 info Netsdk:87378 24152:42184 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-17T11:38:35.635 info Netsdk:87378 24152:42184 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-17T11:38:35.636 info Netsdk:87378 24152:42184 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-17T11:38:35.636 info Netsdk:87378 24152:42184 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-17T11:47:14.928
[2026-07-17T11:47:14.928 info Netsdk:87378 42124:41012 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-17T11:47:14.930 info Netsdk:87378 42124:41012 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DF60000
[2026-07-17T11:47:14.930 info Netsdk:87378 42124:41012 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-17T11:47:14.932 info Netsdk:87378 42124:41012 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000035C50090, dwUser=0000000000000000].
[2026-07-17T11:47:14.932 info Netsdk:87378 42124:41012 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-17T11:47:14.932 info Netsdk:87378 42124:41012 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-17T11:47:14.932 info Netsdk:87378 42124:41012 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-17T11:47:14.933 info Netsdk:87378 42124:41012 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-17T11:47:14.933 info Netsdk:87378 42124:41012 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-07-17T15:47:42.627
[2026-07-17T15:47:42.627 info Netsdk:87378 77660:19660 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-17T15:47:42.632 info Netsdk:87378 77660:19660 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E1C0000
[2026-07-17T15:47:42.632 info Netsdk:87378 77660:19660 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-17T15:47:42.639 info Netsdk:87378 77660:19660 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000002890090, dwUser=0000000000000000].
[2026-07-17T15:47:42.639 info Netsdk:87378 77660:19660 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-17T15:47:42.639 info Netsdk:87378 77660:19660 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-17T15:47:42.639 info Netsdk:87378 77660:19660 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-17T15:47:42.641 info Netsdk:87378 77660:19660 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-17T15:47:42.641 info Netsdk:87378 77660:19660 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 11
- 0
sdkLog/2026-07-21.log View File

@ -0,0 +1,11 @@
Begin Time:2026-07-21T15:55:24.438
[2026-07-21T15:55:24.438 info Netsdk:87378 54276:27440 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-07-21T15:55:24.440 info Netsdk:87378 54276:27440 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DF00000
[2026-07-21T15:55:24.440 info Netsdk:87378 54276:27440 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-07-21T15:55:24.442 info Netsdk:87378 54276:27440 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001480090, dwUser=0000000000000000].
[2026-07-21T15:55:24.442 info Netsdk:87378 54276:27440 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-07-21T15:55:24.442 info Netsdk:87378 54276:27440 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-07-21T15:55:24.442 info Netsdk:87378 54276:27440 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-07-21T15:55:24.443 info Netsdk:87378 54276:27440 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-07-21T15:55:24.443 info Netsdk:87378 54276:27440 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 22
- 0
sdkLog/2026-08-04.log View File

@ -0,0 +1,22 @@
Begin Time:2026-08-04T13:49:05.612
[2026-08-04T13:49:05.612 info Netsdk:87378 50660:65192 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-08-04T13:49:05.616 info Netsdk:87378 50660:65192 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003E6C0000
[2026-08-04T13:49:05.616 info Netsdk:87378 50660:65192 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-08-04T13:49:05.620 info Netsdk:87378 50660:65192 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000001DA0090, dwUser=0000000000000000].
[2026-08-04T13:49:05.620 info Netsdk:87378 50660:65192 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-08-04T13:49:05.620 info Netsdk:87378 50660:65192 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-08-04T13:49:05.620 info Netsdk:87378 50660:65192 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-08-04T13:49:05.621 info Netsdk:87378 50660:65192 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-08-04T13:49:05.621 info Netsdk:87378 50660:65192 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.
Begin Time:2026-08-04T14:25:28.914
[2026-08-04T14:25:28.914 info Netsdk:87378 14308:5660 AVNetSDKMgr.cpp:506]Load avnetsdk library dynamically
[2026-08-04T14:25:28.917 info Netsdk:87378 14308:5660 AVNetSDKMgr.cpp:551]avnetsdk module handle: 000000003DFD0000
[2026-08-04T14:25:28.917 info Netsdk:87378 14308:5660 AVNetSDKMgr.cpp:826]Load configsdk dynamically
[2026-08-04T14:25:28.920 info Netsdk:87378 14308:5660 netsdk.cpp:302]Enter CLIENT_SetAutoReconnect:[cbAutoConnect=0000000035C50090, dwUser=0000000000000000].
[2026-08-04T14:25:28.920 info Netsdk:87378 14308:5660 netsdk.cpp:304]Leave CLIENT_SetAutoReconnect.
[2026-08-04T14:25:28.920 info Netsdk:87378 14308:5660 netsdk.cpp:326]Enter CLIENT_SetConnectTime:[nWaitTime=5000, nTryTimes=1].
[2026-08-04T14:25:28.920 info Netsdk:87378 14308:5660 netsdk.cpp:339]Leave CLIENT_SetConnectTime.
[2026-08-04T14:25:28.921 info Netsdk:87378 14308:5660 netsdk.cpp:352]Enter CLIENT_SetNetworkParam:[nWaittime=0, nConnectTime=10000, nConnectTryNum=0, nSubConnectSpaceTime=0, nGetDevInfoTime=3000, nConnectBufSize=0, nGetConnInfoTime=3000, nSearchRecordTime=0, nsubDisconnetTime=0, byNetType=0, byPlaybackBufSize=0, bDetectDisconnTime=0, bKeepLifeInterval=0, nPicBufSize=0].
[2026-08-04T14:25:28.921 info Netsdk:87378 14308:5660 netsdk.cpp:367]Leave CLIENT_SetNetworkParam.

+ 20
- 4
sdkLog/SdkLog_1_W.log View File

@ -1,4 +1,20 @@
[2025-09-16 11:20:34.679][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/zlib1.dll], hHandleRet[1841233920]
[2025-09-16 11:20:34.679][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.
[2025-09-16 11:20:34.679][INF] The COM:Core ver is 6.1.9.47, 2022_11_11. Async:1.
[2025-09-16 11:20:34.679][INF] This HCNetSDK ver is 6.1.9.47 Ver 2022_11_11.
[2026-08-04 14:25:27.896][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/zlib1.dll], hHandleRet[1892941824]
[2026-08-04 14:25:27.896][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.
[2026-08-04 14:25:27.896][INF] The COM:Core ver is 6.1.9.47, 2022_11_11. Async:1.
[2026-08-04 14:25:27.896][INF] This HCNetSDK ver is 6.1.9.47 Ver 2022_11_11.
[2026-08-04 14:25:40.005][INF] Login dev 192.168.1.249:8000.
[2026-08-04 14:25:40.005][INF] dwTotalNum[2048]
[2026-08-04 14:25:40.026][INF] Private connect 192.168.1.249:8000 sock=5072 this=0x45304904 cmd=0x10000 port=50953
[2026-08-04 14:25:40.026][INF] LogonDev1 in[192.168.1.249:8000]
[2026-08-04 14:25:40.029][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/libcrypto-1_1-x64.dll], hHandleRet[1581252608]
[2026-08-04 14:25:40.029][DBG] Load [libcrypto-1_1-x64.dll] SUCC, Real Path[D:\workspace\inspect-nvr\lib\libcrypto-1_1-x64.dll]
[2026-08-04 14:25:40.031][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/workspace/inspect-nvr/lib/libssl-1_1-x64.dll], hHandleRet[-195690496]
[2026-08-04 14:25:40.031][DBG] Load [libssl-1_1-x64.dll] SUCC, Real Path[D:\workspace\inspect-nvr\lib\libssl-1_1-x64.dll]
[2026-08-04 14:25:40.031][INF] SSLTRANSAPI::IsAllAPILoaded, SSL_library_init Unload
[2026-08-04 14:25:40.031][INF] OpenSSL, Not All Function Loaded!
[2026-08-04 14:25:40.031][INF] SSLTRANSAPI::PrintVersion, OpenSSL version info [OpenSSL 1.1.1l 24 Aug 2021]
[2026-08-04 14:25:40.031][INF] CSSLTrans::SSLCtxInit, dwSSLVersion[6], m_fnTLSServerMethod
[2026-08-04 14:25:40.034][ERR] CSSLTrans::SSLTrans_CTX_Load_CA, invalid path[D:/workspace/inspect-nvr/lib/cert/\]
[2026-08-04 16:37:07.588][INF] COM_Logout[0][0]
[2026-08-04 16:37:07.593][DBG] CUserMgr::UnRegisterHeartProxy[0]
[2026-08-04 16:37:07.594][INF] Private connect 192.168.1.249:8000 sock=5076 this=0x45304904 cmd=0x10100 port=56011

+ 10
- 4
src/main/java/com/inspect/nvr/config/DahuaConfig.java View File

@ -36,6 +36,11 @@ public class DahuaConfig {
private static boolean bLogopen = false;
/**
* 初始化大华 NetSDK并将 SDK 日志写入应用工作目录下的 sdklog 目录
*
* @return 初始化成功的 NetSDK 实例初始化失败时返回 {@code null}
*/
@Bean
public NetSDKLib initDhSDK(){
// if (!instance()) {
@ -51,11 +56,12 @@ public class DahuaConfig {
//打开日志可选
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
File path = new File("sdklog/");
if (!path.exists()) {
path.mkdir();
File path = new File("sdklog");
if (!path.exists() && !path.mkdirs()) {
System.err.println("Failed to create NetSDK log directory: " + path.getAbsolutePath());
}
String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + DateUtils.getDate() + ".log";
// 使用 File 组合跨平台路径确保 Linux 容器中的日志写入 /app/sdklog 持久化卷
String logPath = new File(path, DateUtils.getDate() + ".log").getAbsolutePath();
setLog.nPrintStrategy = 0;
setLog.bSetFilePath = 1;
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);


+ 26
- 5
src/main/java/com/inspect/nvr/config/HikLibConfig.java View File

@ -18,16 +18,35 @@ import org.springframework.stereotype.Component;
@Component
public class HikLibConfig {
/** ClientDemo 使用的连接超时时间,避免失联设备长时间占用控制请求。 */
private static final int SDK_CONNECT_TIMEOUT_MILLIS = 5000;
/** 海康 Linux64 SDK 6.1.11.5 随包提供的 OpenSSL 加密库文件名。 */
private static final String LINUX_CRYPTO_LIBRARY_NAME = "libcrypto.so.3";
/** 海康 Linux64 SDK 6.1.11.5 随包提供的 OpenSSL 通信库文件名。 */
private static final String LINUX_SSL_LIBRARY_NAME = "libssl.so.3";
/** 接收海康 SDK 异常事件的全局回调,生命周期与 SDK 实例保持一致。 */
private static HikFExceptionCallBack_Imp fExceptionCallBack;
/** 接收异步登录结果的回调实例,避免回调对象被垃圾回收。 */
private static HikLoginResultCallBack fLoginCallBackImp;
// @Autowired
/** 当前进程加载的海康 SDK 接口实例。 */
private HCNetSDK hcNetSDK;
/**
* 加载并初始化海康 SDK配置 Linux64 组件库和 OpenSSL 3 路径
*
* @return 已初始化的海康 SDK 接口动态库加载失败时返回 {@code null}
*/
@Bean
public HCNetSDK initHkSDK() {
// 仅在尚未创建接口实例时加载原生库避免同一进程重复装载 SDK
if (hcNetSDK == null) {
// 原生库加载失败时无法继续执行设备操作交由 Spring 按空 Bean 结果处理
if (!createSDKInstance()) {
System.out.println("Load SDK fail");
return null;
@ -39,13 +58,14 @@ public class HikLibConfig {
// 设置发送缓冲区大小
hcNetSDK.NET_DVR_SetSDKInitCfg(4, new IntByReference(1024*1024).getPointer());
//linux系统建议调用以下接口加载组件库
// Linux64 SDK 需要显式指定随包 OpenSSL 3 和组件库根目录避免加载宿主镜像中的其他版本
if (osSelect.isLinux()) {
HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
//这里是库的绝对路径请根据实际情况修改注意改路径必须有访问权限
String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";
// 组装镜像内 OpenSSL 3 的绝对路径 HCNetSDK 初始化阶段直接加载
String strPath1 = System.getProperty("user.dir") + "/lib/" + LINUX_CRYPTO_LIBRARY_NAME;
String strPath2 = System.getProperty("user.dir") + "/lib/" + LINUX_SSL_LIBRARY_NAME;
System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
ptrByteArray1.write();
@ -55,6 +75,7 @@ public class HikLibConfig {
ptrByteArray2.write();
hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
// 指向包含 HCNetSDKCom 子目录的 SDK 根目录供各业务组件按需加载
String strPathCom = System.getProperty("user.dir") + "/lib/";
HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
@ -80,7 +101,7 @@ public class HikLibConfig {
//启动SDK写日志
hcNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);
//设置连接时间与重连时间
hcNetSDK.NET_DVR_SetConnectTime(200000,1);
hcNetSDK.NET_DVR_SetConnectTime(SDK_CONNECT_TIMEOUT_MILLIS, 1);
hcNetSDK.NET_DVR_SetReconnect(100000,true);
//连接所有nvr


+ 10
- 15
src/main/java/com/inspect/nvr/controller/CameraController.java View File

@ -2,6 +2,7 @@ package com.inspect.nvr.controller;
import com.inspect.nvr.domain.Infrared.Camera;
import com.inspect.nvr.domain.Infrared.TemperatureData;
import com.inspect.nvr.domain.common.AjaxResultResponse;
import com.inspect.nvr.enums.CameraEnum;
import com.inspect.nvr.hikVision.utils.AjaxResult;
import com.inspect.nvr.service.DahuaService;
@ -32,9 +33,8 @@ public class CameraController {
//获取相机预置位列表--海康相机
@PostMapping("/hw/cameraYzwHikVision")
@ResponseBody
public String cameraYzw(@RequestBody Camera camera) {
public String cameraYzw( @RequestBody Camera camera) {
return cameraService.cameraYzwHikVision(camera);
}
@ -42,12 +42,12 @@ public class CameraController {
@PostMapping("/hw/cameraHong")
@ResponseBody
@CrossOrigin
public TemperatureData cameraHong(@RequestBody Camera camera) throws InterruptedException {
public TemperatureData cameraHong( @RequestBody Camera camera) throws InterruptedException {
log.info("红外开始===================================》》》》》");
TemperatureData temperatureData = null;
if(CameraEnum.HIKVISION.getCode() == camera.getCameraType()){
temperatureData = executeWithTimeout(() -> cameraService.StartRemote(camera), 7, TimeUnit.SECONDS);
// temperatureData = cameraService.StartRemote(camera);
// temperatureData = cameraService.StartRemote(camera);
} else {
temperatureData = dahuaService.StartRemote(camera);
}
@ -57,20 +57,17 @@ public class CameraController {
return temperatureData;
}
//同步相机信息
// @PostMapping("/getChannelList")
// @ResponseBody
// public AjaxResult getChannlList(@RequestBody NvrInfo nvrInfo){
// return cameraService.getChannelList(nvrInfo);
// }
// @PostMapping("/getChannelList")
// @ResponseBody
// public AjaxResult getChannlList(@RequestBody NvrInfo nvrInfo){
// return cameraService.getChannelList(nvrInfo);
// }
@PostMapping("/hw/test")
@ResponseBody
@CrossOrigin
public AjaxResult cameraHong1(@RequestBody Camera camera) throws InterruptedException {
public AjaxResult cameraHong1( @RequestBody Camera camera) throws InterruptedException {
AjaxResult temperatureData = null;
// 海康威视使用异步+超时控制
log.info("测温结束=================================================");
@ -79,7 +76,6 @@ public class CameraController {
return temperatureData;
}
public AjaxResult cameraHong2() {
try {
Thread.sleep(10000);
@ -108,5 +104,4 @@ public class CameraController {
}
}
}

+ 5
- 9
src/main/java/com/inspect/nvr/controller/DahuaController.java View File

@ -1,6 +1,5 @@
package com.inspect.nvr.controller;
import com.inspect.nvr.domain.Infrared.Camera;
import com.inspect.nvr.domain.Infrared.NvrInfo;
import com.inspect.nvr.domain.Infrared.TemperatureData;
@ -20,37 +19,34 @@ public class DahuaController {
@Autowired
private DahuaService dahuaService;
@PostMapping("/login")
@CrossOrigin
@ResponseBody
public void login(@RequestBody NvrInfo nvrInfo) {
public void login( @RequestBody NvrInfo nvrInfo) {
dahuaService.login(nvrInfo);
}
@PostMapping("/StartRemote")
@CrossOrigin
@ResponseBody
public TemperatureData StartRemote(@RequestBody Camera camera) {
public TemperatureData StartRemote( @RequestBody Camera camera) {
return dahuaService.StartRemote(camera);
}
@PostMapping("/cameraControl")
@CrossOrigin
@ResponseBody
public String cameraControl(@RequestBody Camera camera) {
public String cameraControl( @RequestBody Camera camera) {
return dahuaService.cameraControl(camera, 0, 0, 0);
}
@PostMapping("/Picture")
@CrossOrigin
@ResponseBody
public ResponseEntity<InputStreamResource> Picture(@RequestBody Camera camera) {
public ResponseEntity<InputStreamResource> Picture( @RequestBody Camera camera) {
return ResponseEntity
.ok()
.body(new InputStreamResource(dahuaService.Picture(camera)));
// return dahuaService.Picture(camera);
// return dahuaService.Picture(camera);
}
}

+ 4
- 1
src/main/java/com/inspect/nvr/controller/FileController.java View File

@ -1,6 +1,7 @@
package com.inspect.nvr.controller;
import com.inspect.nvr.domain.file.FileReturn;
import com.inspect.nvr.domain.common.FileUploadRequest;
import com.inspect.nvr.service.FileService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@ -18,7 +19,9 @@ public class FileController {
}
@RequestMapping("/upload")
public FileReturn uploadFile(@RequestParam("filename") String filename, @RequestParam("uploadFile") MultipartFile multipartFile) {
public FileReturn uploadFile(
@RequestParam("filename") String filename,
@RequestParam("uploadFile") MultipartFile multipartFile) {
return fileService.uploadFile(filename, multipartFile);
}
}

+ 23
- 26
src/main/java/com/inspect/nvr/controller/InfraredController.java View File

@ -3,6 +3,7 @@ package com.inspect.nvr.controller;
import com.alibaba.fastjson.JSONObject;
import com.inspect.nvr.aop.TimeTrace;
import com.inspect.nvr.domain.Infrared.*;
import com.inspect.nvr.domain.common.AjaxResultResponse;
import com.inspect.nvr.service.HikVisionService;
import com.inspect.nvr.hikVision.utils.AjaxResult;
import org.slf4j.Logger;
@ -18,7 +19,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@CrossOrigin
public class InfraredController {
@ -36,7 +36,7 @@ public class InfraredController {
*/
@PostMapping("/login")
@ResponseBody
public AjaxResult login(@RequestBody NvrInfo nvrInfo) {
public AjaxResult login( @RequestBody NvrInfo nvrInfo) {
return hikVisionService.login(nvrInfo);
}
@ -48,44 +48,43 @@ public class InfraredController {
* userName 账号
*/
// @PostMapping("/cameraHongWaiHk")
// @ResponseBody
// public AjaxResult cameraHongWaiHk(@RequestBody Camera camera) {
// return hikVisionService.cameraHongWaiHk(camera);
// }
// @PostMapping("/cameraHongWaiHk")
// @ResponseBody
// public AjaxResult cameraHongWaiHk(@RequestBody Camera camera) {
// return hikVisionService.cameraHongWaiHk(camera);
// }
@TimeTrace
@PostMapping("/cameraHong")
@ResponseBody
public AjaxResult cameraHong(@RequestBody Camera camera) {
public AjaxResult cameraHong( @RequestBody Camera camera) {
TemperatureData temperatureData = hikVisionService.StartRemote(camera);
return AjaxResult.success().put("data", temperatureData);
}
@PostMapping("/cameraAngleJump")
@ResponseBody
public AjaxResult cameraAngleJump(@RequestBody Camera camera) {
public AjaxResult cameraAngleJump( @RequestBody Camera camera) {
return hikVisionService.NvrCameraAngleJump(camera);
}
@PostMapping("/camera")
@ResponseBody
public AjaxResult camera(@RequestBody Camera camera) throws Exception {
// Camera cameraPictrue = hikVisionService.cameraPictrue(camera);
// return AjaxResult.success().put("data", cameraPictrue) ;
public AjaxResult camera( @RequestBody Camera camera) throws Exception {
// Camera cameraPictrue = hikVisionService.cameraPictrue(camera);
// return AjaxResult.success().put("data", cameraPictrue) ;
return hikVisionService.NvrCameraPictrue(camera);
}
@PostMapping("/cameraHk")
@ResponseBody
public AjaxResult cameraHk(@RequestBody Camera camera) throws Exception {
public AjaxResult cameraHk( @RequestBody Camera camera) throws Exception {
InfraredInfo infraredInfo = hikVisionService.cameraCalculatePicture(camera);
return AjaxResult.success().put("data", infraredInfo) ;
}
//图谱解析
@PostMapping("/ir/capturePicture")
@ResponseBody
public AjaxResult setCapturePicture(@RequestBody InfraPictureInfo infraPictureInfo) {
public AjaxResult setCapturePicture( @RequestBody InfraPictureInfo infraPictureInfo) {
return hikVisionService.capturePicture(infraPictureInfo);
}
@ -93,16 +92,16 @@ public class InfraredController {
//图谱解析
@PostMapping("/ir/picAnalyse")
@ResponseBody
public ResponseEntity<String> irPicAnalyse(@RequestBody final String analyseRequest) {
public ResponseEntity<String> irPicAnalyse( @RequestBody final String analyseRequest) {
return hikVisionService.irPicAnalyse(analyseRequest);
}
@GetMapping("/device/radiometry-temper/{cameraCode}")
public ResponseEntity<String> deviceRadiometryTemper(
@PathVariable("cameraCode") String cameraCode,
@RequestParam("presetId") Integer presetId,
@RequestParam("ruleId") Integer ruleId,
@RequestParam("meterType") Integer meterType
@PathVariable("cameraCode") String cameraCode,
@RequestParam("presetId") Integer presetId,
@RequestParam("ruleId") Integer ruleId,
@RequestParam("meterType") Integer meterType
) {
log.info("deviceRadiometryTemper, cameraCode: {}, presetId: {}, ruleId: {}, meterType: {}",
cameraCode, presetId, ruleId, meterType);
@ -123,11 +122,10 @@ public class InfraredController {
return ResponseEntity.ok(jsonObject.toJSONString());
}
//csv文件下载
@PostMapping("/ir/downloadCsv")
@ResponseBody
public ResponseEntity<InputStreamResource> downloadCsv(@RequestBody InfraPictureInfo infraPictureInfo) {
public ResponseEntity<InputStreamResource> downloadCsv( @RequestBody InfraPictureInfo infraPictureInfo) {
InputStream csvStream = hikVisionService.downloadCsv(infraPictureInfo.getFilePath());
return ResponseEntity.ok()
.header("Content-Type", "text/csv; charset=utf-8")
@ -136,11 +134,10 @@ public class InfraredController {
}
//添加画框数据
@PostMapping("/ir/addBoxData")
@ResponseBody
public AjaxResult addBoxData(@RequestBody InfraPictureInfo infraPictureInfo) {
public AjaxResult addBoxData( @RequestBody InfraPictureInfo infraPictureInfo) {
return AjaxResult.success().put("data", 0);
}
@ -148,7 +145,7 @@ public class InfraredController {
//删除选择图片的全部框
@PostMapping("/ir/deleteBoxData")
@ResponseBody
public AjaxResult deleteBoxData(@RequestBody InfraredBox infraredBox) {
public AjaxResult deleteBoxData( @RequestBody InfraredBox infraredBox) {
int i = -1;
return AjaxResult.success().put("data", i);
@ -157,7 +154,7 @@ public class InfraredController {
//获取选择图片的全部框
@PostMapping("/ir/selectBoxData")
@ResponseBody
public AjaxResult selectBoxData(@RequestBody InfraredBox infraredBox) {
public AjaxResult selectBoxData( @RequestBody InfraredBox infraredBox) {
List<InfraredBox> list=new ArrayList<>();
return AjaxResult.success().put("data", list);
}


+ 88
- 27
src/main/java/com/inspect/nvr/controller/IvsCameraController.java View File

@ -2,10 +2,16 @@ package com.inspect.nvr.controller;
import com.inspect.nvr.aop.TimeTrace;
import com.inspect.nvr.domain.device.*;
import com.inspect.nvr.domain.ivs.IvsPtzControlRequest;
import com.inspect.nvr.domain.ivs.IvsPtzControlResponse;
import com.inspect.nvr.ivs.service.IvsOpenApiService;
import com.inspect.nvr.service.IvsCameraService;
import com.inspect.nvr.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@ -18,54 +24,98 @@ public class IvsCameraController {
@Resource
private IvsCameraService ivsCameraService;
@Resource
private IvsOpenApiService ivsOpenApiService;
private static final Object captureLock = new Object();
private static final Object captureLock_pic = new Object();
@GetMapping("/device/ptzpresetlist/{cameraCode}/{domainCode}")
public ResponseEntity<IvsPresetListView> ptzPresetList(@PathVariable("cameraCode") String cameraCode, @PathVariable("domainCode") String domainCode) {
log.info("PTZ_PRESET_LIST cameraCode : {}, domainCode: {}", cameraCode, domainCode);
IvsPresetListView ivsPresetListView = ivsCameraService.ptzPresetList(cameraCode, domainCode);
/**
* 查询指定摄像机在对应 NVR 上的预置位列表
*/
@CrossOrigin
@GetMapping("/device/ptzpresetlist/{cameraCode}/{nvrCode}")
public ResponseEntity<IvsPresetListView> ptzPresetList(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("nvrCode") String nvrCode) {
log.info("PTZ_PRESET_LIST cameraCode : {}, nvrCode: {}", cameraCode, nvrCode);
IvsPresetListView ivsPresetListView = ivsOpenApiService.presetList(cameraCode, nvrCode);
return ResponseEntity
.ok()
.body(ivsPresetListView);
}
/**
* 接收 IVS 云台控制指令并转发给厂商适配器执行
*/
@CrossOrigin
@PostMapping({"/device/ptzcontrol"})
public ResponseEntity<PtzControlResult> ptzControl(@RequestBody PtzControlParam param) {
// synchronized (captureLock) {
log.info("Ptz control request param: {}", param);
return ResponseEntity
.ok()
.body(ivsCameraService.ptzControl(param));
// }
public ResponseEntity<IvsPtzControlResponse> ptzControl( @RequestBody IvsPtzControlRequest param) {
log.info("Ptz control request param: {}", param);
return ResponseEntity.ok().body(ivsOpenApiService.ptzControl(param));
}
@GetMapping({"/platform/platformSnapshot/{cameraCode}/{domainCode}"})
public ResponseEntity<SnapshotCommandResult> platformSnapshot(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode,
SnapshotCommandParam param) {
log.info("Platform Snapshot cameraCode: {}, domainCode: {}, param: {}", cameraCode, domainCode, param);
/**
* 创建指定摄像机的平台抓图任务
*/
@GetMapping({"/platform/platformSnapshot2/{cameraCode}/{domainCode}"})
public ResponseEntity<SnapshotCommandResult> platformSnapshot2(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode) {
log.info("Platform Snapshot cameraCode: {}, domainCode: {}", cameraCode, domainCode);
return ResponseEntity
.ok()
.body(ivsCameraService.platformSnapshot(cameraCode, domainCode, param));
.body(ivsCameraService.platformSnapshot(cameraCode, domainCode, null));
}
@PostMapping({"/platform/snapshotList"})
public ResponseEntity<SnapshotInfoListResult> retrieveSnapshotList(@RequestBody SnapshotInfoListParam param) {
/**
* 按任务或时间范围查询平台抓图结果
*/
@PostMapping({"/platform/snapshotList2"})
public ResponseEntity<SnapshotInfoListResult> retrieveSnapshotList2( @RequestBody SnapshotInfoListParam param) {
log.info("Snapshot list request param: {}", param);
return ResponseEntity
.ok()
.body(ivsCameraService.getSnapshotList(param));
}
/**
* 兼容旧版路径参数格式查询平台抓图结果
*/
@GetMapping("/platform/snapshotlist/{cameraCode}/{domainCode}/{startTime}/{endTime}/{fromIndex}/{toIndex}/{snapType}")
public ResponseEntity<SnapshotInfoListResult> retrieveLegacySnapshotList(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode,
@PathVariable("startTime") String startTime,
@PathVariable("endTime") String endTime,
@PathVariable("fromIndex") Integer fromIndex,
@PathVariable("toIndex") Integer toIndex,
@PathVariable("snapType") Integer snapType) {
SnapshotInfoListParam.SnapshotDetailInfo detail =
SnapshotInfoListParam.SnapshotDetailInfo.builder()
.startTime(startTime)
.endTime(endTime)
.fromIndex(fromIndex)
.toIndex(toIndex)
.snapType(snapType)
.build();
SnapshotInfoListParam request = SnapshotInfoListParam.builder()
.cameraCode(cameraCode)
.domainCode(domainCode)
.snapshotDetailInfo(detail)
.build();
return ResponseEntity.ok(ivsCameraService.getSnapshotList(request));
}
/**
* @deprecated
* use {@link #capture} instead.
*/
@Deprecated
/**
* 使用旧版会话标识下载抓图文件并保留失败重试机制
*/
@GetMapping("/downloadfile_old")
public ResponseEntity<InputStreamResource> downloadFile(@RequestParam("filesessionid") String fileSessionId) {
// synchronized (captureLock_pic) {
public ResponseEntity<InputStreamResource> downloadFile( @RequestParam("filesessionid") String fileSessionId) {
// synchronized (captureLock_pic) {
log.info("Download File Get Stream, fileSessionId: {}", fileSessionId);
ByteArrayInputStream byteArrayInputStream = null;
//添加重试机制
@ -90,23 +140,34 @@ public class IvsCameraController {
return ResponseEntity
.ok()
.body(new InputStreamResource(byteArrayInputStream));
// }
// }
}
@TimeTrace
/**
* 根据临时图片会话标识下载抓图文件
*/
@GetMapping("/downloadfile")
public ResponseEntity<InputStreamResource> capture(@RequestParam("filesessionid") String fileSessionId) {
public ResponseEntity<InputStreamResource> capture( @RequestParam("filesessionid") String fileSessionId) {
ByteArrayInputStream byteArrayInputStream = ivsCameraService.capture(fileSessionId);
return ResponseEntity.ok().body(new InputStreamResource(byteArrayInputStream));
}
@TimeTrace
/**
* 使用 Digest 认证直接抓取并返回 JPEG 图片
*/
@GetMapping("/digest")
public ResponseEntity<String> digest(@RequestParam("filesessionid") String fileSessionId) {
public ResponseEntity<byte[]> digest( @RequestParam("filesessionid") String fileSessionId) {
byte[] bytes = ivsCameraService.captureDigest(fileSessionId);
if (bytes == null || bytes.length == 0) {
return ResponseEntity.ok().body("Not OK");
log.error("Digest 抓图失败,filesessionid={}", fileSessionId);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
return ResponseEntity.ok().body("OK");
return ResponseEntity.ok()
.contentType(MediaType.IMAGE_JPEG)
.contentLength(bytes.length)
.header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"digest.jpg\"")
.body(bytes);
}
}

+ 466
- 18
src/main/java/com/inspect/nvr/controller/IvsServerController.java View File

@ -3,8 +3,13 @@ package com.inspect.nvr.controller;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.inspect.nvr.domain.ivs.*;
import com.inspect.nvr.ivs.service.IvsCameraSyncService;
import com.inspect.nvr.ivs.service.IvsOpenApiService;
import com.inspect.nvr.ivs.vo.IvsCameraSyncPage;
import com.inspect.nvr.hik.exception.HikNvrPlaybackException;
import com.inspect.nvr.view.IvsPlatformSnapshotView;
import com.inspect.nvr.view.IvsPlatformRecordListView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -20,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
import retrofit2.Call;
import retrofit2.Response;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
@ -31,39 +37,71 @@ import java.util.List;
public class IvsServerController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final IvsCameraSyncService ivsCameraSyncService;
private final IvsOpenApiService ivsOpenApiService;
/** 注入 IVS 摄像机同步服务和厂商路由门面。 */
public IvsServerController(
IvsCameraSyncService ivsCameraSyncService,
IvsOpenApiService ivsOpenApiService) {
this.ivsCameraSyncService = ivsCameraSyncService;
this.ivsOpenApiService = ivsOpenApiService;
}
private final String TASK_CODE = "1234567890";
private final String PIC_URL = "https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=songbird&step_word=&hs=0&pn=15&spn=0&di=7360350738658099201&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=&st=-1&cs=1060316073%2C1951231255&os=2156611125%2C946097664&simid=60689125%2C716595069&adpicid=0&lpn=0&ln=1080&fr=&fmq=1718353459191_R&fm=result&ic=0&s=undefined&hd=&latest=&copyright=&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=https%3A%2F%2Fup.sc.enterdesk.com%2Fedpic%2Ff4%2F4a%2Fee%2Ff44aeeb12debd4e56faf34d72890d76d.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3F4_z%26e3Bfv_z%26e3Bjgpj61jfh_z%26e3Bv54AzdH3F_jgAzdH3Ff7vwtAzdH3Fnbn8lb_z%26e3Bip4s&gsm=1e&rpstart=0&rpnum=0&islist=&querylist=&nojc=undefined&lid=6977254189663851692";
@Value("${platform.url:http://localhost}")
private String platFormUrl;
@Value("${rtsp.testUrl:rtsp://admin:Zenap_qweasdzxc@192.168.1.217:554/h264/ch3/main/av_stream}")
private String rtspTestUrl;
@GetMapping("/common/keepAlive2")
public ResponseEntity<IvsResult> keepAlive() {
/**
* 处理 IVS 心跳请求保持北向会话处于可用状态
*/
@GetMapping({"/common/keepAlive2", "/common/keepAlive"})
public ResponseEntity<IvsOperationResultView> keepAlive() {
log.info("[GAB] keep alive");
return ResponseEntity
.ok()
.body(IvsResult.builder().resultCode("0").build());
.body(IvsOperationResultView.builder().resultCode(0).build());
}
@PostMapping({"/loginInfo/login2/v1.0"})
public ResponseEntity<IvsResult> login(@RequestBody Login login) {
/**
* 处理 IVS 登录请求并返回兼容 IVS 的会话 Cookie
*/
@PostMapping({"/loginInfo/login2/v1.0", "/loginInfo/login/v1.0"})
public ResponseEntity<IvsOperationResultView> login( @RequestBody Login login) {
validateLoginRequest(login);
log.info("[GAB] login : {}", login.toString());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Set-Cookie", "token=1234567890");
responseHeaders.set("Set-Cookie", "JSESSIONID=1234567890");
return ResponseEntity
.ok()
.headers(responseHeaders)
.body(IvsResult.builder().resultCode("0").build());
.body(IvsOperationResultView.builder().resultCode(0).build());
}
/**
* 校验并处理 IVS 预置账号密码修改请求
*/
@PostMapping("/loginInfo/modifyPresetUserPwd/v1.0")
public ResponseEntity<IvsOperationResultView> modifyPresetUserPwd(
@RequestBody IvsPresetUserPasswordRequest request) {
// 先校验账号和密码长度保证返回结果符合 IVS 入参约束
validatePresetUserPasswordRequest(request);
// 返回 IVS 标准成功结果当前接口只做协议兼容不修改本地账号
return ResponseEntity.ok(IvsOperationResultView.builder().resultCode(0).build());
}
/**
* 返回旧版 IVS 预置位查询接口的兼容结果
*/
@GetMapping("/device/ptzpresetlist2/{cameraCode}/{domainCode}")
public ResponseEntity<IvsPresetListView> ptzPresetList(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode
) {
log.info("[GAB] cameraCode : {}, domainCode: {}", cameraCode, domainCode);
List<IvsPresetListView.PtzPresetInfo> list = new ArrayList<>();
@ -80,30 +118,440 @@ public class IvsServerController {
.build());
}
/**
* 返回旧版 RTSP 模拟接口配置的测试地址
*/
@PostMapping({"/video/rtspurl2/v1.0"})
public ResponseEntity<IvsVideoRtspView> videoRtspUrl(@RequestBody IvsVideoRtspVo rtspVo) {
public ResponseEntity<IvsVideoRtspView> videoRtspUrl( @RequestBody IvsVideoRtspVo rtspVo) {
log.info("[GAB] videoRtspUrl : {}, rtspTestUrl: {}", rtspVo.toString(), rtspTestUrl);
return ResponseEntity
.ok()
.body(IvsVideoRtspView
.builder()
.resultCode("0")
.resultCode(0)
//.rtspURL("rtsp://admin:htjc2018@192.168.1.249:554/h264/ch39/main/av_stream")
.rtspURL(rtspTestUrl)
.build()
);
}
/**
* 根据摄像机编码和媒体参数生成实时预览或录像回放地址
*/
@PostMapping("/video/rtspurl/v1.0")
public ResponseEntity<IvsRtspUrlResponse> videoRtspUrlV1(
@RequestBody IvsVideoRtspVo rtspVo) {
// 调用 IVS 门面由厂商路由生成实时或回放 RTSP 地址
return ResponseEntity.ok(ivsOpenApiService.rtspUrl(rtspVo));
}
@GetMapping("/device/deviceList2/v1.0")
public ResponseEntity<ResultEntity> getDeviceList(IvsDevChanListVo chanListVo) {
log.info("[GAB] chanListVo : {}", chanListVo.toString());
return ResponseEntity
.ok()
.body(ResultEntity.builder().resultCode("0").build());
/**
* 创建 IVS 平台抓图任务对应 IVS3800 文档 4.1.12.1
*
* @param cameraCode 路径中的摄像机编码不包含 # 后的域编码
* @param domainCode 路径中的域编码
* @param request IVS 抓图查询参数路径编码会覆盖同名查询参数
* @return 包含 taskID IVS 标准响应
*/
@CrossOrigin
@GetMapping("/platform/platformSnapshot/{cameraCode}/{domainCode}")
public ResponseEntity<IvsSnapshotCommandResponse> platformSnapshot(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode,
@ModelAttribute IvsDevChanSnapVo request) {
// Spring 会把 GET 查询参数绑定到 IVS 请求对象路径参数始终作为最终目标编码
IvsDevChanSnapVo normalized = request == null ? new IvsDevChanSnapVo() : request;
// 写入路径编码避免客户端通过查询参数改变抓图目标
normalized.setCameraCode(cameraCode);
normalized.setDomainCode(domainCode);
// 交给 IVS 门面路由到海康适配器由适配器复用 /actions/snapshot 抓图实现
return ResponseEntity.ok(ivsOpenApiService.platformSnapshot(normalized));
}
/**
* 查询 IVS 平台抓图结果对应 IVS3800 文档 4.1.12.3
*
* @param request 抓图任务摄像机和域编码查询参数
* @return IVS 标准抓图列表响应
*/
@PostMapping("/platform/snapshotList")
public ResponseEntity<IvsPlatformSnapshotView> snapshotList(
@RequestBody IvsChanSnapVo request,
HttpServletRequest httpRequest) {
// 交给 IVS 门面由厂商适配器根据任务标识读取抓图元数据
IvsPlatformSnapshotView response = ivsOpenApiService.snapshotList(request);
// 将适配器返回的相对图片地址补齐为当前服务的绝对访问地址
normalizeSnapshotUrls(response, httpRequest);
return ResponseEntity.ok(response);
}
/**
* 下载平台抓图任务对应的 JPEG 图片
*
* <p>该地址由 4.1.12.3 返回的 pictureUrl/previewUrl 使用图片内容仍由厂商适配器提供</p>
*
* @param taskId 抓图任务标识
* @return JPEG 图片响应
*/
@CrossOrigin
@GetMapping("/platform/snapshot/{taskId}")
public ResponseEntity<byte[]> snapshotImage(
@PathVariable("taskId") String taskId) {
// 通过 IVS 门面读取图片控制器不直接依赖海康 SDK NVR 客户端
byte[] image = ivsOpenApiService.snapshotImage(taskId);
// 设置 JPEG 响应类型确保浏览器和 IVS 客户端按图片处理返回内容
return ResponseEntity.ok().contentType(MediaType.IMAGE_JPEG).body(image);
}
/**
* 保存摄像机当前位置为新的 IVS 预置位
*/
@PostMapping("/ptz/presetposition/v1.0")
public ResponseEntity<IvsPresetOperationView> addPreset(
@RequestBody IvsPresetAddRequest request) {
// 调用 IVS 门面由海康适配器保存当前位置并写入设备预置位
return ResponseEntity.ok(ivsOpenApiService.addPreset(request));
}
/**
* 修改 IVS 预置位名称并同步到厂商设备
*/
@PutMapping("/ptz/presetposition/v1.0")
public ResponseEntity<IvsOperationResultView> modifyPreset(
@RequestBody IvsPresetModifyRequest request) {
// 调用 IVS 门面由厂商适配器把预置位名称同步到设备端
return ResponseEntity.ok(ivsOpenApiService.modifyPreset(request));
}
/**
* 兼容历史调用方式生成录像回放媒体地址
*/
@RequestMapping(value = "/api/record/url", method = {RequestMethod.GET, RequestMethod.POST})
public ResponseEntity<IvsRtspUrlResponse> recordUrl(
@RequestBody(required = false) IvsVideoRtspVo request,
@RequestParam(value = "cameraCode", required = false) String cameraCode,
@RequestParam(value = "startTime", required = false) String startTime,
@RequestParam(value = "endTime", required = false) String endTime,
@RequestParam(value = "streamType", required = false, defaultValue = "1") Integer streamType) {
IvsVideoRtspVo normalized = request;
// GET 调用没有请求体时按查询参数组装标准 IVS 回放请求对象
if (normalized == null) {
normalized = new IvsVideoRtspVo();
normalized.setCameraCode(cameraCode);
RealMediaURLParam media = new RealMediaURLParam();
media.setServiceType(4);
media.setStreamType(streamType == null ? 1 : streamType);
media.setTimeSpan(TimeSpan.builder().startTime(startTime).endTime(endTime).build());
normalized.setMediaURLParam(media);
// POST 请求体存在但缺少媒体参数时补齐兼容接口所需的回放参数
} else if (normalized.getMediaURLParam() == null) {
RealMediaURLParam media = new RealMediaURLParam();
media.setServiceType(4);
media.setStreamType(streamType == null ? 1 : streamType);
media.setTimeSpan(TimeSpan.builder().startTime(startTime).endTime(endTime).build());
normalized.setMediaURLParam(media);
}
// 统一调用 IVS RTSP 门面生成录像地址
return ResponseEntity.ok(ivsOpenApiService.rtspUrl(normalized));
}
/**
* 分页查询指定摄像机的录像记录
*/
@GetMapping("/platform/recordlist/{recordMethod}/{cameraCode}/{domainCode}/{startTime}/{endTime}/{fromIndex}/{toIndex}")
public ResponseEntity<IvsPlatformRecordListView> recordList(
@PathVariable("recordMethod") int recordMethod,
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode,
@PathVariable("startTime") String startTime,
@PathVariable("endTime") String endTime,
@PathVariable("fromIndex") int fromIndex,
@PathVariable("toIndex") int toIndex) {
// 将录像列表查询交给 IVS 门面由厂商适配器查询并转换录像记录
return ResponseEntity.ok(ivsOpenApiService.recordList(
recordMethod, cameraCode, domainCode, startTime, endTime, fromIndex, toIndex));
}
/**
* 启动指定摄像机的平台手动录像任务
*/
@GetMapping("/platform/startplatformrecord/{recordTime}/{cameraCode}/{domainCode}")
public ResponseEntity<IvsOperationResultView> startPlatformRecord(
@PathVariable("recordTime") int recordTime,
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode) {
// 调用 IVS 门面启动目标摄像机的平台手动录像
return ResponseEntity.ok(IvsOperationResultView.builder()
.resultCode(ivsOpenApiService.startPlatformRecord(
recordTime, cameraCode, domainCode))
.build());
}
/**
* 停止指定摄像机的平台手动录像任务
*/
@GetMapping("/platform/stopplatformrecord/{cameraCode}/{domainCode}")
public ResponseEntity<IvsOperationResultView> stopPlatformRecord(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode) {
// 调用 IVS 门面停止目标摄像机的平台手动录像
return ResponseEntity.ok(IvsOperationResultView.builder()
.resultCode(ivsOpenApiService.stopPlatformRecord(
cameraCode, domainCode))
.build());
}
/**
* 释放指定的厂商回放句柄
*/
@GetMapping("/playback/stopplatformplaybackbyip/{handle}")
public ResponseEntity<IvsOperationResultView> stopPlatformPlayback(
@PathVariable("handle") long handle) {
// 将回放句柄交给 IVS 门面由默认厂商服务释放设备资源
return ResponseEntity.ok(IvsOperationResultView.builder()
.resultCode(ivsOpenApiService.stopPlatformPlayback(handle))
.build());
}
/**
* 删除指定摄像机上的 IVS 预置位
*/
@DeleteMapping("/ptz/presetposition/{cameraCode}/{domainCode}/{presetIndex}/v1.0")
public ResponseEntity<IvsOperationResultView> deletePreset(
@PathVariable("cameraCode") String cameraCode,
@PathVariable("domainCode") String domainCode,
@PathVariable("presetIndex") String presetIndex) {
// 先把路径文本转换为整数并校验范围再调用预置位删除能力
int index = parsePresetIndex(presetIndex);
// 调用 IVS 门面由厂商适配器删除设备端预置位
return ResponseEntity.ok(ivsOpenApiService.deletePreset(
cameraCode, domainCode, index));
}
/**
* 同步所有 NVR 下的摄像机并按请求范围分页返回子设备列表
*/
@GetMapping("/device/deviceList/v1.0")
public ResponseEntity<IvsDeviceListResponse> getDeviceList( IvsDevChanListVo chanListVo) {
log.info("[GAB] deviceList request : {}", chanListVo);
// 校验设备类型分页范围和设备组模式避免无效查询触发全量同步
validateDeviceListRequest(chanListVo);
// 同步所有 NVR 下的摄像机及在线状态并获取当前分页结果
IvsCameraSyncPage page = ivsCameraSyncService.syncAndPage(
chanListVo.getFromIndex(), chanListVo.getToIndex());
IvsDeviceListResponse.CameraBriefExInfos cameraBriefExInfos =
IvsDeviceListResponse.CameraBriefExInfos.builder()
.total(page.getTotal())
.indexRange(IndexRange.builder()
.fromIndex(chanListVo.getFromIndex())
.toIndex(chanListVo.getToIndex())
.build())
.cameraBriefInfoExList(
IvsDeviceListResponse.CameraBriefInfoExList.builder()
.cameraBriefInfoExes(page.getCameras())
.build())
.build();
// 只要有 NVR 同步失败就返回非零结果码同时仍保留成功同步的摄像机数据
int resultCode = page.getSyncResult().getFailedNvrCount() == 0 ? 0 : 1;
// 组装 IVS 子设备列表响应包含分页范围总数和摄像机扩展信息
return ResponseEntity.ok(IvsDeviceListResponse.builder()
.resultCode(resultCode)
.cameraBriefExInfos(cameraBriefExInfos)
.build());
}
/**
* 校验子设备列表查询的设备类型分页范围和设备组模式
*/
private void validateDeviceListRequest(IvsDevChanListVo request) {
// 请求体为空时无法读取 deviceType 和分页参数
if (request == null) {
throw HikNvrPlaybackException.badRequest("设备列表查询参数不能为空");
}
int deviceType = request.getDeviceType();
// 只接受 IVS 文档定义的摄像机告警和影子摄像机类型
if (deviceType != 2 && deviceType != 4 && deviceType != 30
&& deviceType != 32 && deviceType != 33 && deviceType != 35) {
throw HikNvrPlaybackException.badRequest(
"deviceType只能为2、4、30、32、33或35");
}
// 分页索引必须从 1 开始且结束索引不能小于开始索引
if (request.getFromIndex() < 1 || request.getToIndex() < request.getFromIndex()) {
throw HikNvrPlaybackException.badRequest(
"fromIndex/toIndex必须满足1<=fromIndex<=toIndex");
}
// 单次最多返回 2 万个设备避免一次同步和序列化过大
if ((long) request.getToIndex() - request.getFromIndex() + 1 > 20000L) {
throw HikNvrPlaybackException.badRequest("单次设备列表查询不能超过20000条");
}
// groupMode 只允许本地模式 0 或统一设备组模式 1
if (request.getGroupMode() != 0 && request.getGroupMode() != 1) {
throw HikNvrPlaybackException.badRequest("groupMode只能为0或1");
}
// IVS 文档规定 deviceType=4 告警设备只能使用本地设备组模式
if (deviceType == 4 && request.getGroupMode() == 1) {
throw HikNvrPlaybackException.badRequest(
"deviceType=4时groupMode只能为0");
}
}
/**
* 校验 IVS 登录参数的必填项长度和登录位置取值
*/
private void validateLoginRequest(Login request) {
// 登录请求必须同时提供非空用户名和密码
if (request == null || !hasText(request.getUsername())
|| !hasText(request.getPassword())) {
throw HikNvrPlaybackException.badRequest("userName和password不能为空");
}
validateLength(request.getUsername(), 512, "userName");
validateLength(request.getPassword(), 512, "password");
// loginLocation 如果传入只允许 IVS 规定的 0 1
if (request.getLoginLocation() != null
&& !request.getLoginLocation().isEmpty()
&& !"0".equals(request.getLoginLocation())
&& !"1".equals(request.getLoginLocation())) {
throw HikNvrPlaybackException.badRequest("loginLocation只能为0或1");
}
}
/**
* 校验预置账号密码修改请求
*/
private void validatePresetUserPasswordRequest(IvsPresetUserPasswordRequest request) {
// 账号密码修改请求必须提供非空用户名和密码
if (request == null || !hasText(request.getUserName())
|| !hasText(request.getPassword())) {
throw HikNvrPlaybackException.badRequest("userName和password不能为空");
}
validateLength(request.getUserName(), 512, "userName");
validateLength(request.getPassword(), 512, "password");
}
/**
* 校验字符串字段长度是否超过接口限制
*/
private void validateLength(String value, int maxLength, String fieldName) {
// 字段长度超过接口限制时直接返回参数错误
if (value.length() > maxLength) {
throw HikNvrPlaybackException.badRequest(
fieldName + "长度不能超过" + maxLength + "个字符");
}
}
/**
* 判断字符串是否包含有效的非空白内容
*/
private boolean hasText(String value) {
return value != null && !value.trim().isEmpty();
}
/**
* 将平台抓图列表中的图片地址转换为当前服务可访问的绝对地址
*
* @param response 抓图列表响应对象
* @param httpRequest 当前 HTTP 请求用于获取协议主机和端口
*/
private void normalizeSnapshotUrls(IvsPlatformSnapshotView response,
HttpServletRequest httpRequest) {
// 响应或分页容器为空时没有可转换的图片地址直接保持原响应
if (response == null || response.getSnapshotInfoList() == null) {
return;
}
// 根据当前请求生成服务根地址避免把 127.0.0.1 或固定端口写死在响应中
String baseUrl = buildCurrentServerBaseUrl(httpRequest);
// 内部调用或单元测试可能没有 HTTP 请求上下文此时保留适配器返回的原地址
if (!hasText(baseUrl)) {
return;
}
List<IvsPlatformSnapshotView.SnapshotInfo> snapshotInfos =
response.getSnapshotInfoList().getSnapshotInfos();
// 没有抓图明细时无需遍历转换 URL
if (snapshotInfos == null) {
return;
}
for (IvsPlatformSnapshotView.SnapshotInfo snapshotInfo : snapshotInfos) {
// 列表中出现空明细时跳过该条数据避免影响其余抓图结果
if (snapshotInfo == null) {
continue;
}
// 预览地址和下载地址都指向本服务的抓图资源分别补齐为绝对地址
snapshotInfo.setPreviewUrl(toAbsoluteSnapshotUrl(snapshotInfo.getPreviewUrl(), baseUrl));
snapshotInfo.setPictureUrl(toAbsoluteSnapshotUrl(snapshotInfo.getPictureUrl(), baseUrl));
}
}
/**
* 根据当前 HTTP 请求拼出服务协议主机和端口
*
* @param httpRequest 当前 HTTP 请求
* @return 服务根地址无法从请求获取时返回空字符串
*/
private String buildCurrentServerBaseUrl(HttpServletRequest httpRequest) {
// HTTP 调用没有请求上下文无法安全推断对外访问地址
if (httpRequest == null || !hasText(httpRequest.getScheme())
|| !hasText(httpRequest.getServerName())) {
return "";
}
String scheme = httpRequest.getScheme().trim();
String serverName = httpRequest.getServerName().trim();
int serverPort = httpRequest.getServerPort();
StringBuilder baseUrl = new StringBuilder(scheme)
.append("://")
.append(serverName);
// HTTP HTTPS 使用默认端口时不重复拼接端口号
boolean defaultPort = ("http".equalsIgnoreCase(scheme) && serverPort == 80)
|| ("https".equalsIgnoreCase(scheme) && serverPort == 443);
// 服务使用非默认端口例如 8081时必须保留端口确保链接可以直接访问
if (!defaultPort && serverPort > 0) {
baseUrl.append(':').append(serverPort);
}
return baseUrl.toString();
}
/**
* 将相对抓图地址拼接到服务根地址适配器已返回绝对地址时保持原值
*
* @param url 适配器返回的抓图地址
* @param baseUrl 当前服务根地址
* @return 可直接访问的绝对抓图地址
*/
private String toAbsoluteSnapshotUrl(String url, String baseUrl) {
// 地址为空或基础地址不可用时不改变适配器的返回结果
if (!hasText(url) || !hasText(baseUrl)) {
return url;
}
String normalizedUrl = url.trim();
// 适配器已经返回 httphttps 等绝对地址时避免重复拼接
if (normalizedUrl.matches("^[a-zA-Z][a-zA-Z0-9+.-]*://.*$")) {
return normalizedUrl;
}
// 以斜杠开头的路径直接拼接其余相对路径先补一个斜杠
return normalizedUrl.startsWith("/")
? baseUrl + normalizedUrl
: baseUrl + "/" + normalizedUrl;
}
/**
* 将路径中的预置位编号解析为合法整数
*/
private int parsePresetIndex(String value) {
// 路径编号只能由数字组成拒绝负号和其他字符
if (value == null || !value.matches("\\d+")) {
throw HikNvrPlaybackException.badRequest("presetIndex必须是非负整数");
}
try {
long parsed = Long.parseLong(value);
// 海康预置位编号最大为 255超过后不再转换为 int
if (parsed > 255) {
throw HikNvrPlaybackException.badRequest("presetIndex不能超过255");
}
return (int) parsed;
} catch (NumberFormatException ex) {
throw HikNvrPlaybackException.badRequest("presetIndex超出整数范围");
}
}
}

+ 209
- 0
src/main/java/com/inspect/nvr/controller/Test.java View File

@ -0,0 +1,209 @@
package com.inspect.nvr.controller;
import com.inspect.nvr.domain.Infrared.Camera;
import com.inspect.nvr.hikVision.utils.AjaxResult;
import com.inspect.nvr.tempCount.TempCount;
import com.inspect.nvr.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPSClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
import static java.util.Set.*;
@CrossOrigin
@Slf4j
@Controller
@RequestMapping
public class Test {
@Resource
private TempCount tempCount;
@PostMapping("/hw/test2")
@ResponseBody
@CrossOrigin
public void cameraHong1( @RequestBody Camera camera) throws InterruptedException {
int i = 0;
int j = 0;
List<String> strings = listJpgFilePaths(camera.getAddress());
for (String path : strings) {
log.info("path:{}",path);
InputStream inputStream = downloadFtp(path);
if(StringUtils.isNotNull(inputStream)){
log.info("处理图片{}",i++);
} else {
log.info("下载图片失败{}",j++);
}
}
}
@PostMapping("/hw/test3")
@ResponseBody
@CrossOrigin
public void cameraHong3( @RequestBody Camera camera) throws InterruptedException {
int i = 0;
int j = 0;
InputStream inputStream = downloadFtp(camera.getAddress());
if(StringUtils.isNotNull(inputStream)){
log.info("处理图片{}",i++);
} else {
log.info("下载图片失败{}",j++);
}
}
/**
* 查询FTP指定目录下所有JPG文件的完整路径
* @return JPG文件路径列表["1/2025/09/16/78/CCD/file1.jpg", ...]
*/
public List<String> listJpgFilePaths(String path) {
List<String> jpgPaths = new ArrayList<>();
FTPSClient ftps = null;
// 目标目录
String targetDir = path;
try {
// 初始化FTPS客户端隐式SSL
ftps = new FTPSClient(true);
// 连接服务器
ftps.connect("192.168.4.123", 10990);
log.info("已连接到FTP服务器: 192.168.4.123:10990");
// 登录
boolean loginRes = ftps.login("ftpuser", "atia2018");
System.out.println("登录结果: " + loginRes);
if (!loginRes) {
log.error("FTP登录失败,请检查用户名和密码");
return jpgPaths;
}
// 配置FTP参数
ftps.enterLocalPassiveMode();
ftps.setControlEncoding("UTF-8");
// 列出目标目录下的所有文件
FTPFile[] files = ftps.listFiles(targetDir);
if (files == null) {
log.error("无法获取目录内容,可能目录不存在或无权限: " + targetDir);
return jpgPaths;
}
// 筛选JPG文件并收集完整路径
for (FTPFile file : files) {
// 只处理文件排除子目录
if (file.isFile()) {
String fileName = file.getName();
log.info("文件名:{}",fileName);
// 检查是否为JPG文件不区分大小写
String fullPath = targetDir + fileName;
jpgPaths.add(fullPath);
}
}
log.info("在目录 {} 下共找到 {} 个JPG文件", targetDir, jpgPaths.size());
} catch (Exception e) {
log.error("查询FTP文件时发生错误", e);
} finally {
// 关闭FTP连接
if (ftps != null && ftps.isConnected()) {
try {
ftps.logout();
ftps.disconnect();
log.info("FTP连接已关闭");
} catch (Exception e) {
log.error("关闭FTP连接时发生错误", e);
}
}
}
return jpgPaths;
}
public InputStream downloadFtp(String downloadPath) {
FTPSClient ftps = null;
InputStream inputStream = null;
try {
ftps = new FTPSClient(true);
ftps.connect("192.168.4.123", 10990);
boolean loginRes = ftps.login("ftpuser", "atia2018");
log.info("FTP登录结果: {}", loginRes);
if (!loginRes) {
log.error("FTP登录失败");
return null;
}
ftps.setFileType(2); // 二进制模式
ftps.enterLocalPassiveMode();
ftps.setControlEncoding("UTF-8");
ftps.setFileTransferMode(10);
ftps.execPROT("P");
// 获取文件流
inputStream = ftps.retrieveFileStream(downloadPath);
if (inputStream == null) {
log.warn("[FTP] DOWNLOAD FAIL, EMPTY STREAM: {}", downloadPath);
return null;
}
// 将数据读取到内存中
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[8192];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
// 完成文件传输操作
boolean completed = ftps.completePendingCommand();
if (!completed) {
log.warn("FTP文件传输未正确完成: {}", downloadPath);
}
// 关闭原始流重要必须在completePendingCommand之后关闭
inputStream.close();
inputStream = null; // 防止finally再次关闭
// 创建新的InputStream返回
byte[] fileData = buffer.toByteArray();
log.info("成功下载文件: {}, 大小: {} 字节", downloadPath, fileData.length);
return new ByteArrayInputStream(fileData);
} catch (Exception e) {
log.error("FTP下载错误: " + e.getMessage(), e);
return null;
} finally {
// 关闭原始输入流
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException ignored) {}
}
// 关闭FTP连接
if (ftps != null && ftps.isConnected()) {
try {
ftps.logout();
ftps.disconnect();
log.info("FTP连接已关闭");
} catch (IOException e) {
log.error("FTP断开连接错误: " + e.getMessage(), e);
}
}
}
}
}

+ 0
- 3
src/main/java/com/inspect/nvr/domain/Infrared/InfraPictureInfo.java View File

@ -41,7 +41,4 @@ public class InfraPictureInfo {
private String imgName;
}

+ 0
- 2
src/main/java/com/inspect/nvr/domain/Infrared/InfraredBox.java View File

@ -9,7 +9,6 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class InfraredBox {
private Integer infraredBoxId;
private String imgName;
@ -32,5 +31,4 @@ public class InfraredBox {
private String height;
}

+ 1
- 2
src/main/java/com/inspect/nvr/domain/Infrared/InfraredInfo.java View File

@ -48,7 +48,7 @@ public class InfraredInfo {
@JsonIgnore
//框选区域-平均值
private float frameAverage;
// @JsonIgnore
// @JsonIgnore
//框选区域-最大值
private float frameMax;
@JsonIgnore
@ -66,5 +66,4 @@ public class InfraredInfo {
//标注后图片路径
private String outPath;
}

+ 2
- 5
src/main/java/com/inspect/nvr/domain/Infrared/NvrInfo.java View File

@ -1,13 +1,11 @@
package com.inspect.nvr.domain.Infrared;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ -29,6 +27,8 @@ public class NvrInfo {
private Integer serverPort;
/** nvr_rtsp_端口 */
private Integer rtspPort;
/** nvr_http_端口 */
private Integer httpPort;
/** 账号 */
private String account;
/** 密码 */
@ -51,7 +51,4 @@ public class NvrInfo {
/** 是否删除【0.否 1.是】 */
private Integer isFlag;
}

+ 5
- 5
src/main/java/com/inspect/nvr/domain/Infrared/TemperatureData.java View File

@ -9,10 +9,10 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class TemperatureData {
private String maxTemperature; // 最高温度
private String minTemperature; // 最低温度
private float avgTemperature; // 平均温度
private String maxTemperature; // 最高温度
private String minTemperature; // 最低温度
private float avgTemperature; // 平均温度
private float temperatureDiff; // 温差
private int channel; // 通道号
private int ruleId; // 规则ID
private int channel; // 通道号
private int ruleId; // 规则ID
}

+ 13
- 0
src/main/java/com/inspect/nvr/domain/common/AjaxResultResponse.java View File

@ -0,0 +1,13 @@
package com.inspect.nvr.domain.common;
import lombok.Data;
@Data
public class AjaxResultResponse {
private Integer code;
private String msg;
private Object data;
}

+ 11
- 0
src/main/java/com/inspect/nvr/domain/common/FileUploadRequest.java View File

@ -0,0 +1,11 @@
package com.inspect.nvr.domain.common;
import lombok.Data;
@Data
public class FileUploadRequest {
private String filename;
private String uploadFile;
}

+ 1
- 1
src/main/java/com/inspect/nvr/domain/device/SnapshotCommandResult.java View File

@ -10,6 +10,6 @@ import java.io.Serializable;
@Setter
@Builder
public class SnapshotCommandResult implements Serializable {
private Integer resultCode;
private String taskID;
private String resultCode;
}

+ 18
- 16
src/main/java/com/inspect/nvr/domain/device/SnapshotInfoListParam.java View File

@ -10,28 +10,30 @@ import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
public class SnapshotInfoListParam implements Serializable {
private String taskID;
private String code;
private String cameraCode;
private String domainCode;
private String host;
private String port;
private String address;
private String username;
private String password;
private String cameraCode;
private String taskID;
private SnapshotDetailInfo snapshotDetailInfo;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SnapshotDetailInfo implements Serializable {
private String startTime;
private String endTime;
private Integer fromIndex;
private Integer toIndex;
private Integer snapType;
}
@Override
public String toString() {
return "SnapshotInfoListParam{" +
"taskID='" + taskID + '\'' +
", code='" + code + '\'' +
"domainCode='" + domainCode + '\'' +
", cameraCode='" + cameraCode + '\'' +
", domainCode='" + domainCode + '\'' +
", host='" + host + '\'' +
", port='" + port + '\'' +
", address='" + address + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", taskID='" + taskID + '\'' +
", snapshotDetailInfo=" + snapshotDetailInfo +
'}';
}
}

+ 4
- 3
src/main/java/com/inspect/nvr/domain/device/SnapshotInfoListResult.java View File

@ -11,7 +11,7 @@ import java.util.List;
@Setter
@Builder
public class SnapshotInfoListResult implements Serializable {
private String resultCode;
private Integer resultCode;
private SnapshotInfoList snapshotInfoList;
@Setter
@ -20,9 +20,10 @@ public class SnapshotInfoListResult implements Serializable {
public static class SnapshotInfo {
private String cameraCode;
private String snapTime;
private String snapType;
private Integer snapType;
private Integer pictureID;
private String pictureName;
private String pictureSize;
private Integer pictureSize;
private String previewUrl;
private String pictureUrl;
private String reserve;


+ 3
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsChanSnapVo.java View File

@ -12,7 +12,10 @@ import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
public class IvsChanSnapVo implements Serializable {
/** 抓图任务标识,查询时必填。 */
private String taskID;
/** 摄像机编码,可用于过滤任务结果。 */
private String cameraCode;
/** 域编码,可用于过滤任务结果。 */
private String domainCode;
}

+ 1
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsDevChanListVo.java View File

@ -25,4 +25,5 @@ public class IvsDevChanListVo implements Serializable {
private int deviceType = 35;
private int fromIndex = 1;
private int toIndex = 10000;
private int groupMode = 0;
}

+ 5
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsDevChanSnapVo.java View File

@ -12,9 +12,14 @@ import lombok.experimental.SuperBuilder;
@AllArgsConstructor
@ToString(callSuper = true)
public class IvsDevChanSnapVo extends IvsVo {
/** 设备序列号,按 IVS 协议可选传入。 */
private String serial;
/** 设备通道,按 IVS 协议可选传入。 */
private String channel;
/** 是否执行实时抓图。 */
private boolean realtime;
/** 是否检查抓图输出结果。 */
private boolean check_outputs;
/** 是否启用超时控制。 */
private boolean timeout;
}

+ 64
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsDeviceListResponse.java View File

@ -0,0 +1,64 @@
package com.inspect.nvr.domain.ivs;
import com.inspect.nvr.ivs.pojo.IvsCamera;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* IVS 获取子设备列表响应摄像机扩展信息放在 cameraBriefExInfos
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsDeviceListResponse implements Serializable {
private static final long serialVersionUID = 1L;
private Integer resultCode;
private Object cameraBriefInfos;
private Object audioBriefInfos;
private Object alarmBriefInfos;
private Object cameraBriefInfosV2;
private Object shadowCameraBriefInfos;
private CameraBriefExInfos cameraBriefExInfos;
private List<Object> exceptionDomain;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class CameraBriefExInfos implements Serializable {
private static final long serialVersionUID = 1L;
private int total;
private IndexRange indexRange;
private CameraBriefInfoExList cameraBriefInfoExList;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class CameraBriefInfoExList implements Serializable {
private static final long serialVersionUID = 1L;
private List<IvsCamera> cameraBriefInfoExes;
}
}

+ 20
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsOperationResultView.java View File

@ -0,0 +1,20 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** Integer resultCode response used by the IVS platform operations. */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsOperationResultView implements Serializable {
private static final long serialVersionUID = 1L;
private Integer resultCode;
}

+ 24
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsPresetAddRequest.java View File

@ -0,0 +1,24 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** Request body for the IVS add-preset operation. */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsPresetAddRequest implements Serializable {
private static final long serialVersionUID = 1L;
private String cameraCode;
private String presetName;
private Integer focusSwitch;
}

+ 39
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsPresetModifyRequest.java View File

@ -0,0 +1,39 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** Request body for the IVS preset-name modification operation. */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsPresetModifyRequest implements Serializable {
private static final long serialVersionUID = 1L;
private String cameraCode;
private PtzPresetInfo ptzPresetInfo;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PtzPresetInfo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer presetIndex;
private String presetName;
private Integer focusSwitch;
private String reserve;
}
}

+ 22
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsPresetOperationView.java View File

@ -0,0 +1,22 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** Common response for IVS preset add/delete operations. */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsPresetOperationView implements Serializable {
private static final long serialVersionUID = 1L;
private Integer resultCode;
private Integer presetIndex;
}

+ 23
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsPresetUserPasswordRequest.java View File

@ -0,0 +1,23 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** Request body for changing the IVS preset account password. */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsPresetUserPasswordRequest implements Serializable {
private static final long serialVersionUID = 1L;
private String userName;
private String password;
}

+ 31
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsPtzControlRequest.java View File

@ -0,0 +1,31 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** IVS /device/ptzcontrol 云台控制请求。 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsPtzControlRequest implements Serializable {
/** Java 序列化版本号,保证请求对象在序列化时的兼容性。 */
private static final long serialVersionUID = 1L;
/** IVS 摄像机完整编码,格式为设备编码#域编码。 */
private String cameraCode;
/** IVS 云台控制码,1~38;本次补齐 20~28 的海康映射。 */
private Integer controlCode;
/** 云台控制参数1,按控制码表示运动模式、辅助设备类型或空参数。 */
private String controlPara1;
/** 云台控制参数2,按控制码表示速度或空参数。 */
private String controlPara2;
}

+ 23
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsPtzControlResponse.java View File

@ -0,0 +1,23 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/** Strict response for IVS /device/ptzcontrol. */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsPtzControlResponse implements Serializable {
private static final long serialVersionUID = 1L;
private Integer resultCode;
private Integer lockStatus;
}

+ 29
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsRtspUrlResponse.java View File

@ -0,0 +1,29 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* Strict response for the IVS /video/rtspurl/v1.0 contract.
*
* <p>The northbound contract contains only resultCode and rtspURL. Keep this
* type separate from the application's legacy multi-protocol view so that
* null or implementation-specific URL fields cannot leak into the protocol
* response.</p>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsRtspUrlResponse implements Serializable {
private static final long serialVersionUID = 1L;
private Integer resultCode;
private String rtspURL;
}

+ 29
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsSnapshotCommandResponse.java View File

@ -0,0 +1,29 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* IVS 4.1.12.1 平台抓图任务创建响应
*
* <p>IVS 文档要求 resultCode taskID 位于响应顶层不能再嵌套 resultBody</p>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IvsSnapshotCommandResponse implements Serializable {
/** Java 序列化版本号,保证响应对象在序列化过程中的兼容性。 */
private static final long serialVersionUID = 1L;
/** IVS 业务结果码,0 表示平台抓图任务创建成功。 */
private Integer resultCode;
/** IVS 平台抓图任务标识,供后续抓图列表和图片下载接口使用。 */
private String taskID;
}

+ 1
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsSnapshotView.java View File

@ -12,5 +12,6 @@ import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
public class IvsSnapshotView implements Serializable {
/** 平台抓图任务标识。 */
private String taskID;
}

+ 1
- 1
src/main/java/com/inspect/nvr/domain/ivs/IvsVideoRtspView.java View File

@ -12,7 +12,7 @@ import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
public class IvsVideoRtspView implements Serializable {
private String resultCode;
private Integer resultCode;
private String url;
private String rtspURL;
private String flvURL;


+ 4
- 0
src/main/java/com/inspect/nvr/domain/ivs/IvsVo.java View File

@ -12,8 +12,12 @@ import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
public class IvsVo implements Serializable {
/** Java 序列化版本号。 */
private static final long serialVersionUID = -6922254609485688648L;
/** 设备编码,不包含 # 后的域编码。 */
private String code;
/** 摄像机编码,不包含 # 后的域编码。 */
private String cameraCode;
/** 摄像机所属域编码。 */
private String domainCode;
}

+ 2
- 0
src/main/java/com/inspect/nvr/domain/ivs/Login.java View File

@ -15,4 +15,6 @@ public class Login {
private String username;
private String password;
private String loginLocation;
}

+ 47
- 3
src/main/java/com/inspect/nvr/domain/ivs/RealMediaURLParam.java View File

@ -1,5 +1,9 @@
package com.inspect.nvr.domain.ivs;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
//@Data
@ -10,12 +14,16 @@ public class RealMediaURLParam implements Serializable {
private int serviceType = 1;
private int packProtocolType = 1;
private int streamType = 1;
private int protocolType = 2;
private int transMode = 1;
private int protocolType = 1;
private int transMode = 0;
private int broadCastType = 0;
private int clientType = 1;
private int clientType = 0;
private TimeSpan timeSpan;
private String fileName;
private String nvrCode;
private String dstIP;
private IPInfo srcIP;
public int getServiceType() {
return serviceType;
@ -88,5 +96,41 @@ public class RealMediaURLParam implements Serializable {
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getNvrCode() {
return nvrCode;
}
public void setNvrCode(String nvrCode) {
this.nvrCode = nvrCode;
}
public String getDstIP() {
return dstIP;
}
public void setDstIP(String dstIP) {
this.dstIP = dstIP;
}
public IPInfo getSrcIP() {
return srcIP;
}
public void setSrcIP(IPInfo srcIP) {
this.srcIP = srcIP;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class IPInfo implements Serializable {
private static final long serialVersionUID = 1L;
private int ipType;
private String ip;
}
}

+ 82
- 0
src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackController.java View File

@ -0,0 +1,82 @@
package com.inspect.nvr.hik.controller;
import com.inspect.nvr.hik.domain.HikNvrPlaybackErrorResponse;
import com.inspect.nvr.hik.domain.HikNvrPlaybackClipRequest;
import com.inspect.nvr.hik.domain.HikNvrPlaybackRequest;
import com.inspect.nvr.hik.domain.HikNvrPlaybackResponse;
import com.inspect.nvr.hik.service.HikNvrPlaybackClipFile;
import com.inspect.nvr.hik.service.HikNvrPlaybackClipService;
import com.inspect.nvr.hik.service.HikNvrPlaybackService;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import javax.annotation.Resource;
@RestController
@CrossOrigin(exposedHeaders = HttpHeaders.CONTENT_DISPOSITION)
@RequestMapping("/hik/nvr/playback")
public class HikNvrPlaybackController {
/** MP4 下载响应使用的标准媒体类型。 */
private static final MediaType MP4_MEDIA_TYPE =
MediaType.parseMediaType("video/mp4");
/** 海康录像查询服务。 */
@Resource
private HikNvrPlaybackService playbackService;
/** 按中心时刻生成 MP4 片段并管理临时文件的服务。 */
@Resource
private HikNvrPlaybackClipService playbackClipService;
/**
* 查询指定海康 NVR 通道在时间范围内的录像区间并生成可播放的 RTSP 地址
*
* @param request NVR 登录通道和北京时间范围参数
* @return 录像查询结果及 RTSP 回放地址
*/
@PostMapping("/search")
public ResponseEntity<HikNvrPlaybackResponse> search(
@RequestBody HikNvrPlaybackRequest request) {
// 调用回放服务查询设备录像并构造 RTSP 地址
return ResponseEntity.ok(playbackService.search(request));
}
/**
* 生成中心时刻前后指定秒数的连续录像并作为 MP4 附件流式返回
*
* @param request 设备树所选 cameraCode中心时刻和前后秒数
* @return 带安全文件名和长度的 MP4 下载响应
*/
@PostMapping(
value = "/clips/download",
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = "video/mp4")
public ResponseEntity<StreamingResponseBody> downloadClip(
@RequestBody HikNvrPlaybackClipRequest request) {
// 在提交响应头前完成录像查询SDK下载和MP4封装失败时仍可返回统一JSON错误
HikNvrPlaybackClipFile clipFile =
playbackClipService.createClip(request);
// 下载响应只暴露安全文件名和文件长度不包含NVR账号密码或临时路径
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MP4_MEDIA_TYPE);
headers.setContentLength(clipFile.getContentLength());
headers.set(
HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + clipFile.getDownloadFileName() + "\"");
headers.setCacheControl("no-store");
// 响应写完或客户端断开后由服务在finally中清理临时文件
StreamingResponseBody body =
outputStream -> playbackClipService.writeAndDelete(
clipFile, outputStream);
return ResponseEntity.ok()
.headers(headers)
.body(body);
}
}

+ 47
- 0
src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackExceptionHandler.java View File

@ -0,0 +1,47 @@
package com.inspect.nvr.hik.controller;
import com.inspect.nvr.hik.domain.HikNvrPlaybackErrorResponse;
import com.inspect.nvr.hik.exception.HikNvrPlaybackException;
import com.inspect.nvr.controller.IvsCameraController;
import com.inspect.nvr.controller.IvsServerController;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice(assignableTypes = {
HikNvrPlaybackController.class,
HikNvrPlaybackHlsController.class,
HikNvrPlaybackUiController.class,
HikNvrUiActionController.class,
IvsCameraController.class,
IvsServerController.class
})
public class HikNvrPlaybackExceptionHandler {
@ExceptionHandler(HikNvrPlaybackException.class)
/** 将统一海康/IVS 业务异常转换为 HTTP 错误响应。 */
public ResponseEntity<HikNvrPlaybackErrorResponse> handlePlaybackException(
HikNvrPlaybackException exception) {
// 组装错误码和中文错误消息
HikNvrPlaybackErrorResponse response = HikNvrPlaybackErrorResponse.builder()
.code(exception.getCode())
.message(exception.getMessage())
.build();
// 使用异常携带的 HTTP 状态码返回错误响应
return ResponseEntity.status(exception.getStatus()).body(response);
}
@ExceptionHandler(HttpMessageNotReadableException.class)
/** 将 JSON 反序列化失败转换为统一的 400 响应。 */
public ResponseEntity<HikNvrPlaybackErrorResponse> handleUnreadableRequestBody(
HttpMessageNotReadableException exception) {
// 组装固定的请求体格式错误响应
HikNvrPlaybackErrorResponse response = HikNvrPlaybackErrorResponse.builder()
.code(-1)
.message("请求体格式错误,请检查JSON字段类型和格式")
.build();
// 返回 HTTP 400提示调用方检查 JSON 类型和格式
return ResponseEntity.badRequest().body(response);
}
}

+ 83
- 0
src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackHlsController.java View File

@ -0,0 +1,83 @@
package com.inspect.nvr.hik.controller;
import com.inspect.nvr.hik.domain.HikNvrPlaybackErrorResponse;
import com.inspect.nvr.hik.domain.HikNvrPlaybackHlsControlRequest;
import com.inspect.nvr.hik.domain.HikNvrPlaybackHlsSession;
import com.inspect.nvr.hik.domain.HikNvrPlaybackRequest;
import com.inspect.nvr.hik.service.HikNvrPlaybackHlsService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@CrossOrigin
@RequestMapping("/hik/nvr/playback/hls")
public class HikNvrPlaybackHlsController {
/** HLS 回放会话服务。 */
@Resource
private HikNvrPlaybackHlsService playbackHlsService;
/**
* 创建由海康 SDK 驱动 FFmpeg 输出 HLS 的历史回放会话
*
* @param request NVR通道及录像时间范围参数
* @return HLS 会话标识状态和播放地址
*/
@PostMapping("/sessions")
public ResponseEntity<HikNvrPlaybackHlsSession> create(
@RequestBody HikNvrPlaybackRequest request) {
// 调用 HLS 服务创建受 SDK 控制的回放会话
return ResponseEntity.ok(playbackHlsService.create(request));
}
/**
* 查询指定 HLS 回放会话的当前状态和播放地址
*
* @param sessionId 服务端创建的会话标识
* @return 会话状态及最新的 HLS 地址
*/
@GetMapping("/sessions/{sessionId}")
public ResponseEntity<HikNvrPlaybackHlsSession> get(
@PathVariable("sessionId") String sessionId) {
// 查询指定会话当前状态和最新 HLS 地址
return ResponseEntity.ok(playbackHlsService.get(sessionId));
}
/**
* 对指定 HLS 回放会话执行暂停恢复倍速定位或重新开始等控制动作
*
* @param sessionId 服务端创建的会话标识
* @param request 控制动作及其附加参数
* @return 控制后的会话状态
*/
@PostMapping("/sessions/{sessionId}/controls")
public ResponseEntity<HikNvrPlaybackHlsSession> control(
@PathVariable("sessionId") String sessionId,
@RequestBody HikNvrPlaybackHlsControlRequest request) {
// 将控制动作交给 HLS 会话服务执行
return ResponseEntity.ok(playbackHlsService.control(sessionId, request));
}
/**
* 删除 HLS 回放会话并释放底层 SDKFFmpeg 和注册表资源
*
* @param sessionId 服务端创建的会话标识
* @return 无响应体的成功结果
*/
@DeleteMapping("/sessions/{sessionId}")
public ResponseEntity<Void> delete(
@PathVariable("sessionId") String sessionId) {
// 删除会话并停止 SDK/FFmpeg 资源
playbackHlsService.delete(sessionId);
return ResponseEntity.noContent().build();
}
}

+ 88
- 0
src/main/java/com/inspect/nvr/hik/controller/HikNvrPlaybackUiController.java View File

@ -0,0 +1,88 @@
package com.inspect.nvr.hik.controller;
import com.inspect.nvr.hik.domain.HikNvrCameraTarget;
import com.inspect.nvr.hik.domain.HikNvrPlaybackErrorResponse;
import com.inspect.nvr.hik.domain.HikNvrPlaybackHlsControlRequest;
import com.inspect.nvr.hik.domain.HikNvrPlaybackHlsSession;
import com.inspect.nvr.hik.domain.HikNvrPlaybackRequest;
import com.inspect.nvr.hik.domain.HikNvrPlaybackUiConfig;
import com.inspect.nvr.hik.domain.HikNvrPlaybackUiSessionRequest;
import com.inspect.nvr.hik.service.HikNvrCameraTargetService;
import com.inspect.nvr.hik.service.HikNvrDeviceTreeService;
import com.inspect.nvr.hik.service.HikNvrPlaybackHlsService;
import com.inspect.nvr.hik.service.HikNvrPlaybackRequestFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@CrossOrigin
@RequestMapping("/hik/nvr/playback/hls/ui")
public class HikNvrPlaybackUiController {
/** 浏览器 HLS 回放会话服务。 */
@Resource
private HikNvrPlaybackHlsService playbackHlsService;
/** 从 NVR 表和 ivs_camera 查询并转换浏览器设备树。 */
@Resource
private HikNvrDeviceTreeService deviceTreeService;
/** 根据 cameraCode 查询摄像机并解析所属 NVR、通道和服务端凭据。 */
@Resource
private HikNvrCameraTargetService cameraTargetService;
/** 使用数据库 NVR 参数组装内部回放请求。 */
@Resource
private HikNvrPlaybackRequestFactory playbackRequestFactory;
/**
* NVR 表和 ivs_camera 返回浏览器所需的多 NVR 设备树与默认选择
*
* @return 不包含 NVR 密码的控制台配置
*/
@GetMapping("/config")
public ResponseEntity<HikNvrPlaybackUiConfig> config() {
// 查询全部启用 NVR 及其 ivs_camera 子节点并返回不含账号密码的公开配置
return ResponseEntity.ok(deviceTreeService.loadConfig());
}
/**
* 根据页面提交的 cameraCode 和时间范围创建 HLS 回放会话
*
* @param request 页面侧回放请求不包含后端固定保存的 NVR 密码
* @return 新建的 HLS 回放会话信息
*/
@PostMapping("/sessions")
public ResponseEntity<HikNvrPlaybackHlsSession> create(
@RequestBody HikNvrPlaybackUiSessionRequest request) {
// 只接受设备树返回的完整 cameraCode并从数据库解析真实 NVR 与通道
HikNvrCameraTarget cameraTarget = cameraTargetService.resolve(
request == null ? null : request.getCameraCode());
// 使用 cameraCode 解析结果和已校验页面条件组装内部 SDK 请求
HikNvrPlaybackRequest playbackRequest =
playbackRequestFactory.create(request, cameraTarget);
// 使用已绑定 cameraCode通道和 NVR 凭据的请求创建回放会话
return ResponseEntity.ok(playbackHlsService.create(playbackRequest));
}
/**
* 使用 cameraCode 校验并控制页面创建的 HLS 回放会话
*
* @param sessionId 页面当前持有的回放会话标识
* @param request cameraCode暂停/恢复等控制动作及附加参数
* @return 控制后的会话状态
*/
@PostMapping("/sessions/{sessionId}/controls")
public ResponseEntity<HikNvrPlaybackHlsSession> control(
@PathVariable("sessionId") String sessionId,
@RequestBody HikNvrPlaybackHlsControlRequest request) {
// UI 控制强制同时校验 sessionId cameraCode防止旧页面状态控制到其他摄像机
return ResponseEntity.ok(
playbackHlsService.controlByCameraCode(sessionId, request));
}
}

+ 165
- 0
src/main/java/com/inspect/nvr/hik/controller/HikNvrUiActionController.java View File

@ -0,0 +1,165 @@
package com.inspect.nvr.hik.controller;
import com.inspect.nvr.hik.domain.HikNvrLiveStreamResponse;
import com.inspect.nvr.hik.domain.HikNvrPlaybackErrorResponse;
import com.inspect.nvr.hik.domain.HikNvrPresetListResponse;
import com.inspect.nvr.hik.domain.HikNvrUiActionRequest;
import com.inspect.nvr.hik.domain.HikNvrUiActionResponse;
import com.inspect.nvr.hik.exception.HikNvrPlaybackException;
import com.inspect.nvr.hik.service.HikNvrCredentialService;
import com.inspect.nvr.hik.service.HikNvrLiveStreamService;
import com.inspect.nvr.hik.service.HikNvrUiActionService;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@CrossOrigin
@RequestMapping("/hik/nvr/playback/hls/ui/actions")
public class HikNvrUiActionController {
/** 海康云台、预置位和抓图操作服务。 */
@Resource
private HikNvrUiActionService actionService;
/** 海康实时拉流服务。 */
@Resource
private HikNvrLiveStreamService liveStreamService;
/** 按页面选择的 NVR IP 从数据库读取服务端凭据。 */
@Resource
private HikNvrCredentialService credentialService;
/**
* 接收海康 NVR 云台控制指令
*/
@PostMapping("/ptz")
/** 代理海康云台动作请求。 */
public ResponseEntity<HikNvrUiActionResponse> ptz(@RequestBody HikNvrUiActionRequest request) {
// 绑定页面所选 NVR 后执行云台动作避免相同通道号被发送到默认设备
return ResponseEntity.ok(actionServiceFor(request).ptz(request));
}
/**
* 调用指定通道的海康预置位
*/
@PostMapping("/preset")
/** 代理海康预置位调用请求。 */
public ResponseEntity<HikNvrUiActionResponse> preset(@RequestBody HikNvrUiActionRequest request) {
// 绑定页面所选 NVR 后执行预置位
return ResponseEntity.ok(actionServiceFor(request).preset(request));
}
/**
* 保存当前云台位置为指定的海康预置位
*/
@PostMapping("/preset/create")
/** 代理海康预置位保存请求。 */
public ResponseEntity<HikNvrUiActionResponse> createPreset(@RequestBody HikNvrUiActionRequest request) {
// 绑定页面所选 NVR 后保存当前位置并写入预置位名称
return ResponseEntity.ok(actionServiceFor(request).createPreset(request));
}
/**
* 读取指定通道的海康预置位列表
*/
@GetMapping("/presets")
public ResponseEntity<HikNvrPresetListResponse> listPresets(
@RequestParam("channel") Integer channel,
@RequestParam("nvrIp") String nvrIp) {
// 创建内部请求对象并读取 NVR 当前预置位列表
HikNvrUiActionRequest request = new HikNvrUiActionRequest();
request.setNvrIp(nvrIp);
request.setChannel(channel);
// 绑定页面所选 NVR 后委托海康 ISAPI 列表读取能力
return ResponseEntity.ok(actionServiceFor(request).listPresets(request));
}
/**
* 抓取海康 NVR 当前通道的 JPEG 图片
*/
@PostMapping(value = "/snapshot", produces = MediaType.IMAGE_JPEG_VALUE)
/** 代理海康 JPEG 抓图请求。 */
public ResponseEntity<byte[]> snapshot(@RequestBody HikNvrUiActionRequest request) {
// 绑定页面所选 NVR 后调用海康抓图服务获取 JPEG 字节
byte[] image = actionServiceFor(request).snapshot(request);
// 从请求中提取通道号用于响应文件名和响应头
int channel = request == null || request.getChannel() == null ? 0 : request.getChannel();
String filename = "nvr-ch" + channel + "-" + System.currentTimeMillis() + ".jpg";
return ResponseEntity.ok()
.contentType(MediaType.IMAGE_JPEG)
.contentLength(image.length)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"")
.header("X-Capture-Channel", String.valueOf(channel))
.body(image);
}
/**
* 启动指定通道的实时拉流任务
*/
@PostMapping("/live/start")
/** 代理实时拉流启动请求。 */
public ResponseEntity<HikNvrLiveStreamResponse> startLive(@RequestBody HikNvrUiActionRequest request) {
// 从页面请求提取设备树完整 cameraCode 和可选码流类型
String cameraCode = request == null ? null : request.getCameraCode();
Integer streamType = request == null ? null : request.getStreamType();
// 实时服务通过现有 IVS 媒体接口解析 cameraCode 并取得 RTSP 源地址
return ResponseEntity.ok(liveStreamService.start(cameraCode, streamType));
}
/**
* 停止指定通道的实时拉流任务
*/
@PostMapping("/live/stop")
/** 代理实时拉流停止请求。 */
public ResponseEntity<HikNvrLiveStreamResponse> stopLive(@RequestBody HikNvrUiActionRequest request) {
// 从页面请求提取要停止的完整 cameraCode
String cameraCode = request == null ? null : request.getCameraCode();
// 只停止该 cameraCode 对应的流不影响设备树中的其他摄像机
return ResponseEntity.ok(liveStreamService.stop(cameraCode));
}
/**
* 查询指定通道的实时拉流状态
*/
@GetMapping("/live/status")
public ResponseEntity<HikNvrLiveStreamResponse> liveStatus(
@RequestParam("cameraCode") String cameraCode) {
// 按设备树完整 cameraCode 查询唯一实时拉流状态
return ResponseEntity.ok(liveStreamService.status(cameraCode));
}
/**
* 为页面请求绑定数据库中已启用的目标 NVR
*
* @param request 页面操作请求必须包含所选 NVR IP
* @return 绑定数据库目标 NVR 的海康操作服务
*/
private HikNvrUiActionService actionServiceFor(HikNvrUiActionRequest request) {
// NVR 环境必须明确目标 IP禁止按固定配置或隐式默认设备执行控制
if (request == null || !hasText(request.getNvrIp())) {
throw HikNvrPlaybackException.badRequest("NVR IP不能为空");
}
// 只允许绑定数据库中已启用的 NVR页面无法直接提供账号密码
return actionService.forNvr(
credentialService.resolveByIp(request.getNvrIp().trim()));
}
/**
* 判断页面提交的 NVR IP 是否包含有效文本
*
* @param value 待检查文本
* @return 非空且不全为空白时返回 true
*/
private boolean hasText(String value) {
// 空文本不能定位数据库 NVR
return value != null && !value.trim().isEmpty();
}
}

+ 64
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrCameraTarget.java View File

@ -0,0 +1,64 @@
package com.inspect.nvr.hik.domain;
import com.inspect.nvr.domain.Infrared.NvrInfo;
/**
* IVS 完整摄像机编码解析出的海康 NVR 回放目标
*
* <p>浏览器只提交 {@code cameraCode}NVR 地址端口账号密码和通道号
* 均由服务端根据 {@code ivs_camera} {@code basedata_eqpbook_nvr} 解析</p>
*/
public class HikNvrCameraTarget {
/** 已校验并去除首尾空白的 IVS 完整摄像机编码。 */
private final String cameraCode;
/** 从完整摄像机编码中解析出的页面逻辑通道号。 */
private final Integer channel;
/** 从数据库读取且包含完整服务端凭据的所属 NVR。 */
private final NvrInfo nvrInfo;
/**
* 保存一次 cameraCode 解析得到的摄像机通道和 NVR 结果
*
* @param cameraCode IVS 完整摄像机编码
* @param channel 解析出的页面逻辑通道号
* @param nvrInfo 摄像机所属 NVR 的数据库连接信息
*/
public HikNvrCameraTarget(
String cameraCode,
Integer channel,
NvrInfo nvrInfo) {
this.cameraCode = cameraCode;
this.channel = channel;
this.nvrInfo = nvrInfo;
}
/**
* 返回已校验的 IVS 完整摄像机编码
*
* @return 完整 cameraCode
*/
public String getCameraCode() {
return cameraCode;
}
/**
* 返回海康回放使用的页面逻辑通道号
*
* @return 正整数通道号
*/
public Integer getChannel() {
return channel;
}
/**
* 返回摄像机所属 NVR 的数据库连接信息
*
* @return 仅在服务端使用的 NVR 参数
*/
public NvrInfo getNvrInfo() {
return nvrInfo;
}
}

+ 40
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrLiveStreamResponse.java View File

@ -0,0 +1,40 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrLiveStreamResponse {
/** 实时流绑定的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 实时流所属 NVR IP。 */
private String nvrIp;
/** 页面逻辑通道号。 */
private Integer channel;
/** 码流类型。 */
private Integer streamType;
/** 流标识。 */
private String streamId;
/** 会话状态。 */
private String status;
/** HLS 播放地址。 */
private String hlsUrl;
/** HTTP-FLV 播放地址。 */
private String flvUrl;
/** 状态说明。 */
private String message;
}

+ 31
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackClipRequest.java View File

@ -0,0 +1,31 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 按中心时刻生成海康 NVR 录像下载片段的请求
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackClipRequest {
/** 设备树当前选中的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 下载录像使用的码流类型,默认使用主码流。 */
private Integer streamType;
/** 下载片段的中心时刻,固定按北京时间解释。 */
private String centerTime;
/** 中心时刻之前截取的秒数,默认 30 秒。 */
private Integer beforeSeconds;
/** 中心时刻之后截取的秒数,默认 30 秒。 */
private Integer afterSeconds;
}

+ 19
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackErrorResponse.java View File

@ -0,0 +1,19 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackErrorResponse {
/** 参数错误或海康 SDK 错误码。 */
private int code;
/** 中文错误说明。 */
private String message;
}

+ 15
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlAction.java View File

@ -0,0 +1,15 @@
package com.inspect.nvr.hik.domain;
public enum HikNvrPlaybackHlsControlAction {
/** 暂停回放。 */
PAUSE,
/** 恢复回放。 */
RESUME,
/** 设置原生倍速。 */
SET_SPEED,
/** 跳转到指定时间。 */
SEEK,
/** 停止会话。 */
STOP
}

+ 31
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsControlRequest.java View File

@ -0,0 +1,31 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackHlsControlRequest {
/** UI 设备树选中的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 回放控制动作。 */
private HikNvrPlaybackHlsControlAction action;
/** 回放倍速,仅 SET_SPEED 使用。 */
private Integer speed;
/** 跳转时间,仅 SEEK 使用。 */
private String seekTime;
/** 判断倍速是否为海康原生支持的 1、2、4、8 倍速。 */
public static boolean isSupportedSpeed(Integer speed) {
// 只接受海康原生支持的 1248 倍速
return speed != null && (speed == 1 || speed == 2 || speed == 4 || speed == 8);
}
}

+ 39
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsSession.java View File

@ -0,0 +1,39 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackHlsSession {
/** 当前回放会话绑定的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 服务端生成的回放会话标识。 */
private String sessionId;
/** HLS 回放会话状态。 */
private HikNvrPlaybackHlsStatus status;
/** 浏览器使用的 HLS 播放地址。 */
private String hlsUrl;
/** HLS 流代次。 */
private int generation;
/** 当前海康 NVR 原生回放倍速。 */
private int speed;
/** 实际连续录像起止时间。 */
private List<String> actualTimeRange;
/** 最近视频帧携带的当前回放时间。 */
private String currentTime;
}

+ 15
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackHlsStatus.java View File

@ -0,0 +1,15 @@
package com.inspect.nvr.hik.domain;
public enum HikNvrPlaybackHlsStatus {
/** 会话已创建,等待首个 HLS 切片。 */
STARTING,
/** HLS 已可播放。 */
PLAYING,
/** 回放已暂停。 */
PAUSED,
/** 会话已停止。 */
STOPPED,
/** 媒体链路失败。 */
FAILED
}

+ 21
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRecord.java View File

@ -0,0 +1,21 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackRecord {
/** 实际录像起止时间。 */
private List<String> timeRange;
/** 包含设备登录信息的 RTSP 历史回放地址。 */
private String rtspUrl;
}

+ 43
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackRequest.java View File

@ -0,0 +1,43 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackRequest {
/** UI 回放目标对应的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 海康 NVR IP 地址。 */
private String nvrIp;
/** 海康 SDK 服务端口。 */
private Integer sdkPort;
/** RTSP 服务端口。 */
private Integer rtspPort;
/** 页面逻辑或海康 SDK 实际通道号。 */
private Integer channel;
/** 码流类型,1 为主码流,2 为子码流。 */
private Integer streamType;
/** NVR 登录账号。 */
private String username;
/** NVR 登录密码,只允许写入。 */
private String password;
/** 查询开始时间,按北京时间解释。 */
private String startTime;
/** 查询结束时间,按北京时间解释。 */
private String endTime;
}

+ 44
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackResponse.java View File

@ -0,0 +1,44 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackResponse {
/** 结果编码,0 表示查询成功。 */
private int code;
/** 结果说明。 */
private String message;
/** 查询范围内是否存在录像。 */
private boolean hasRecord;
/** 实际连续录像区间列表。 */
private List<HikNvrPlaybackRecord> records;
/** 使用录像列表创建统一成功响应。 */
public static HikNvrPlaybackResponse success(List<HikNvrPlaybackRecord> records) {
// 将空结果转换为空列表避免响应中出现 null
List<HikNvrPlaybackRecord> safeRecords = records == null
? Collections.emptyList()
: new ArrayList<>(records);
// 组装统一的成功回放响应
return HikNvrPlaybackResponse.builder()
.code(0)
.message("success")
.hasRecord(!safeRecords.isEmpty())
.records(safeRecords)
.build();
}
}

+ 97
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java View File

@ -0,0 +1,97 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackUiConfig {
/** 设备显示名称。 */
private String deviceName;
/** 页面使用的固定时区。 */
private String timezone;
/** 后端是否配置完整。 */
private boolean configured;
/** 页面展示的 NVR IP。 */
private String nvrIp;
/** 页面默认选中的 NVR IP。 */
private String defaultNvrIp;
/** 默认通道号。 */
private Integer defaultChannel;
/** 页面默认选中的 IVS 完整摄像机编码。 */
private String defaultCameraCode;
/** 页面设备树中的可选通道。 */
private List<Channel> channels;
/** 页面设备树中的 NVR 节点及其摄像机子节点。 */
private List<Nvr> nvrs;
/**
* 设备树中的非敏感 NVR 节点
*
* <p>账号和密码只在服务端使用本对象只返回设备标识名称IP 和摄像机列表</p>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Nvr {
/** NVR 数据库主键。 */
private Long nvrId;
/** NVR 页面显示名称。 */
private String name;
/** NVR IP 地址。 */
private String nvrIp;
/** 该 NVR 是否具备完整的服务端连接参数。 */
private boolean configured;
/** 当前 NVR 下从 ivs_camera 读取的摄像机通道。 */
private List<Channel> channels;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Channel {
/** IVS 摄像机完整编码,是页面请求设备能力时使用的唯一摄像机标识。 */
private String cameraCode;
/** SDK 通道号。 */
private Integer channel;
/** 所属 NVR 数据库主键。 */
private Long nvrId;
/** 所属 NVR IP,仅用于页面展示和兼容旧视图,不作为设备能力请求标识。 */
private String nvrIp;
/** 所属 NVR 页面显示名称。 */
private String nvrName;
/** 通道显示名称。 */
private String name;
/** 设备分组名称。 */
private String group;
}
}

+ 25
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiSessionRequest.java View File

@ -0,0 +1,25 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPlaybackUiSessionRequest {
/** 页面设备树当前选中的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 页面请求的码流类型。 */
private Integer streamType;
/** 北京时间开始时间。 */
private String startTime;
/** 北京时间结束时间。 */
private String endTime;
}

+ 47
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPresetListResponse.java View File

@ -0,0 +1,47 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrPresetListResponse {
/** 页面逻辑通道号。 */
private Integer channel;
/** 海康 SDK 通道号。 */
private Integer sdkChannel;
/** 预置位数量。 */
private Integer count;
/** 列表读取说明。 */
private String message;
@Builder.Default
/** 设备返回的预置位列表。 */
private List<Preset> presets = new ArrayList<>();
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Preset {
/** 预置位编号。 */
private Integer id;
/** 预置位名称。 */
private String name;
/** 是否启用。 */
private Boolean enabled;
}
}

+ 15
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrPtzMode.java View File

@ -0,0 +1,15 @@
package com.inspect.nvr.hik.domain;
/**
* 海康云台方向动作的执行模式
*
* <p>IVS controlPara1 会在适配层转换成该模式浏览器侧原有云台接口默认使用连续模式</p>
*/
public enum HikNvrPtzMode {
/** 发送开始指令后,经过默认点动时长自动发送停止指令。 */
POINT,
/** 只发送开始指令,直到调用停止指令才结束运动。 */
CONTINUOUS
}

+ 40
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrUiActionRequest.java View File

@ -0,0 +1,40 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 浏览器安全的 NVR 操作请求设备账号密码始终由服务端数据库提供浏览器不会传递
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrUiActionRequest {
/** 实时预览请求使用的 IVS 完整摄像机编码。 */
private String cameraCode;
/** 页面设备树当前选中的 NVR IP。 */
private String nvrIp;
/** 页面逻辑通道号,从 1 开始。 */
private Integer channel;
/** 云台动作名称。 */
private String action;
/** 云台动作速度。 */
private Integer speed;
/** 预置位编号。 */
private Integer preset;
/** 新增预置位名称。 */
private String presetName;
/** 实时预览码流类型。 */
private Integer streamType;
}

+ 22
- 0
src/main/java/com/inspect/nvr/hik/domain/HikNvrUiActionResponse.java View File

@ -0,0 +1,22 @@
package com.inspect.nvr.hik.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class HikNvrUiActionResponse {
/** 是否执行成功。 */
private boolean success;
/** 操作说明。 */
private String message;
/** 海康 SDK 实际通道号。 */
private Integer sdkChannel;
}

+ 78
- 0
src/main/java/com/inspect/nvr/hik/exception/HikNvrPlaybackException.java View File

@ -0,0 +1,78 @@
package com.inspect.nvr.hik.exception;
import org.springframework.http.HttpStatus;
public class HikNvrPlaybackException extends RuntimeException {
/** 对外返回的业务或 SDK 错误码。 */
private final int code;
/** 对应的 HTTP 响应状态。 */
private final HttpStatus status;
private HikNvrPlaybackException(
int code,
HttpStatus status,
String message,
Throwable cause) {
super(message, cause);
this.code = code;
this.status = status;
}
/** 创建参数错误异常。 */
public static HikNvrPlaybackException badRequest(String message) {
// 创建 HTTP 400 参数错误
return new HikNvrPlaybackException(-1, HttpStatus.BAD_REQUEST, message, null);
}
/** 创建不带原始原因的 SDK/设备错误异常。 */
public static HikNvrPlaybackException sdkFailure(int code, String message) {
// 创建 HTTP 502 厂商 SDK/设备调用错误
return new HikNvrPlaybackException(code, HttpStatus.BAD_GATEWAY, message, null);
}
/** 创建带原始原因的 SDK/设备错误异常。 */
public static HikNvrPlaybackException sdkFailure(
int code,
String message,
Throwable cause) {
// 创建带原始异常原因的 HTTP 502 设备错误
return new HikNvrPlaybackException(code, HttpStatus.BAD_GATEWAY, message, cause);
}
/** 创建带原始原因的媒体链路错误异常。 */
public static HikNvrPlaybackException mediaFailure(String message, Throwable cause) {
// 创建 HTTP 503 媒体链路错误
return new HikNvrPlaybackException(-3, HttpStatus.SERVICE_UNAVAILABLE, message, cause);
}
/** 创建不带原始原因的媒体链路错误异常。 */
public static HikNvrPlaybackException mediaFailure(String message) {
// 创建不带原始异常的 HTTP 503 媒体错误
return new HikNvrPlaybackException(-3, HttpStatus.SERVICE_UNAVAILABLE, message, null);
}
/** 创建资源不存在异常。 */
public static HikNvrPlaybackException notFound(String message) {
// 创建 HTTP 404 资源不存在错误
return new HikNvrPlaybackException(-4, HttpStatus.NOT_FOUND, message, null);
}
/** 创建状态冲突异常。 */
public static HikNvrPlaybackException conflict(String message) {
// 创建 HTTP 409 状态冲突错误
return new HikNvrPlaybackException(-5, HttpStatus.CONFLICT, message, null);
}
/** 返回业务错误码。 */
public int getCode() {
// 返回业务错误码
return code;
}
/** 返回 HTTP 状态。 */
public HttpStatus getStatus() {
// 返回 HTTP 状态码
return status;
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save