Files
2026-08-13 13:38:25 +08:00

23 KiB
Raw Permalink Blame History

PGU5-Core API

本文档对应 PGU5-Core v2.1.1,以 pgu5a_base.py 中的实际路由为准。

基本约定

项目 说明
设备地址 http://192.168.101.172:8080
本机地址 http://127.0.0.1:8080
JSON 编码 UTF-8
POST 编码 application/x-www-form-urlencoded
缓存 动态页面、JSON 和预览帧均返回禁止缓存响应头
鉴权 管理 API 本身没有登录层,应只在可信管理网络中开放

大多数 JSON 接口即使业务失败也返回 HTTP 200,调用方必须检查响应中的 ok。文件预览、原始文件和 ZIP 下载接口会按错误情况返回 HTTP 4xx。预览帧暂时不可用时返回 HTTP 204。

通用 JSON 成功响应:

{
  "ok": true,
  "message": "operation completed"
}

通用 JSON 失败响应:

{
  "ok": false,
  "message": "failure reason"
}

接口总览

GET

路径 用途
/api/status 运行状态、相机状态、FPS、保存队列和自动休眠
/api/system/version 应用版本、Git 诊断信息和设备序列号
/api/storage 存储总量、已用/剩余空间和自动清理状态
/api/network AP、STA、以太网、Syncthing 和 HS 状态
/api/network/headscale/task HS 后台任务进度
/api/syncthing/identity-init/status Syncthing 身份初始化进度
/api/ota/status OTA 当前状态
/api/m3/control M3/L640 热成像 USB 控制状态
/api/ms602/detection MS602 抖动、撕裂、帧率检测参数和六通道诊断
/api/ssh/read 读取 Web SSH PTY 输出
/api/config 读取当前 JSON 配置文本
/api/logs 获取内存运行日志
/api/files 分页列出保存目录
/api/files/preview 获取图像预览
/api/files/raw 获取原始文件
/api/schedule 获取定时保存配置
/frame/ms602/{band}.jpg MS602 单波段预览
/frame/m3lite.jpg M3Lite 预览
/frame/dcl.jpg DCL 预览
/frame/uvc_rgb.jpg UVC-RGB 预览
/assets/logo.png 产品 Logo
/assets/xterm.js Web SSH 终端脚本,按需加载
/assets/xterm.css Web SSH 终端样式,按需加载
/assets/xterm.LICENSE xterm.js 许可证文本

POST

路径 用途
/api/save/{target} 立即保存指定目标
/api/save 兼容形式的立即保存
/api/schedule 修改定时保存
/api/storage/cleanup 修改自动清理配置并执行空间检查
/api/files/delete 后台永久删除文件或目录
/api/files/download 打包下载文件或目录
/api/sensors/power 唤醒或休眠传感器
/api/sensors/auto_sleep 设置自动休眠时间
/api/m3/auto_nuc 设置并保存自动 NUC
/api/ms602/detection 保存并立即应用 MS602 抖动、撕裂、帧率检测参数
/api/network/scan 扫描 Wi-Fi
/api/network/ap 修改 AP
/api/network/sta/connect 连接 STA
/api/network/sta/disconnect 断开 STA
/api/network/headscale/install 安装 HS 组件
/api/network/headscale/uninstall 卸载 HS 组件
/api/network/headscale/login 登录 Headscale
/api/network/headscale/logout 退出 Headscale
/api/syncthing/identity-init/start 重新生成 Syncthing 设备身份
/api/ssh/open 打开 Web SSH 会话
/api/ssh/input 写入 Web SSH PTY
/api/ssh/close 关闭 Web SSH 会话
/api/config/save 保存 JSON 配置并重启服务
/api/system/update/check 检查 Gitea Release
/api/system/update/apply 应用 OTA 标签
/api/service/restart 重启主服务
/api/system/reboot 重启系统
/api/system/shutdown 同步磁盘并关机

状态与版本

GET /api/status

返回当前运行快照。主要字段:

字段 说明
app_version APP_VERSION
server_time / server_time_text 设备时间
save_root 保存根目录
message 最近一条运行消息
logs 有界内存日志
sensor_power.awake 传感器是否处于唤醒状态
sensor_power.auto_sleep 自动休眠配置、倒计时和暂停状态
schedule 定时保存开关与间隔
save_queue 保存队列占用情况
refresh 前端刷新周期
preview_cache_ts 各预览缓存更新时间
stats.capture 采集 FPS
stats.preview 预览编码 FPS
stats.request 页面请求 FPS
ms602 MS602 总体状态
ms602_channels 六通道状态和恢复诊断
m3lite / dcl / uvc_rgb 各相机状态
m3_control 热成像控制状态
dcl_frame / uvc_rgb_frame 原始帧尺寸

ms602_channels 的键为 480、550、660、720、840、rgb。每个通道包含:

{
  "status": "CONNECTED",
  "message": "Connected: /dev/video12",
  "device_index": 12,
  "restart_count": 0,
  "jitter_count": 0,
  "jitter_reversals": 0,
  "jitter_cancellation": 1.0,
  "jitter_total_shift": 0.0,
  "last_shift_x": 0.01,
  "last_shift_y": -0.02,
  "updated_at": 1785835208.1
}

GET /api/system/version

界面显示版本来自应用常量,不由 Git 自动覆盖。

字段 说明
version 当前发布标签
app_version APP_VERSION
release_tag APP_RELEASE_TAG
current_version 当前应用版本
current_tag 当前发布标签
git_tag git describe 诊断值
commit 短提交号
branch 当前分支
dirty 工作区是否有未提交改动
serial PGU5A- 加以太网 MAC

GET /api/logs

返回:

{
  "logs": [
    {
      "time": 1785835208.1,
      "time_text": "2026-08-04 17:20:08",
      "message": "Ready"
    }
  ],
  "message": "Ready"
}

预览接口

GET /frame/ms602/{band}.jpg
GET /frame/m3lite.jpg
GET /frame/dcl.jpg
GET /frame/uvc_rgb.jpg

MS602 band 允许值:

480 550 660 720 840 rgb

有帧时返回 image/jpeg;尚无缓存帧时返回 HTTP 204。这些地址是轮询快照,不是 MJPEG 长连接。

保存与定时任务

POST /api/save/{target}

POST /api/save

两种形式都执行一次同步保存,文件写入 ${save_root}/Once。

target 允许值:

值 行为
ms602 保存完整六波段 TIFF
m3lite 保存温度 CSV 和温度图
dcl 保存 DCL JPEG
uvc_rgb 保存 UVC-RGB JPEG
all 要求全部相机保存,任一失败时 ok=false
online 只保存当前已连接的相机

路径形式示例:

curl -X POST http://127.0.0.1:8080/api/save/all

兼容形式:

curl -X POST http://127.0.0.1:8080/api/save -d "target=all"

GET /api/schedule

{
  "enabled": false,
  "interval_sec": 5.0
}

POST /api/schedule

字段 必填 说明
interval_sec 否 最小为 1.0 秒
enabled 否 1/true/on 开启,其他值关闭

开启时创建本次定时任务目录,并周期性将 online 目标加入异步保存队列。定时保存或保存队列有任务时,自动休眠暂停。

存储与文件管理

所有传入路径均为相对 save_root 的路径。服务会解析规范路径并拒绝越出保存根目录的访问。

GET /api/storage

返回存储总量、已用/剩余空间、刷新周期、版本以及自动清理结果:

{
  "save_root": "/nvme-data/pgu_data",
  "free_gb": 120.5,
  "used_gb": 118.0,
  "total_gb": 238.5,
  "refresh_ms": 5000,
  "app_version": "v2.1.1",
  "auto_cleanup": {}
}

读取该接口会执行一次自动清理空间检查;只有配置已启用且空间低于阈值时才会删除候选采集目录。Once 目录受保护。

POST /api/storage/cleanup

字段 必填 说明
enabled 是 自动清理开关
min_free_gb 否 最低剩余空间,最小 1 GB,默认 30

该接口会持久化配置,并立即执行一次空间检查。

GET /api/files

查询参数:

参数 默认值 说明
path 空 相对目录
page 1 页码
page_size 20 每页数量,最大 20

目录在前、文件在后,名称按不区分大小写排序。隐藏项不会返回。

{
  "ok": true,
  "root": "/nvme-data/pgu_data",
  "path": "Once",
  "parent": "",
  "items": [
    {
      "name": "capture.jpg",
      "path": "Once/capture.jpg",
      "is_dir": false,
      "size": 102400,
      "mtime": 1785835208.1,
      "mtime_text": "2026-08-04 17:20",
      "ext": ".jpg",
      "is_image": true,
      "inline_image": true,
      "child_count": 0
    }
  ],
  "total_count": 1,
  "page": 1,
  "page_size": 20,
  "total_pages": 1,
  "dir_count": 0,
  "file_count": 1,
  "total_size": 102400
}

GET /api/files/preview

/api/files/preview?path=Once/capture.tiff

仅接受图像文件。JPEG、PNG、WebP、BMP 可直接返回;TIFF 等图像会缩放到最大 1800 x 1800 并转换为 JPEG 预览。

GET /api/files/raw

/api/files/raw?path=Once/capture.jpg
/api/files/raw?path=Once/capture.jpg&download=1

download=1 时使用附件下载响应头,否则以内联方式返回。

POST /api/files/download

paths 为换行分隔的相对路径,可同时包含文件和目录:

curl -X POST http://127.0.0.1:8080/api/files/download \
  --data-urlencode $'paths=Once/a.jpg\nOnce/session'

返回 application/zip。隐藏文件、符号链接和越界路径不会加入压缩包。

POST /api/files/delete

paths 同样为换行分隔。接口先校验路径,随后启动后台永久删除:

{
  "ok": true,
  "message": "已开始后台删除 2 项",
  "queued": true,
  "paths": [
    "Once/a.jpg",
    "Once/session"
  ]
}

保存根目录不能删除。该操作没有回收站和撤销功能。

传感器与热成像控制

POST /api/sensors/power

字段 说明
awake 1/true/on 唤醒,否则休眠

唤醒时 MS602 和 DCL 立即启动;M3Lite 与 UVC-RGB 按各自延迟异步上电。休眠会停止相机、断开继电器电源并清除预览缓存。

POST /api/sensors/auto_sleep

字段 说明
minutes 自动休眠分钟数;0 关闭

修改后立即写入 pgu5a_config.json。

GET /api/status 的 sensor_power.auto_sleep 返回:

{
  "minutes": 15.0,
  "idle_for_sec": 120.0,
  "remaining_sec": 780.0,
  "enabled": true,
  "paused": false,
  "activity_running": false
}

定时采集开启或保存队列仍有任务时,paused 和 activity_running 为 true,自动休眠倒计时暂停。

GET /api/ms602/detection

返回当前运行中的检测参数和六通道实时诊断:

{
  "ok": true,
  "config": {
    "startup_detection_window_sec": 5.0,
    "jitter_detection_enabled": true,
    "jitter_shift_min": 0.04,
    "jitter_shift_max": 0.5,
    "jitter_horizontal_max": 0.25,
    "jitter_restart_reversals": 3,
    "jitter_window_sec": 3.0,
    "jitter_cancellation_ratio": 0.35,
    "jitter_total_shift_min": 0.35,
    "jitter_large_shift_min": 0.8,
    "jitter_large_shift_events": 2,
    "jitter_extreme_shift_min": 1.0,
    "frame_integrity_detection_enabled": true,
    "frame_integrity_phase_response_min": 0.55,
    "frame_integrity_delta_min": 8.0,
    "frame_integrity_restart_events": 2,
    "frame_integrity_window_sec": 3.0,
    "frame_tearing_gradient_ratio_min": 2.0,
    "frame_tearing_row_diff_min": 5.5,
    "frame_rate_detection_enabled": true,
    "frame_rate_min": 2.0,
    "frame_rate_memory": 2,
    "frame_max_age_sec": 2.0,
    "frame_max_skew_sec": 1.0
  },
  "channels": {
    "480": {
      "status": "CONNECTED",
      "device_index": 20,
      "restart_count": 1,
      "jitter_count": 0,
      "frame_integrity_count": 1,
      "frame_rate_count": 0,
      "frame_rate_fps": 8.1,
      "frame_rate_low_streak": 0,
      "frame_rate_result": "ok",
      "detection_active": false,
      "detection_remaining_sec": 0.0,
      "detection_result": "passed",
      "detection_run_count": 1,
      "detection_sample_count": 24,
      "last_phase_response": 0.98,
      "last_frame_delta": 1.2,
      "last_tearing_gradient_ratio": 1.31,
      "last_tearing_row_diff": 4.58,
      "last_integrity_trigger_events": 2,
      "last_integrity_trigger_gradient_ratio": 2.64,
      "last_integrity_trigger_row_diff": 8.01
    }
  }
}

POST /api/ms602/detection

表单字段与范围:

字段 范围 说明
startup_detection_window_sec 1.0..60.0 每次成功打开通道后的检测时长,默认 5.0 秒
jitter_detection_enabled 布尔值 开关小抖动检测
jitter_shift_min 0.01..10.0 160x100 检测样本上的最小上下位移
jitter_shift_max 0.1..20.0 最大上下位移,必须不小于最小值
jitter_horizontal_max 0.01..10.0 允许的最大左右位移
jitter_restart_reversals 2..20 反向次数阈值
jitter_window_sec 1.0..30.0 抖动统计窗口,秒
jitter_cancellation_ratio 0.05..0.8 来回位移抵消比例阈值
jitter_total_shift_min 0.05..50.0 累计位移阈值
jitter_large_shift_min 0.1..20.0 启动窗口内大幅垂直位移阈值
jitter_large_shift_events 1..20 大幅位移累计达到此次数后恢复当前通道
jitter_extreme_shift_min 0.1..20.0 单次极大垂直位移阈值,必须不小于大幅位移阈值
frame_integrity_detection_enabled 布尔值 开关撕裂检测
frame_integrity_phase_response_min 0.1..0.95 相位相关度阈值;调高更敏感
frame_integrity_delta_min 1.0..100.0 帧差阈值;调低更敏感
frame_integrity_restart_events 2..20 窗口内异常次数阈值
frame_integrity_window_sec 1.0..30.0 撕裂统计窗口,秒
frame_tearing_gradient_ratio_min 1.1..5.0 单帧纵向变化与横向变化的比例阈值
frame_tearing_row_diff_min 1.0..30.0 单帧横向断层强度阈值
frame_rate_detection_enabled 布尔值 开关运行期轻量帧率检测
frame_rate_min 0.1..60.0 单通道最低成功读帧 FPS
frame_rate_memory 1..20 连续低帧率间隔达到此次数后恢复当前通道

frame_max_age_sec 和 frame_max_skew_sec 用于保存前校验六通道帧组是否新鲜、时间是否足够同步。它们当前通过配置文件管理,不由检测页面修改。

保存成功后先写入 pgu5a_config.json,再更新运行中的 MS602 worker 并清空当前检测样本。参数立即用于仍在进行的开流自检;已经通过的通道不会因为保存配置而重新开始检测。该操作不重启服务、不重启整机,也不会主动重启正常通道。

每个通道只在首次启动、休眠唤醒或错误重连后开启独立图像检测窗口。窗口结束且未触发异常时,detection_result 变为 passed,后续预览帧在进入灰度转换、缩放、相位相关和帧差计算前直接返回。帧率检测只记录成功读帧间隔,运行期间持续生效;低帧率累计达到阈值时也只请求重启对应通道。

管理中心诊断表只显示 device_index 的数字节点编号,例如 12;API 仍返回完整的 device_index 和通道状态消息,后台设备路径与相机打开逻辑不变。

GET /api/m3/control

返回低频轮询缓存:

{
  "available": true,
  "ok": true,
  "status": "OK",
  "message": "热成像控制接口正常",
  "fpa_temp_c": 43.12,
  "core_temp_c": 43.13,
  "auto_nuc": true,
  "updated_at": 1785835205.2,
  "updated_at_text": "2026-08-04 17:20:05",
  "fpa_response_hex": "55 ... eb aa",
  "core_response_hex": "55 ... eb aa"
}

控制链路使用 PyUSB bulk,不使用 /dev/ttyACM0。默认 VID:PID 为 0424:6000,接口 3,OUT 0x05,IN 0x85。

POST /api/m3/auto_nuc

字段 说明
enabled 1/true/on 开启,否则关闭

接口先发送自动 NUC 命令,再发送保存参数命令。成功响应包含 response_hex、save_response_hex 和更新后的 m3_control。传感器休眠、PyUSB 缺失或设备断开时返回 ok=false,不会影响主服务。

网络、HS 与 Syncthing

GET /api/network

返回:

字段 说明
ap AP 开关、活动状态、接口、SSID、地址
sta STA 配置和连接状态
ethernet 以太网接口、IPv4、MAC
scan 最近一次 Wi-Fi 扫描结果
syncthing 安装、服务和 GUI 可达状态
headscale HS 状态与 IPv4
serial 设备序列号

响应中可能包含 AP 密码,只能在可信管理网络中调用和记录。

POST /api/network/scan

扫描 Wi-Fi 并更新 /api/network 的 scan 字段。

POST /api/network/ap

字段 必填 说明
enabled 是 AP 开关
ssid 启用时是 AP SSID
password 启用时是 至少 8 位

会修改 NetworkManager 连接并持久化到配置。

POST /api/network/sta/connect

字段 必填 说明
ssid 是 目标 SSID
password 否 Wi-Fi 密码

连接成功后持久化 STA 配置。

POST /api/network/sta/disconnect

断开 STA,并将配置中的 STA 开关设为关闭。

HS 接口

GET  /api/network/headscale/task
POST /api/network/headscale/install
POST /api/network/headscale/uninstall
POST /api/network/headscale/login
POST /api/network/headscale/logout

安装、卸载、登录和退出都是后台任务。启动接口返回 task,前端轮询 GET /api/network/headscale/task。

登录参数:

字段 必填 说明
server 是 Headscale 服务地址
authkey 是 临时 AuthKey

AuthKey 不应写入配置、日志或文档。任务正在运行时再次启动会返回 ok=false。

Syncthing 身份初始化

GET  /api/syncthing/identity-init/status
POST /api/syncthing/identity-init/start

启动后会:

  1. 停止 syncthing@root.service。
  2. 只删除 /root/.config/syncthing/cert.pem 和 key.pem。
  3. 重新启动 Syncthing。
  4. 等待新身份文件生成。

保留 config.xml、文件夹配置、数据库和同步数据。状态接口返回 running、ok、progress、stage、message 和有界日志。

这是会改变设备身份的接口,常规健康检查不得调用。

Web SSH

POST /api/ssh/open
GET  /api/ssh/read
POST /api/ssh/input
POST /api/ssh/close

后端启动 PTY,并执行:

/usr/bin/ssh root@127.0.0.1
接口 字段 说明
/api/ssh/open password 打开会话并完成本机 SSH 登录
/api/ssh/input text 写入终端文本或控制字符
/api/ssh/read 无 读取增量输出和连接状态
/api/ssh/close 无 关闭 PTY 和子进程

密码仅用于当前请求,不应持久化。前端关闭终端窗口时必须调用 close。

配置、服务与电源

GET /api/config

返回当前 pgu5a_config.json 的原始文本:

{
  "ok": true,
  "message": "配置读取成功",
  "path": "/root/PGU5-Core/pgu5a_config.json",
  "text": "{\n  ...\n}\n"
}

POST /api/config/save

字段 说明
config_text 完整 JSON 对象文本

保存流程:

  1. 解析并验证根节点为 JSON 对象。
  2. 将旧配置备份到 backups/config/。
  3. 用 UTF-8、两空格缩进和一个结尾换行写入。
  4. 重新加载配置。
  5. 异步重启 pgu5a_base.service。

该接口只验证 JSON 结构,不验证每个业务字段的类型和范围。编辑前应保留现场配置。

配置结构

顶层键:

键 用途
save_root 保存根目录
network AP 和 STA
web Web、保存、刷新、休眠和清理
ms602 MS602 采集与通道恢复
m3lite 热成像采集、上电和 USB 控制
dcl DCL 相机
uvc_rgb RGB 相机和继电器

ms602 恢复相关键:

{
  "open_stagger_sec": 0.3,
  "read_fail_restart_count": 5,
  "channel_reconnect_delay_sec": 0.8,
  "startup_detection_window_sec": 5.0,
  "jitter_detection_enabled": true,
  "jitter_shift_min": 0.04,
  "jitter_shift_max": 0.5,
  "jitter_horizontal_max": 0.25,
  "jitter_restart_reversals": 3,
  "jitter_window_sec": 3.0,
  "jitter_cancellation_ratio": 0.35,
  "jitter_total_shift_min": 0.35,
  "jitter_large_shift_min": 0.8,
  "jitter_large_shift_events": 2,
  "jitter_extreme_shift_min": 1.0,
  "frame_integrity_detection_enabled": true,
  "frame_integrity_phase_response_min": 0.55,
  "frame_integrity_delta_min": 8.0,
  "frame_integrity_restart_events": 2,
  "frame_integrity_window_sec": 3.0,
  "frame_tearing_gradient_ratio_min": 2.0,
  "frame_tearing_row_diff_min": 5.5,
  "frame_rate_detection_enabled": true,
  "frame_rate_min": 2.0,
  "frame_rate_memory": 2,
  "frame_max_age_sec": 2.0,
  "frame_max_skew_sec": 1.0
}

小幅反向垂直抖动继续使用位移方向、抵消比例和累计位移判断,位移值基于 160x100 检测样本。大幅位移按窗口内次数判断,极大位移单次即可触发。对于画面撕裂、错行等坏帧,检测器同时统计跨帧低相位相关度大帧差,以及单帧横向断层梯度;这些昂贵分析只在开流检测窗口运行。帧率监控持续记录成功读帧间隔,连续低 FPS 时只重启对应 MS602 通道。ms602_channels 会附带检测状态、恢复计数、相位相关度、帧差、断层、当前 FPS 和低帧率连续次数等诊断字段。

dcl.auto_detect=true 时运行时严格匹配 ClearDCLXXXXX 视频设备名称。dcl.camera_name 如存在仅作为优先提示;未配置或更换设备时无需修改发布配置。

服务和电源接口

接口 行为
POST /api/service/restart 1 秒后重启主服务
POST /api/system/reboot 1 秒后重启操作系统
POST /api/system/shutdown 2 秒后执行 sync 和 poweroff

这三个接口先返回 JSON,再执行后台动作。常规验证只允许调用服务重启;不得调用系统重启或关机。

OTA

GET  /api/ota/status
POST /api/system/update/check
POST /api/system/update/apply

OTA 状态:

IDLE CHECKED FETCHING CHECKOUT VERIFYING RESTARTING SUCCESS ERROR

GET /api/ota/status

合并返回当前版本、最近一次远端检查结果和 backups/ota_state.json 中的任务状态。

POST /api/system/update/check

查询 Gitea Release,返回 latest 和 update_available。只有 update_available=true 时前端才允许升级。

POST /api/system/update/apply

字段 必填 说明
tag 否 目标标签;空值时使用最近检查到的版本

标签必须包含前导 v。更新器强制刷新同名标签:

git fetch --force origin refs/tags/<tag>:refs/tags/<tag>

随后切换标签、执行 Python 编译验证并重启主服务。没有手动回滚接口,也不创建项目外 OTA 备份目录。

排除的应用接口

PGU5-Core 不提供应用层业务控制接口。以下路径应返回 HTTP 404:

/api/plc/*
/api/automation/*
/api/light_recipes

PLC、运动、水肥、业务路径、计划任务和应用专属身份不得通过 Core API 重新引入。