一句话总结
一块 约 7 美元的 ESP32-S3 板子插进 iPhone 的 USB-C 口,就同时变成屏幕镜像的接收端(AirPlay,当眼睛)和标准 USB 键鼠(HID,当手);推理跑在同一台手机上的一个 App里,把截图发给任意 OpenAI 兼容的视觉模型,再根据返回的动作去点、滑、打字。不需要电脑、不需要越狱、不需要开发者账号。这个项目 2026-10-11 建仓,一周拿到 2100+ 星。
数据来源
本文事实来自该项目 README(github.com/onehumanbeing/esp32-iphone-agent,MIT 协议,hardware/hid_bridge/src/airplay/ 部分从 UxPlay 移植、为 GPL-3.0)与 GitHub API 于 2026-10-15 的仓库数据(2116 星 / 284 fork / 主语言 C / 创建于 2026-10-11)。硬件价格为其 README 给出的约 7 美元(Seeed Studio XIAO ESP32S3 普通版),不同渠道会有差异。文中所有能力上限、限制条款均照抄自 README 的 Limitations 与 Roadmap 章节,未做推测性延展。
为什么有人要做这件事:真机自动化的三道门

iPhone 上的自动化一直有三条不好走的路:
- XCUITest / WebDriverAgent 路线(例如
mobile-mcp、Midscene):要 Mac、要代码签名、要开开发者模式; - 越狱路线:能力最强,代价是设备状态和账号风险;
- 「人肉代打」路线:手机上装遥控 App、或者用蓝牙鼠标点,但眼睛和手是分开的,agent 看不到屏幕就不能闭环。
这个项目的切入点很聪明:把「眼睛」和「手」做成一块板子。AirPlay 让 iPhone 主动把画面投出来(这是 iOS 原生能力,不需要越狱),USB HID 让板子被系统当成一只普通鼠标键盘(也是原生能力,不需要签名)。两条原生通道一拼,agent 就有了完整的「感知—动作」环——而且只额外花 7 美元。
它是怎么工作的:一条 iPhone 自己绕自己的回路

README 里给出的结构可以拆成三层:
iPhone ──屏幕镜像(Wi-Fi)──▶ ESP32-S3: AirPlay 接收 ──BLE──▶ ESP32 Agent App(同一台 iPhone)
▲ 自建热点 / H.264 透传 解码 → 视觉模型 → 动作
└──────── USB HID 鼠标 + 键盘 ◀──────── BLE 指令 ◀────────────────────┘
- 眼睛 —— AirPlay 投给板子。 板子自己开一个 Wi-Fi 热点,在手机的「屏幕镜像」列表里以 ESP32 Agent 出现。它保留 H.264 码流而不在板子上解码,通过 BLE 转发给 App。手机在这期间用蜂窝数据访问模型,所以模型侧不受影响。
- 手 —— USB HID。 板子就是一枚标准 USB 鼠标和键盘。打开 AssistiveTouch 后,鼠标会变成一个屏幕指针:于是「点击 = 轻点」「拖拽 = 滑动」。
- 脑 —— 手机上的 App。 App 解码画面、把截图交给任意 OpenAI 兼容视觉模型,跑一 planner(规划)+ actor(执行) 两段式:轻点、滑动、画、打字、按键、回主屏、结束。执行时 App 在后台运行,灵动岛显示当前在做什么。
- 闭环。 指针坐标是相对值,所以 App 会自己跟踪指针、并把它「归位」到角落;在精确点击之前先抖动一下指针、在画面上找到它再修正偏差。每次动作后等画面稳定,并告诉模型「有没有变化」;板子/热点/镜像链路掉了会自动暂停,并从同一步继续。
- 复盘。 每一次运行都留在手机上,可以把点击和滑动画在画面上逐步回放。
这套设计里最值得注意的不是模型,而是**「相对指针 + 归位 + 抖动定位」**这个细节——它是整条链路上唯一一处必须用工程手段兜住物理不确定性的地方。在真机上点错一下的代价,比模型多思考一轮高得多。
硬件清单:一块板子 + 一台 iPhone

README 给出的清单很短:
| 部件 | 要求 |
|---|---|
| ESP32-S3 开发板 | 实测用 Seeed Studio XIAO ESP32S3(普通版、8MB PSRAM;不是 Sense、不是 Plus),约 7 美元。任何 USB-C 带原生 USB 且有 PSRAM 的 ESP32-S3 应该都能用 |
| iPhone | iOS 18 或更新,且有蜂窝数据(Wi-Fi 被板子的热点占用)。USB-C 机型可直接插;Lightning 机型需要一个 Lightning 转 USB 相机转接头。供电由手机提供给板子 |
| 视觉模型 | 任意接受图片的 OpenAI 兼容接口:云 API 或你自己的服务 |
| 一台 Mac + Xcode | 只在烧写固件和构建 App 时需要,运行阶段不需要 |
对照 README 的演示任务:「设一个每周一、周二重复的 8:00 闹钟,然后保存」——agent 需要离开自己的 App、打开时钟、在滚轮上输时间、勾选星期、保存。这正是「真机 + 视线 + 指针」这套组合才能完成的一类任务。
上手四步:板子烧一次,App 装一次,然后手机上配四件事
第一步:烧写板子(插在 Mac 上)
arduino-cli lib install "NimBLE-Arduino@2.5.1"
hardware/flash.sh # 可选参数: [串口] [--debug]
README 特别提醒:一定要用 flash.sh 构建——它会应用 hardware/hid_bridge/nimble_cfg.h 里的 BLE 缓冲区大小设置。环境需要 arduino-cli、ESP32 core 3.3.x 和 NimBLE-Arduino 2.5.x。
第二步:装 App
cp ios/Config/Local.xcconfig.example ios/Config/Local.xcconfig # 填 DEVELOPMENT_TEAM 和 IA_BUNDLE_ID
open ios/IPhoneAgent.xcodeproj # 在 iPhone 上跑 IPhoneAgent scheme
项目用 XcodeGen 从 ios/project.yml 生成(cd ios && xcodegen)。免费 Apple ID 就能签名(每 7 天需要重签一次);「一键加入热点」需要 Hotspot Configuration 能力(付费账号),没有的话 App 会把热点密码显示出来让你手动连。
第三步:在 App 里做一次设置(四步,每步 App 会自检)
- Plug Me In —— 通过蓝牙配对板子;
- Let Me See the Screen —— 加入板子的 Wi-Fi,然后控制中心 → 屏幕镜像 → ESP32 Agent;
- Let Me Use the Pointer —— 打开 AssistiveTouch,App 自动校准指针;
- Give Me a Brain —— 填入模型 endpooint 和 key(存在 Keychain 里)。
第四步:给任务
输入目标(例如 「打开设置,进入 Wi-Fi」)按 Start。可以从灵动岛停止,或用 Siri、快捷指令、小组件、控制中心运行存好的任务。
模型侧:任意 OpenAI 兼容的视觉接口都可以(vLLM、SGLang、llama.cpp、Ollama、云 API),App 会列出 endpoint 上的模型让你选,还支持规划与执行分别指定不同模型;提示词是 prompts/ 下的纯文本,可以直接改了重编。项目作者自己是用 nvidia/Qwen3.8-Flash-Next-NVFP4 跑在两台 DGX Spark 上开发的。
能力边界:它慢、它小、它看不全
这里必须照抄 README 的限制,因为它决定了这个东西现在能干什么、不能干什么:

- 带宽是硬上限:BLE 大约只能跑 300-500 kbps,所以镜像画面很小(480×1040)且 ≤5 fps;每一步要几秒钟,其中大部分时间花在模型上。
- 有些界面 iOS 根本不给镜像:密码输入、Apple Pay、DRM 视频——agent 看不到;而且手机一锁屏,镜像就停。
- 运行期间手机的 Wi-Fi 被板子热点占用:模型只能走蜂窝数据。
- App 用了私有 API(
suspend)让自己退到后台:自建自用没问题,上架 App Store 之前必须换掉。 - 键盘输入只支持 ASCII,横屏应用不支持。
Roadmap 上待办也写得很实在:横屏应用(当前坐标与校准都按竖屏假设)、非 ASCII 文本输入(例如通过 iOS 拼音键盘输中文)、更快的步进(一次模型调用做多个动作、只在必要时才校准指针)。
一句话概括边界:这套方案现在的天花板是「几秒钟一步、看得清竖屏、只输英文」的真机操作类任务——它离「替你刷手机」还很远,但离「在一台真机上验证一条产品流程」已经很近了。
同类方案对比:差在「电脑、签名、采集硬件」这三样
README 自己列了一张对照表,我把它整理成中文(差异列来自原文):
| 项目 | 路线 | 与本项目的差异 |
|---|---|---|
| 本项目 | 板子做镜像接收 + USB HID,Agent 跑在同机 App 里 | —— |
| VersaiOS | UxPlay 镜像 + ESP32-S3 蓝牙鼠标 + 视觉模型 | 需要一台电脑;一条指令点一次 |
| ja1chen/actell | 通过 Apple CoreDevice 调试通道把 Agent 装进 iPhone | 需要开发者模式和 Developer Disk Image |
| AidenAI-IO/aiden-firmware | HDMI 采集 + USB 键鼠 + 多模态模型 | 需要采集硬件;主要面向 Android |
| yoyicue/glassbox | PicoKVM HDMI 采集 + USB HID | 需要 macOS 控制器与 PicoKVM |
| boboabw/phone-agent | ESP32-S3 蓝牙 HID + AssistiveTouch,Agent 作为 iPhone App | 最接近的一版;本项目多了「板子上的眼睛」(AirPlay) |
| VKCOM/devicehub | 给 iOS 设备农场用的 ESP32 蓝牙鼠标 | 设备农场工具,不含 AI agent |
mobile-mcp / Midscene(WebDriverAgent 系) | XCUITest 驱动 | 需要 Mac 和代码签名 |
这张表其实标出了这个项目真正的取舍:它把「电脑」和「签名」这两个门槛换成了「带宽」和「画质」——用一条 300-500 kbps 的 BLE 链路,换掉了 Mac、越狱、开发者模式这三样东西。
一周 2100 星,说明的是什么
这是「computer-use 物理末端」这条路第一次被做到 7 美元级别。 过去一年里,agent 用电脑的方式基本是软件层(浏览器 agent、桌面 agent),而真机 iPhone 一直是那条「要 Mac + 签名」的难路。这个项目的贡献不在于模型,而在于用两块原生能力(AirPlay + USB HID)拼出了一条不需要任何特权的通道。
同时也得看清它的反作用力:
- 私有 API 那一处是明确的账:作者自己写了「上架 App Store 之前要替换」——也就是说这条路目前只能自建自用。
- iOS 不给镜像的界面(密码、支付、DRM)恰好是最敏感的那部分,这既是隐私保护,也决定了它做不了很多「自动化测试」想做的事。
- 「看小图、慢步进」意味着它的模型成本结构很特别:每步都要发一张 480×1040 的截图,step 数与模型单价直接决定单任务成本——这也解释了 roadmap 里「一次调用做多个动作」为什么排在前列。
总结
- 一块约 7 美元的 ESP32-S3 + 一台 iPhone 就够:板子当 AirPlay 接收端(眼睛)和 USB HID 键鼠(手),Agent 跑在同机 App 里,模型可以是任意 OpenAI 兼容视觉接口。
- 零门槛是它的核心卖点:不需要电脑、不需要越狱、不需要开发者账号(只在烧固件和构建 App 时借一次 Mac + Xcode)。
- 工程难点在闭环,不在模型:相对指针要归位、精确点击前要抖动定位、动作后要等画面稳定并把「有没有变化」反馈给模型,链路断了要能从同一步续跑。
- 代价写得明明白白:BLE 300-500 kbps → 480×1040、≤5 fps、每步几秒;密码/Apple Pay/DRM 界面看不到;锁屏停;Wi-Fi 被热点占用;只支持 ASCII 与竖屏。
- 它把两个门槛换成了另外两个:用「带宽与画质」换掉「电脑 + 代码签名」,这是这一周 2100 星背后的取舍。
- 目前只能自建自用:App 里有一处私有 API(
suspend),作者明确写了上架前必须替换。
如果你手边正好有一块 ESP32-S3 和一台 iOS 18 的 iPhone,这是目前成本最低的「真机 computer-use」实验台;如果你在评估真机自动化方案,先问自己一个问题:要的是「不受权限限制的覆盖率」,还是「不受画质限制的精度」——这个项目赌的是前者。
图片出处:封面与架构/流程示意图由 UU AI Hub 自制;项目 logo 与真机演示照片取自该项目 GitHub 仓库 docs/images/(MIT)。数据来源:github.com/onehumanbeing/esp32-iphone-agent README 与其 GitHub API 元数据(2026-10-15 抓取,2116 星 / 284 fork / 创建于 2026-10-11)。