关于 simulator-automation
为 Even Hub Simulator 提供 HTTP 自动化 API 的指南,供开发者检查模拟器画面与日志,并发送触控输入。适用于自动化观察和交互测试。
主要功能
- 01提供健康检查接口
- 02获取眼镜和 Webview 截图
- 03读取与清除控制台日志
- 04发送触控板输入
适用场景
- 01自动验证应用启动状态
- 02检查屏幕内容和运行日志
- 03脚本化手势交互测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ even-realities/ everything-evenhub --skill simulator-automation安装后在 Claude Code 中输入/simulator-automation确认已加载。
详细介绍
EvenHub Simulator Automation
使用 --automation-port <PORT> 启动模拟器后,它会在 localhost 上公开一个 HTTP API。
evenhub-simulator https://my-app.example.com --automation-port 9898
基础 URL:http://127.0.0.1:<PORT>
API 参考
健康检查
GET /api/ping
→ "pong"
眼镜截图
返回当前 LVGL 帧缓冲区,格式为 image/png(576×288,RGBA)。
GET /api/screenshot/glasses
→ image/png binary (RGBA)
RGBA 格式——对图像分析至关重要:
- 背景像素:
(R=0, G=255, B=0, A=0)—— 透明(alpha = 0) - 点亮/文本像素:
(R=0, G=255, B=0, A=255)—— 不透明(alpha = 255)
始终使用 RGBA 模式。不要转换为 RGB——这会丢弃 alpha 通道,使背景像素与文本像素无法区分(两者都会显示为纯绿色)。
from PIL import Image
img = Image.open('glasses.png') # keep as RGBA — do NOT call img.convert('RGB')
pixels = img.load()
# Lit pixel test:
is_lit = lambda px: px[3] > 0 # alpha > 0
Webview 截图
使用 html2canvas 捕获主浏览器 Webview,返回 image/png。可能需要几秒;10s 后超时。
GET /api/screenshot/webview
→ image/png binary
控制台日志
返回主 Webview 中捕获的 console.* 输出、未捕获的异常、未处理的 Promise 拒绝以及失败的 fetch 调用。
GET /api/console
→ { "entries": [...], "total": N }
每条日志:
{ "id": 0, "level": "log|warn|error|info|debug|trace", "message": "...", "ts": 1712150400000 }
非控制台来源的前缀:
[uncaught] ...—— 未捕获的异常[unhandledrejection] ...—— 未处理的 Promise 拒绝[fetch] ...——fetch失败(状态非 ok 或网络错误)
仅轮询新条目:
GET /api/console?since_id=42
→ entries with id > 42
**since_id 必须是非负整数。**传入负值(例如 -1)会导致服务器返回错误,而不是空列表。首次轮询时,请完全省略此参数以获取所有当前条目,然后根据响应跟踪 last_id:
# First poll — no since_id
resp = requests.get(f"{BASE_URL}/api/console")
entries = resp.json()["entries"]
last_id = max((e["id"] for e in entries), default=0)
# Subsequent polls
resp = requests.get(f"{BASE_URL}/api/console?since_id={last_id}")
清空缓冲区:
DELETE /api/console
**时序注意事项:**启动日志(例如“ready”信号)只会发出一次;如果在读取前清空缓冲区,它们就会丢失。建议先轮询 ready 信号,然后在需要时清空。
# Safe: check for ready signal BEFORE clearing
poll_until(target="APP_READY")
requests.delete(f"{BASE_URL}/api/console") # only if you need a clean slate after
眼镜输入
向眼镜显示屏发送触控板操作。
POST /api/input
Content-Type: application/json
{ "action": "up" | "down" | "click" | "double_click" }
响应:{ "ok": true }
操作对应眼镜触控板:
up/down—— 滚动浏览列表项或文本click—— 选择当前项double_click—— 触发系统级双击事件(通常用于“返回”或“关闭”)
自动化工作流
- 确认服务正在运行:
GET /api/ping - 轮询应用就绪状态(不要先清空控制台):查找已知日志消息。
- **观察:**使用
/api/screenshot/glasses(RGBA)或/api/console检查状态。 - **操作:**通过
POST /api/input发送输入。每次操作后,短暂等待(约 300ms),然后确认状态是否已改变。 - **迭代:**轮询控制台时使用
since_id,避免重复读取旧条目。
提示
- 眼镜显示屏为 576×288 像素,单色绿色。截图为 RGBA PNG。
- 只有在应用创建了活动事件容器后,输入才会生效。如果没有活动容器,输入会被静默忽略。
double_click通常用于返回或关闭当前视图。- 启动模拟器后,等待至少 4 秒再开始轮询——SDK 初始化和
createStartUpPageContainer都需要时间。
任务
$ARGUMENTS
评论
支持 Markdown