排障与设备维护

错误码对照、连通性自检、设备恢复与指定设备。能力参数见 能力参考。

1. 管理接口速查

接口用途
GET admin/capabilities/机器可读能力目录
GET admin/devices/online/?capability=script选设备(权威 presence 口径)
POST admin/tasks/201 即时下发/202 排队+status_url
GET admin/tasks/<id>/轮询;pending 期字段为 null
GET admin/tasks/<id>/logs/?limit=100执行日志(level/since 可过滤)
GET admin/tasks/?status=&type=&device_id=列表(cursor 分页)
POST admin/tasks/<id>/cancel/取消任务(仅 pending / dispatched 状态可用)
GET/PUT admin/devices/<id>/shadow/查影子/写 desired(PUT 带当前 version,409 则重取再试)
GET admin/models/模型登记表(name/version/sha256/qiniu_key)
POST admin/models/assignments/把某版本模型分配给设备
GET admin/models/deliveries/分发看板(installed / confirmed / failed)
POST admin/models/rollback/回滚到指定版本(重写 current 指针)

2. 错误对照

下表是所有能力共用的传输层与调度层错误。每项能力特有的失败模式(参数形状、模型缺失、权限不足等)列在该项的「注意」里。

错误含义处理
401Key 无效/缺失核对 $KEY
403设备已吊销,或下载跨命名空间对象换设备;改用本设备命名空间内的 key
404设备/任务不存在核对 id
409 DEVICE_OFFLINE指定设备离线换在线设备或不指定走自动调度
409 CONFLICT影子版本冲突/任务不可取消GET 最新 version 重试
任务 failed执行层失败看 task.error
success 但 result.error端侧回绝(最常见:args 传参风格写错)对照「两种 args 传参约定」一节
任务长时间 running 后转 failed超出后端时间预算被提前终止调大 timeout_sec
429超出调用频率上限等待当前 60 秒窗口结束后重发,见 参考页 §3.3
任务 timeout超过 timeout_sec 未完成调大 timeout_sec 后重发,见 参考页 §3.4
WS 大输出失败设备版本低于 2.0.53,单包上限 1 MB升级设备版本,或改用 rknn.detect

3. 连通性自检

任何能力报 409 DEVICE_OFFLINE 或长时间无回包时,先跑这一条确认下发与回传通路正常。它不承载业务能力,只验证鉴权、下发、执行、回传四步能否走通,无副作用。

post_task custom '{"subtype":"ping"}' "acme-ping-001"   # 不传设备, 交由自动派发
# → {"status":"success","result":{"pong":true,"ts":1789105290288}}
# 判定: status=success 且 result.pong=true

若本条也不通,问题在鉴权或调度侧,与具体能力无关。

4. 设备自愈与状态

下面四条针对设备自身,不属于能力清单,因此没有编号。仅在任务反复失败、需要人工将节点恢复可用时使用。

# 采集设备型号/系统版本/内存/存储/运行时长, 排查问题时先看这条
post_task command '{"command":"report_status"}' "acme-rep-001"
# 立即让设备上报一次当前配置与运行指标
post_task command '{"command":"sync_config"}' "acme-sync-001"
# 磁盘吃紧或缓存污染时清理缓存(不会删除已同步的模型目录)
post_task command '{"command":"clear_cache"}' "acme-cc-001"
# 进程状态异常时重启 App, 设备会短暂离线约 10-20s 后自动重连
post_task command '{"command":"agent_restart"}' "acme-rs-001"

只想换 JS 逻辑而不重启进程,用 system.reload;它属于能力清单里的逻辑下发。

5. 指定设备

只有当你要把任务钉在某一台特定机器上(例如对比不同硬件的结果)才需要这个接口。日常集成请不要用它——设备会上下线,硬编码 id 是最常见的失败原因。

curl -s "${H[@]}" "$BASE/admin/devices/online/?capability=script"
# → {"success":true,"code":"OK","count":13,"authoritative":"redis-presence",
#    "results":[{"device_id":"edge_0e38…","status":"ACTIVE","is_online":true,…}]}

post_task script '{"module":"vision","func":"image_labeling","args":["a.png",0.5]}' "acme-x-001" "edge_0e38…"

authoritative 恒为 redis-presence(权威在线口径,与调度器同口径);capability 可过滤 script/command/file/custom;status 为 ACTIVE/OFFLINE/REVOKED。指定了离线设备会返回 409 DEVICE_OFFLINE。