☰
实战推演:用 esp32-iphone-agent 的思路,给自己 iPhone 做个“自动化开关“,可行吗
2026/10/20 8:14:30 网站建设 项目流程

实战推演:用 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——这个项目的哪些层该留、哪些层该砍?本文结合仓库源码逐层拆解,并把结论落到一份最小改造清单上。

一、先把"自动化开关"拆开:三个真实需求

先别急着聊硬件,把"自动化开关"这个词拆成三个可度量的需求:

  1. 定时开关:每晚 22:30 打开勿扰,次日 08:00 恢复。本质是"到点执行一组确定的 UI 操作"。
  2. 条件触发开关:连上家里 Wi-Fi 时自动执行某件事(比如打开某个 App、静音)。本质是"状态感知 + 触发 + 执行"。
  3. 一键批处理:把"打开某 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 里做了两层补偿:

  1. 自动校准:start_calibration()把指针推到左上角,沿对角线移动 150、350 个鼠标单位,在镜像画面里找到指针的真实落点,拟合出"鼠标单位 → 屏幕比例"的跨度(span)。两个点同时给出尺度和偏移,因为 iOS 的指针运动并不是严格成正比的。
  2. 点按前微调:_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 模型化"的取舍。

触发器从哪来

项目自身没有定时器概念,有三种挂法:

  1. 外部定时器:cron 或 systemd timer 直接调/api/*,最简单直接;
  2. iOS 快捷指令自动化:以时间或"连接某 Wi-Fi"为触发条件,用"获取 URL 内容"POST 到电脑上的 server。但要注意,快捷指令自动化在 iOS 上对设备状态有要求(部分触发需要解锁、联网),这与项目"锁屏即断流"的限制互为表里;
  3. 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 的限制清单和源码实现):

  1. 锁屏即断:手机锁屏后 AirPlay 镜像停止,USB 口也会休眠——固件里的usbReady()只能尝试唤醒、唤醒不了就报错,keep_awake也只是每隔几秒轻推指针防止自动锁屏,并不能解锁。所以"到点执行"必须保证执行瞬间手机是亮屏状态,全天候无人值守直接出局。
  2. 不镜像的界面:密码输入、Apple Pay、有版权保护的视频都不会镜像,Agent 看不到这些画面,相关自动化不可行。
  3. 输入仅 ASCII:Roadmap 里"通过 iOS 拼音键盘输入中文"尚未完成,涉及中文内容输入的自动化会卡在"输入"这一环。
  4. 竖屏 only:坐标与校准都按竖屏计算,横屏 App 里的点按和绘图位置会偏。
  5. 依赖常开电脑与局域网:UxPlay 和服务端都在电脑上,手机与电脑必须同网;多网卡机器还要处理 Avahi(mDNS)绑定网卡的问题。
  6. 合理使用边界:只自动化自己拥有或被允许使用的设备,遵守相关 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询