实战推演:用 esp32-iphone-agent 的思路,给自己 iPhone 做个"自动化开关",可行吗
【免费下载链接】esp32-iphone-agentLet an AI model use a real iPhone with a $7 ESP32: AirPlay eyes, USB HID hands, any OpenAI-compatible vision model. No Mac, no developer account, no jailbreak.项目地址: https://gitcode.com/gh_mirrors/es/esp32-iphone-agent
在 iOS 生态里,"给 iPhone 做自动化"天然有两条岔路:一条是苹果官方给的捷径——快捷指令自动化、专注模式定时,另一条是绕开系统限制,用外部设备模拟人手去操作屏幕。esp32-iphone-agent 走的是第二条:它用一块约 40 元的 ESP32-S3 插进手机 USB 口,让手机"看"和"摸"的能力分别交给 AirPlay 镜像与 USB HID,再由任意兼容 OpenAI 接口的视觉模型当大脑,实现"AI 用人的方式操作一部真实的 iPhone"。不需要 Mac、不需要开发者账号、不需要越狱,手机上一个 App 都不用装。
但演示归演示。如果你想要的不是"AI 自由发挥",而是三个更朴素的需求——到点自动开勿扰、回家自动执行某件事、一键批量操作几个 App——这个项目的哪些层该留、哪些层该砍?本文结合仓库源码逐层拆解,并把结论落到一份最小改造清单上。
一、先把"自动化开关"拆开:三个真实需求
先别急着聊硬件,把"自动化开关"这个词拆成三个可度量的需求:
- 定时开关:每晚 22:30 打开勿扰,次日 08:00 恢复。本质是"到点执行一组确定的 UI 操作"。
- 条件触发开关:连上家里 Wi-Fi 时自动执行某件事(比如打开某个 App、静音)。本质是"状态感知 + 触发 + 执行"。
- 一键批处理:把"打开某 App → 进某页 → 连续点选 → 截图存档"这类重复劳动脚本化,随时手动触发。
这三个需求的共同点是:操作序列确定、触发条件确定,跟项目主页演示的"看图自由发挥"是两类任务。这个区分极其关键——它直接决定了后面架构的取舍:你很可能根本不需要那个"大脑"。
二、项目的三层骨架:眼睛、手和大脑
眼:AirPlay 镜像
server/hidagent/screen.py 在电脑上拉起 UxPlay 接收端,用 GStreamer 管道把镜像流以 8fps 转成一帧帧 JPEG,供模型和网页使用。两个细节值得注意:一是 AirPlay 只在画面变化时才推帧,settled()正是利用这个特性来"等画面静止";二是在 Linux 上,live属性通过读取 UxPlay 进程的 TCP 连接数来判断手机是否真的在线,而不是靠帧率猜测。
手:USB HID 桥
hardware/hid_bridge/hid_bridge.ino 的固件让这块板子对 iPhone 表现为一个标准的 USB 鼠标加键盘。打开 iOS 的辅助触控后,鼠标指针就成了"手指":点击即点按、拖动即滑动。固件本身不含任何业务逻辑——它通过 Wi-Fi TCP 连到电脑的 7300 端口,一行一条命令,回复ok或err <原因>:
| 命令 | 作用 |
|---|---|
ping | 健康检查 |
home | 把指针推到左上角(一个已知位置) |
move <dx> <dy> | 相对移动指针,匀速 |
press/release/click | 左键按下 / 松开 / 点击 |
scroll <v> <h> | 滚轮 |
type <text> | 输入 ASCII 文本 |
key <combo> | 按键组合,如enter、cmd+h、cmd+space |
几个工程细节决定了这条"手"的可靠性:movePaced把每次报告步进限制在 10 单位、间隔 8ms,匀速移动让 iOS 的指针加速度保持可预测;usbReady()检测到 USB 挂起时先尝试tud_remote_wakeup()唤醒,唤醒不了立刻返回err phone usb asleep,绝不卡死等待;板子还挂了 8 秒看门狗,一旦被卡死就自动重启。
脑:规划者 + 执行者
server/hidagent/agent.py 里是两套提示词。PLANNER_PROMPT 要求模型把目标拆成最多 6 步的短计划;ACTOR_PROMPT 规定模型必须按THINK: ... DO: ...格式输出动作(tap、swipe、path、circle、type、key、home、back、done、fail),坐标是 0–1000 的屏幕相对坐标。两个角色可以共用同一个模型,也可以按ACTOR_*/PLANNER_*分开配置(比如快的模型当执行者、强的模型当规划者)。
闭环:指针校准与"屏幕到底变没变"
相对鼠标最大的问题是漂移。项目在 server/hidagent/phone.py 里做了两层补偿:
- 自动校准:
start_calibration()把指针推到左上角,沿对角线移动 150、350 个鼠标单位,在镜像画面里找到指针的真实落点,拟合出"鼠标单位 → 屏幕比例"的跨度(span)。两个点同时给出尺度和偏移,因为 iOS 的指针运动并不是严格成正比的。 - 点按前微调:
_aim()先把指针轻推 12 个单位,在前后两帧的像素 diff 里定位指针真实位置(server/hidagent/vision.py 的pointer()),偏差超过 0.008 屏占比当场纠正,并把观测落点存进 12 条滑动窗口做线性拟合——也就是说,这台设备会越点越准,校准还能持久化到磁盘,重启不丢。
而vision.py的changed()用两级分辨率比对两帧画面(先 32×64 粗查全局,再半分辨率细查局部,并屏蔽指针轨迹和状态栏区域),判断一次操作后屏幕是否真的变了。这个结果会作为反馈写进模型的历史记录:点空了会被发现、重试或触发重新规划,而不是将错就错。
下图是项目主页的真实演示:左边是插着 XIAO ESP32S3 的 iPhone 正在设置"每天 7:00 重复"的闹钟,右边是网页界面。模型打开时钟 App、把 0700 直接敲进时间滚轮、连续勾选重复的天数并保存——全程走的是"看屏幕、动指针"这条人的操作路径。
三、实现路径:沿用思路的最小改造清单
核心判断:对"确定性自动化开关",项目的"脑"是可以剥离的,真正不可替代的是"手 + 眼"这两层——任何 App 内都能点、都能看,不依赖无障碍控件树,不需要开发者账号,手机上不需要装任何东西。改造方向有两条。
改造方案 A:砍掉模型,留下"手 + 眼",写成确定性脚本
server/hidagent/app.py 已经把 Phone 层的能力全部暴露成了 REST 端点:/api/tap、/api/swipe、/api/scroll、/api/type、/api/key、/api/home、/api/back、/api/calibrate/start、/api/calibrate/finish,外加/api/frame.jpg(实时帧)和/api/status(板子、镜像、校准状态)。这意味着你完全不必启动 Agent——写一个很小的定时脚本,按坐标序列"点按—滑动—输入",再用/api/frame.jpg拉一帧做像素断言,就能完成固定流程:
# 示意:每晚 22:30 打开勿扰(把网页当作执行器,绕开模型层) import time, requests BASE = "http://<电脑IP>:8890" def run_sequence(steps): for method, path, body in steps: requests.post(f"{BASE}{path}", json=body) time.sleep(0.8) # 等画面稳定,等价于 screen.settled() run_sequence([ ("post", "/api/home", {}), # 回主屏幕,指针归位 ("post", "/api/swipe", {"x1": 0.5, "y1": 0.99, "x2": 0.5, "y2": 0.6}), # 上滑呼出控制中心 ("post", "/api/tap", {"x": 0.5, "y": 0.15}), # 点勿扰(坐标按自己机型校准) ])需要说明:这是基于现有端点构思的最小客户端示意,仓库本身没有提供这样的 CLI;坐标要用网页上的实时画面和手动校准来确定。这条路的改动最小——固件不用改、校准流程不用改、Phone/Device/Screen 三层全部复用,唯一砍掉的是 agent.py 里的模型编排。
值得注意的是,这个思路在社区里并非孤例:近两年涌现了不少"ESP32 本地 HTTP + 快捷指令/Siri 语音开灯"教程,强调无云、低延迟,还专门讨论过 AP 隔离、IP 漂移、URL 编码这些坑。但那些方案控制的是 ESP32 外接的继电器和灯;真正"反向操作 iPhone 屏幕"、且把指针闭环做到这种工程程度的开源方案,依然屈指可数——这正是本项目不可替代的位置。
改造方案 B:保留"脑",把 Agent 当泛化执行器
当任务步骤无法预先写死(比如"把最近一周的未读邮件全部归档"这类随内容变化的操作),保留 planner/actor 结构才有价值。此时只需要外部调度触发POST /api/agent {"text": "..."},并用/api/agent/stop兜底。项目的实测节奏可以参考 README.zh-CN.md:本地部署 Qwen3.8 系列模型、关闭思考模式后,单个动作约 1.3 秒、单次规划约 2 秒——足够你估算一个 6 步任务的总耗时,也足够你判断"脚本化 vs 模型化"的取舍。
触发器从哪来
项目自身没有定时器概念,有三种挂法:
- 外部定时器:cron 或 systemd timer 直接调
/api/*,最简单直接; - iOS 快捷指令自动化:以时间或"连接某 Wi-Fi"为触发条件,用"获取 URL 内容"POST 到电脑上的 server。但要注意,快捷指令自动化在 iOS 上对设备状态有要求(部分触发需要解锁、联网),这与项目"锁屏即断流"的限制互为表里;
- HomeKit 自动化:如果你要的是"原生开关形态"(在家庭 App 里点一下),社区早在 2019 年起就有大量 ESP32 通过 hap 框架、HomeSpan 或 HomeKit ADK 接入 HomeKit 控制外设的教程。但注意方向:那是 iPhone 控制 ESP32 外接的灯和继电器,和本项目正好相反——本项目是 ESP32 反过来操作 iPhone 屏幕,两者不可混为一谈。
部署清单
| 部件 | 说明 |
|---|---|
| ESP32-S3 开发板 | XIAO ESP32S3 普通版即可,淘宝约 ¥40–50;任何 USB-C 直连 S3 原生 USB 的板子都行 |
| iPhone 连接 | USB-C 机型直插;Lightning 机型需 Lightning 转 USB 相机转换器;板子由手机供电 |
| 电脑 | macOS 或 Linux,与手机同网;跑 UxPlay + FastAPI 服务端(默认网页 8890、板子 7300) |
| 模型 | 保留"脑"时需要 OpenAI 兼容视觉模型(云端或 vLLM/Ollama 本地均可);纯脚本化则完全不需要 |
四、落地绕不开的边界
推演到最后,真正的分水岭不是"能不能动屏幕",而是下面这几条硬边界(均来自 README.zh-CN.md 的限制清单和源码实现):
- 锁屏即断:手机锁屏后 AirPlay 镜像停止,USB 口也会休眠——固件里的
usbReady()只能尝试唤醒、唤醒不了就报错,keep_awake也只是每隔几秒轻推指针防止自动锁屏,并不能解锁。所以"到点执行"必须保证执行瞬间手机是亮屏状态,全天候无人值守直接出局。 - 不镜像的界面:密码输入、Apple Pay、有版权保护的视频都不会镜像,Agent 看不到这些画面,相关自动化不可行。
- 输入仅 ASCII:Roadmap 里"通过 iOS 拼音键盘输入中文"尚未完成,涉及中文内容输入的自动化会卡在"输入"这一环。
- 竖屏 only:坐标与校准都按竖屏计算,横屏 App 里的点按和绘图位置会偏。
- 依赖常开电脑与局域网:UxPlay 和服务端都在电脑上,手机与电脑必须同网;多网卡机器还要处理 Avahi(mDNS)绑定网卡的问题。
- 合理使用边界:只自动化自己拥有或被允许使用的设备,遵守相关 App 条款,紧急停止按钮随时备好。
五、可行性结论:哪些能落地,哪些是伪需求
| 需求 | 判断 | 关键条件 / 更优替代 |
|---|---|---|
| 定时勿扰 / 静音开关 | ✅ 能落地 | 若 iOS 专注模式定时已覆盖,直接用原生;跨 App 场景才需要这套 |
| 一键批量操作(跨 App) | ✅ 能落地,且是甜点区 | 任何 App、只看像素、无需签名与装 App |
| "连上某 Wi-Fi 触发" | ✅ 有条件落地 | 触发侧用快捷指令自动化,执行侧用/api/* |
| 涉及中文输入的任务 | ⏸ 暂缓 | 依赖 Roadmap 的拼音键盘输入 |
| 锁屏状态下的自动化 | ❌ 伪需求 | 镜像断、USB 休眠,物理上不可行 |
| 密码 / Apple Pay / DRM 界面自动化 | ❌ 伪需求 | iOS 本身不镜像这些界面 |
| 无人值守 7×24 自动化 | ❌ 伪需求 | 需亮屏、需电脑常开、需同网,工程成本远超收益 |
最后的结论可以很明确:esp32-iphone-agent 的真正价值,不是"给 iPhone 装一个开关",而是提供了一层以人的方式操作 iPhone 的通用执行层。对"自动化开关"这个目标而言,最优路径是取它的"手 + 眼"、舍它的"脑",再外挂一个触发器——这也是上文最小改造清单的核心。如果你要的是"到点自动做一串固定操作",答案是可行,而且改动比想象中小;如果你要的是"手机自己全自动跑起来",那建议先从需求定义开始改。
【免费下载链接】esp32-iphone-agentLet an AI model use a real iPhone with a $7 ESP32: AirPlay eyes, USB HID hands, any OpenAI-compatible vision model. No Mac, no developer account, no jailbreak.项目地址: https://gitcode.com/gh_mirrors/es/esp32-iphone-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考