OrangePi3588Media/PRD_01_Device_MediaServer_RemoteMgmt.md
sladro acd3815288
Some checks are pending
CI / host-build (push) Waiting to run
CI / rk3588-cross-build (push) Waiting to run
性能优化
2026-01-12 15:27:38 +08:00

10 KiB
Raw Blame History

PRD ① 设备端rk3588-agent + media-server远程管理能力V1

1. 背景

当前 media-server 已提供 HTTP 控制台与配置热更新能力(/api/*/api/config/reload/api/config/rollback 等)。由于 大文件模型上传 在现有 C++ 自研 HTTP Server 上实现成本较高(需要流式接收/写盘/校验/限流),本期采用更工程化的拆分:

  • media-server:继续专注业务图(推理/推流/报警)与热更新。
  • rk3588-agentGo 新增常驻进程对外提供局域网管理面能力UDP 发现、模型/配置上传落盘、触发 media-server reload/rollback、代理读取 graphs/logs。

本 PRD 覆盖“轻量热更新/重载/回滚业务图级”。systemd/重启系统等运维级操作可作为后续扩展,但不作为 V1 验收项。

2. 目标

  1. 管理端可通过 UDP 广播在 1 秒内发现同网段 10 台设备(由 rk3588-agent 响应)。
  2. 管理端可通过 rk3588-agent 上传配置 JSON设备端原子写入后触发 media-server reload 生效。
  3. 管理端可通过 rk3588-agent 上传模型文件到设备固定目录,并返回可直接在配置中引用的 model_path
  4. 所有对外写操作必须鉴权Token读操作默认可不鉴权可配置

3. 非目标V1 不做)

  • systemd start/stop/restart media-server(可在 agent 后续扩展)
  • 设备重启/固件升级/插件升级
  • 跨网段发现(保留后端可做网段扫描 fallback
  • 完整 RBAC/用户体系

4. 现状可复用能力(不修改语义)

  • HTTP Serversrc/http_server.cpp
  • Graph/热更新:GraphManager::ReloadFromFileGraphManager::RollbackFromLastGood
  • 配置 Expand + Validateutils/config_expand.*utils/config_schema.h
  • 运行状态:GET /api/graphsGET /api/graphs/{name}GET /api/logs/recent

5. 新增功能范围V1

5.1 新增进程rk3588-agentGo

rk3588-agent 作为常驻服务,提供:

  • UDP 广播发现Option A对管理端 Search 做响应。
  • HTTP 管理 API对外模型上传、配置下发、触发 reload/rollback、代理 graphs/logs。
  • 本地调用 media-server:通过 http://127.0.0.1:<media_port>/api/... 触发 reload/rollback/读取 graphs/logs。

5.1.1 agent 代码目录结构(建议,开发可直接照此建工程)

建议以 Go module 形式独立工程(可放在同仓库 agent/ 目录,也可独立仓库)。

agent/
  go.mod
  cmd/
    rk3588-agent/
      main.go
  internal/
    config/            # 读取/校验 /etc/rk3588-agent/config.json
    discovery/         # UDP 35688 discover responder
    httpapi/           # 对外 HTTP 路由:/v1/* + auth
    mediaserver/       # 对内 HTTP client调用 127.0.0.1:9000/api/*
    modelstore/        # 模型落盘/sha256/manifest
    files/             # 原子写盘tmp+rename、权限校验
    sysinfo/           # hostname/ip/uptime/device_id
    log/               # 统一日志封装stdout/journald

5.2 media-server 变更范围V1

V1 目标是将大文件上传从 media-server 移出,因此 media-server 可不新增大文件上传接口。仅要求:

  • 保持现有 /api/config/reload/api/config/rollback/api/graphs/api/logs/recent 等接口可用。
  • (可选安全加固,非 V1 必须)限制 media-server HTTP 仅监听 127.0.0.1 或对写接口增加 Token 鉴权。

6. 配置与落盘约定

6.1 新增 agent 配置项(建议)

agent 需要独立配置(例如 /etc/rk3588-agent/config.json)。建议:

{
  "agent": {
    "listen": "0.0.0.0:9100",
    "token": "CHANGE_ME",
    "require_token_for_read": false,
    "discovery_enable": true,
    "discovery_port": 35688,
    "device_name": "rk3588-cam-01",
    "device_id_path": "/var/lib/rk3588-agent/device_id",
    "models_dir": "/opt/rk3588sys/models",
    "max_upload_mb": 200,
    "config_path": "/etc/rk3588sys/config.json",
    "media_server_base_url": "http://127.0.0.1:9000",
    "media_server_timeout_ms": 3000,
    "media_server_retry": { "max_attempts": 3, "backoff_ms": [200, 500] }
  }
}

字段说明V1 关键字段):

  • config_pathagent 写入配置文件的目标路径(与 media-server --config 一致)。
  • device_id_pathdevice_id 持久化文件路径(不存在则自动生成并写入)。
  • media_server_base_urlagent 调用 media-server 的本机地址,建议固定 127.0.0.1
  • media_server_timeout_msagent 调用 media-server 的 HTTP 总超时。
  • media_server_retry仅对“控制类请求”reload/rollback启用的重试策略。

6.2 设备侧文件系统布局(部署约定)

为保证权限与可维护性,约定如下路径:

  • 可执行文件:
    • /opt/rk3588sys/bin/media-server
    • /opt/rk3588sys/agent/rk3588-agent
  • 配置文件:
    • /etc/rk3588sys/config.jsonmedia-server --config 指向)
    • /etc/rk3588-agent/config.json
  • 状态/持久化:
    • /var/lib/rk3588-agent/device_id
  • 模型仓库:
    • /opt/rk3588sys/models/manifest.json
    • /opt/rk3588sys/models/files/*.rknn

说明:如不希望以 root 运行,可将 config_path 改到 /opt/rk3588sys/config/config.json 并给 agent 用户写权限V1 为减少权限复杂度,建议 agent 以 root 运行。

6.3 systemd service部署字段开发/运维可直接照抄)

6.3.1 rk3588-agent.service

路径建议:/etc/systemd/system/rk3588-agent.service

[Unit]
Description=RK3588Sys Agent
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
ExecStart=/opt/rk3588sys/agent/rk3588-agent --config /etc/rk3588-agent/config.json
Restart=always
RestartSec=2
WorkingDirectory=/
LimitNOFILE=65535

# 可选:基础加固(需要确认路径)
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=full
ReadWritePaths=/etc/rk3588sys /etc/rk3588-agent /opt/rk3588sys/models /var/lib/rk3588-agent

[Install]
WantedBy=multi-user.target

6.3.2 media-server.service建议统一纳入部署约定

路径建议:/etc/systemd/system/media-server.service

[Unit]
Description=RK3588Sys Media Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
ExecStart=/opt/rk3588sys/bin/media-server --config /etc/rk3588sys/config.json
Restart=always
RestartSec=2
LimitNOFILE=65535

# (可选)性能调参:多路推理并发 / RGA 并发
Environment=RK3588_RKNN_CTX_POOL_SIZE=3
Environment=RK3588_RGA_MAX_INFLIGHT=2

[Install]
WantedBy=multi-user.target

V1 不要求 agent 控制 systemd但要求两服务可开机自启。

6.5 性能调参说明(新增)

  • RK3588_RKNN_CTX_POOL_SIZE:同一模型的 RKNN context 池大小(默认 3
  • RK3588_RGA_MAX_INFLIGHTRGA 全局并发上限(默认 2

6.4 模型目录结构

  • ${models_dir}/manifest.json
  • ${models_dir}/files/<name>__<sha256>.<ext>ext 默认 rknn,白名单控制)

7. 约束与安全

  • agent 对外写接口必须 X-RK-Token
  • 上传限制:必须 Content-Length;大小不得超过 max_upload_mb
  • agent 写盘采用原子写(临时文件 + rename
  • agent 与 media-server 的本地通信固定走 127.0.0.1(避免暴露内部控制面)。

7.1 agent 内部调用 media-server 的 URL/超时/重试策略

agent 只调用 media-server 的既有接口(对内 base URL = media_server_base_url

  • ReloadPOST {base}/api/config/reload
  • RollbackPOST {base}/api/config/rollback
  • GraphsGET {base}/api/graphs
  • Graph detailGET {base}/api/graphs/{name}
  • LogsGET {base}/api/logs/recent?limit=...

超时策略(建议默认值):

  • 读接口graphs/logs总超时 1000ms(不重试)
  • 控制接口reload/rollback总超时 media_server_timeout_ms(默认 3000ms),允许重试

重试策略(仅控制接口):

  • max_attempts = 3(首次 + 2 次重试)
  • 触发条件:连接失败/超时/5xx不对 4xx 重试)
  • backoff[200ms, 500ms]

配置下发联动策略(PUT /v1/config

  1. agent 原子写入 config_path
  2. 调用 reload按控制接口重试策略
  3. 若 reload 最终失败:调用 rollback按控制接口重试策略
  4. 返回 500错误消息包含 reload 与 rollback 的结果(便于定位)

7.2 启动顺序与可用性

  • 建议 systemd 启动顺序:两者都 After network-online。
  • agent 对外可先起来;当 media-server 尚未启动时:
    • /v1/graphs/v1/logs/recent 返回 500error=connect refused/timeout
    • /v1/config 返回 500写盘可成功但 reload 失败会触发 rollback错误信息提示 media-server 不可用)

8. 验收标准Acceptance Criteria

  1. 同网段 10 台设备,管理端 SearchUDP broadcast在 1 秒内都能发现;列表包含 device_id/ip/agent_port/media_port/version/git_sha
  2. agent PUT /v1/config
    • 发送合法 config设备写盘并触发 media-server reload 成功graphs 状态正常。
    • 发送非法 configagent 返回 400或 reload 失败则 agent 自动 rollback 并返回 500错误信息可定位
  3. agent PUT /v1/models/{name}:上传成功返回 sha256/path在配置中引用该 path 并 reload 后,相关节点能正常 Init以日志/metrics 验证)。
  4. 无 token 调用写接口返回 401错误返回 JSON{"error":"..."}

9. 开发任务拆分(建议)

  • 新增 rk3588-agentHTTP 服务 + Token 鉴权 + 日志
  • UDP discovery协议解析/回复、device_id 获取与持久化、停止逻辑
  • GET /v1/info:聚合 device/version/git_sha/ports/uptime
  • PUT /v1/config:原子写盘 + 触发 media-server reload失败自动 rollback
  • PUT /v1/models/{name}:流式落盘 + sha256 + manifest 写入
  • GET /v1/models:读取 manifest
  • 代理接口graphs、graph detail、logs recent、reload、rollback
  • 统一错误码与日志(见接口清单表)