feat: 设备配置二维码——设备池里出码,Agent 扫一下配好

配合设备端 Agent 新增的「扫码配置」:人在机架前、设备还没接进平台时,
不用插线也不用在手机上打字输地址/令牌(还容易漏指纹)。

- `GET /api/devices/qrcode?serial=`:生成配置二维码(PNG data-url),内容为
  {"v":1,"server":…,"token":…,"fingerprint":…,"name":…}
  * 前置:设备端商店已启用(令牌从那儿来),否则 400 并说明去哪儿开
  * `warn` 非空必须显示:①用 localhost 打开平台时,二维码里的地址手机会连不上
    (提示改用局域网地址,_lan_ip() 优先挑 192.168/10.x,**不用** gethostbyname ——
     那会返回 Tailscale 的 100.x 或 docker 的 172.17,手机根本连不上)
    ②设备还没采到指纹 → 扫完平台认不出是哪台
- 设备池每行加「二维码」按钮 → 弹窗显示二维码 + 设备名/地址 + 可展开看原始内容
- requirements 加 qrcode(纯 Python,配合已有的 Pillow 出 PNG,不引前端二维码库)
- 文档:API.md §6.2.2 新增、§6.2.1 名称呈现表补齐(剪贴板/安装弹窗/版本管理/
  安装进度四处);DEVICE_AGENT.md §5.3 新增二维码内容格式(设备端契约)

验证:二维码用 cv2.QRCodeDetector 解回来与 payload 完全一致;手机上实测——
扫 A07 的码 → 相机启动 → 解码 → 保存 → 立刻拉清单,平台认出「A07」。
This commit is contained in:
2026-09-13 16:42:53 +08:00
parent 17b6624a34
commit 3f041668ec
5 changed files with 179 additions and 2 deletions
+24
View File
@@ -150,6 +150,7 @@
| POST | `/api/devices/pool/remove` | D | 从池中删除 |
| POST | `/api/devices/pool/toggle` | D | 启用/停用(停用不参与调度) |
| POST | `/api/devices/pool/reconnect` | D | 一键重连全部池内网络设备 |
| GET | `/api/devices/qrcode?serial=` | D | 生成该设备的**配置二维码**(设备端 Agent 扫码即配好) |
| POST | `/api/devices/pool/refresh_models` | D | 批量采集型号 |
| GET | `/api/devices/discovery` | D | 发现状态 + 待连接 + 断联列表 |
| POST | `/api/devices/discovery/scan` | D | 手动触发一轮扫描 |
@@ -461,8 +462,31 @@
| 任务编辑器「指定设备」下拉 | `名称 · serial` |
| 分组编辑的设备勾选列表 | `名称 · serial` |
| 设备池 / 待连接池 / 断联设备表 | 名称列 + 指纹列 |
| 剪贴板注入的设备勾选列表 | `名称 · serial`(无名只显示地址) |
| 应用管理的安装弹窗设备列表 | `名称 · serial` |
| 应用版本管理表格的「设备」列 | `名称 · serial` |
| 应用安装进度表的「设备」列 | 名称(取自设备池;无名退地址) |
| MCP `de_list_devices` | 返回 `name` 字段,提示 AI 汇报时用名称 |
> 这几个接口的字段来源:`/api/adb/devices`、`/api/apks/install/devices` 走
> `web/common.py:_merged_device_list()`(带 `name`);`/api/tools/appver` 把
> `name` 塞进每个设备的结果里。
### 6.2.2 设备配置二维码(扫码配置)
| 接口 | 鉴权 | 请求 | 说明 |
|------|------|------|------|
| `GET /api/devices/qrcode?serial=<地址>` | 设备权限 | — | 返回 `{png(base64 data-url), payload, warn}` |
给设备端 Agent 扫的配置二维码,一次写入**平台地址 + 设备令牌 + 该设备指纹**:
- `payload` 是二维码里的原始 JSON:`{"v":1,"server":…,"token":…,"fingerprint":…,"name":…}`
- `warn` **非空时必须显示**给操作者,最常见两种:
- "你是用 localhost 打开平台的" → 二维码里的地址手机会连不上,要改用局域网地址重开本页
- "这台设备还没采集到指纹" → 扫码后平台认不出它是哪一台
- 前置条件:先在「应用管理 → 设备端应用商店」**启用**(令牌从那儿来),否则 400
- 设备端如何解析见 [DEVICE_AGENT.md](DEVICE_AGENT.md) §5.3
### 6.3 自动发现
| 接口 | 请求 | 说明 |