IP Print Web
曦曦 IP 形象 3D 打印直连站。提供两条路径:唤醒经典(直达打印)和 魔法衣橱(DIY 换装生成 3D 模型)。OpenClaw Agent 通过 bambu.py 将 .3mf 文件发送至 Bambu Lab 打印机,monitor_bridge.py 后台监控进度并通过 WebSocket 实时推送前端。
技术栈
| 层 |
技术 |
| 后端框架 |
FastAPI(Python) |
| 实时通信 |
WebSocket(FastAPI 原生 + websockets 库) |
| 前端 |
原生 HTML/CSS/JavaScript(多页应用,无框架) |
| 打印机控制 |
bambu.py(LAN MQTT + FTPS 直连) |
| Agent 调度 |
OpenClaw Gateway + Agent |
| 图像资源 |
曦曦IP/IP换装/ static/xixi_diy/ static/images/ |
快速开始
# 终端 1: OpenClaw Gateway(端口 18789)
openclaw gateway
# 终端 2: FastAPI(端口 8000)
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload
打开 http://localhost:8000。
页面路由与流程
唤醒经典(直达打印)
index.html(落地页)
→ select.html(双路枢纽)
→ select_classic.html(从 /api/list-ips 动态加载 IP)
→ preview_classic.html(三视图预览 + 模拟加载)
→ printing_classic.html(真实后端:API + WebSocket + Gateway)
→ finish_classic.html(完成页)
魔法衣橱(DIY 换装)
index.html → select.html
→ customize.html(选择服饰 + 配饰,实时预览合成图)
→ preview_diy.html(3D 模型预览 + 模拟 2D→3D)
→ takeaway.html(数字凭证提取页)
页面一览
| 模板 |
路由 |
路径 |
index.html |
/ |
落地页 |
select.html |
/select.html |
双路枢纽(经典 / 衣橱) |
select_classic.html |
/select_classic.html |
经典 IP 选择(API 动态加载) |
preview_classic.html |
/preview_classic.html |
经典三视图预览 |
printing_classic.html |
/printing_classic.html |
打印执行页(真实后端) |
finish_classic.html |
/finish_classic.html |
打印完成 |
customize.html |
/customize.html |
魔法衣橱换装 |
preview_diy.html |
/preview_diy.html |
DIY 3D 预览 |
takeaway.html |
/takeaway.html |
数字凭证提取 |
print.html |
/print.html |
(预留) |
printing.html |
/printing.html |
(预留) |
finish.html |
/finish.html |
(预留) |
项目结构
| 文件 |
职责 |
main.py |
FastAPI 后端 — REST API + WebSocket 代理 + 任务状态推送 + 页面路由 |
task_state.py |
任务状态持久化(work/{task_id}_state.json) |
monitor_bridge.py |
打印监控 — MQTT 直连轮询,写状态文件,自行设置 done/failed |
ips/list.json |
IP 形象数据(id、name、image、model、desc),前端动态加载 |
static/gateway.js |
GatewayChat 类 — WebSocket 连接、RPC 通信、事件分发 |
static/prompt.js |
打印配置常量 + buildPrintPrompt() — 构造发给 Agent 的指令 |
static/xixi_diy/ |
魔法衣橱换装图片(cloth ×10、ornament ×8、合成图 7×7) |
static/images/ |
猫猫引导图、Logo、经典模型三视图 |
static/3D/ |
预切片 .3mf 模型文件 |
架构
浏览器
├── /ws/gateway ──→ FastAPI 代理 ──→ OpenClaw Gateway (:18789)
│ └──→ Agent 执行流水线
├── /ws/task/{id} ←── WebSocket 实时推送 ──→ 轮询 work/{id}_state.json
│ ↑
│ monitor_bridge.py (后台 Start-Process,独立运行)
│ ↑
│ bambu.py print ──→ 打印机 (MQTT + FTPS)
└── /api/generate → task_state.start_task() → 创建任务
打印流水线
Agent 执行三步(非阻塞):
- 发送打印文件 —
bambu.py print <模型> --confirmed
- 后台启动监控 —
Start-Process monitor_bridge.py <task_id>(立即返回,不等待)
- 确认监控运行 —
set_status("printing")
monitor_bridge.py 在后台独立运行,自行写入状态(progress、done/failed),后端 WebSocket 检测文件变化推送前端。
API
| 方法 |
路径 |
说明 |
| GET |
/ |
落地页 |
| GET |
/api/list-ips |
IP 形象列表(含 id/name/image/model/desc) |
| POST |
/api/generate |
创建任务,请求体 {"ip_id"} |
| GET |
/api/status/{task_id} |
任务状态查询 |
| WS |
/ws/gateway |
浏览器 ↔ Gateway 透明代理 |
| WS |
/ws/task/{task_id} |
任务状态实时推送 |
环境要求
- Python ≥ 3.10
- OpenClaw CLI(Gateway + Agent)
- bambu-studio-ai skill(
bambu.py 打印机控制脚本)
- 打印机开启 Developer Mode
pip install fastapi uvicorn pydantic websockets bambulabs-api