
反向控制别人都是 iPhone 玩 ESP32这个项目让 ESP32 反过来接管你的 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在 ESP32 与 iPhone 的生态里绝大多数玩法都遵循同一个方向iPhone 是主人ESP32 是仆人。翻一翻社区内容铺天盖地的是「用 iPhone / Siri 控制 ESP32 的 LED」「ESP32 接入 HomeKit让苹果设备控制智能家居」「手机蓝牙控制舵机」……控制方向几乎是单向的iPhone 永远是发号施令的那一端。而开源项目 esp32-iphone-agent 把整个方向掉转了过来让一块约 40 元的 ESP32-S3 反过来接管你的 iPhone。板子插上手机的 USB-C 口就摇身一变成一只标准的鼠标加键盘配合 AirPlay 屏幕镜像和任意一个支持视觉的 OpenAI 兼容模型AI 能像人一样「看着」屏幕、思考、点击替你完成真实操作——在白板里画一个笑脸、设置一个每天早上 7 点重复的闹钟、打开设置连上 Wi-Fi。全程不需要 Mac、不需要 Apple 开发者账号、不需要越狱手机上更是一行代码都不用装。本文基于该仓库的真实源码与全网社区情报拆解三件事这个「反向控制」到底是怎么实现的它对你的 iPhone 能做什么、不能做什么以及为什么这种反向玩法天然就比正向玩法更容易让人围观。从「iPhone 控 ESP32」到「ESP32 控 iPhone」一次控制权反转社区里的大多数玩法方向都是「正向」社区里围绕「ESP32 iPhone」的话题几乎全部是正向控制用 esp32_homekit 这类框架把 LED 变成 HomeKit 配件让 iPhone 或 Siri 远程开关灯用掌控板 Siri 语音识别做家居控制用经典蓝牙 SPP 做串口透传让手机 App 控制舵机甚至把 Apple Media ServiceAMS协议搬到 ESP32 上让手机反过来指挥音乐播放。最有趣的是那些「逆向」尝试——伪造 iBeacon 广播包触发 iPhone 的邻近设备弹窗、模拟 HomeKey 解锁门锁——它们的落点也都只是「让苹果设备显示一个通知」或「解锁一把锁」并没有真正操作手机本身。整个社区缺的是让一块 40 元的板子反向接管 iPhone 的完整闭环。esp32-iphone-agent 恰好补上了这一环。反转的关键把 iPhone 当成一台「被外接键鼠的电脑」项目的核心洞察写在其架构里与其去攻破 iOS 的自动化接口XCTest / WebDriverAgent 路线需要签名、开发者账号、测试辅助 App不如走一条「人操作手机」的同一路径——看屏幕、动指针。整条链路被拆成眼、手、脑三段全部记录在仓库源码中眼AirPlay 镜像。手机把屏幕镜像到电脑上的 UxPlay 接收端GStreamer 管道把视频流转成一帧帧 JPEG供 Agent 与网页使用。见 screen.py 中Screen类的实现——它用videorate jpegenc fdsink拼出一条流水线以 8 fps、质量 75 产出供模型判读的画面。手USB HID 桥。插在手机上的 ESP32-S3 被识别为标准 USB 鼠标 键盘。打开 iOS 辅助触控AssistiveTouch后鼠标驱动屏幕上的圆形指针点击就是点按拖动就是滑动。固件 hid_bridge.ino 全部代码只有一百多行职责被刻意压到最小——接收 TCP 行命令执行回复ok。脑规划模型 执行模型。规划模型根据目标和当前屏幕写出最多 6 步的简短计划执行模型每轮看最新截图输出下一个动作。两个角色可以用同一个模型也支持用ACTOR_*/PLANNER_*环境变量分别指定。提示词与动作集定义在 agent.py。一张对比表看懂与 XCTest 路线的差异项目 README 里有一张很直观的对比表把这条「外设路线」与传统自动化路线的门槛差异列得清清楚楚ESP32 iPhone AgentXCTest / WebDriverAgent 类工具Apple 开发者账号不需要需要给测试程序签名Xcode不需要需要电脑Mac或 LinuxMac手机上安装 App不需要需要装测试程序越狱不需要不需要额外硬件ESP32-S3 开发板约 40 多元USB 线任意 App包括游戏可以只看像素大多可以取决于无障碍控件树最后一行尤其值得玩味因为这套方案只依赖「像素 指针」这两样 iOS 对任何人都开放的东西所以它不挑 App——游戏、剪视频、外卖下单凡是人能看到的界面它都能碰不受控件树暴露程度的限制。硬件门槛一块 40 元的板子硬件清单极简全部来自 README.mdESP32-S3 开发板实测使用 Seeed Studio XIAO ESP32S3 普通版不带摄像头的 Sense 版、不带排针海外约 7 美元国内淘宝搜「XIAO ESP32S3」约 40–50 元。任何 USB-C 口直连 S3 原生 USB 的板子都可以。iPhoneUSB-C 机型直接插Lightning 机型用 Lightning 转 USB 相机转换器。板子由手机供电。电脑macOS 或 Linux与手机同一局域网运行 UxPlay 与服务端。视觉模型任何支持图片输入、兼容 OpenAI 接口的对话模型。上手刷固件只需要三条命令见 快速开始cp hardware/hid_bridge/secrets.example.h hardware/hid_bridge/secrets.h # 编辑 secrets.h填 2.4 GHz Wi-Fi 名称和密码以及运行服务端的电脑 IP hardware/flash.sh # 可选参数[串口] [--debug]secrets.h只有四个宏——Wi-Fi 账号密码和服务端地址见 secrets.example.h。随后在server/目录装依赖、填.env、启动python -m hidagent浏览器打开http://电脑IP:8890就能看到控制台。它到底能对你的 iPhone 做什么能力边界速览两个官方演示画笑脸、设闹钟项目提供了两个最有代表性的演示任务。第一个是「打开白板画一个笑脸」Agent 先搜索并打开白板 App再规划出一组连续笔画逐笔画出笑脸——每一步的截图都会留在「步骤截图墙」上点按位置和笔画轨迹被叠加标注出来。第二个是「设置早上 7:00 的闹钟每天重复然后保存」Agent 打开时钟在时间滚轮里直接输入 0700在「重复」里逐次勾选每一天最后保存。前者考验「连续笔画」这种最像人的精细操作后者考验「滚轮输入 多项勾选」这种典型的界面流程——两个案例恰好覆盖了这类 Agent 最有价值的两类能力绘图与表单操作。眼、手、脑三段式源码级别的分工三段式分工不是概念包装而是仓库里可以逐行验证的真实模块screen.pyScreen类守护 UxPlay 进程进程退出会自动拉起从 JPEG 帧头部读出宽高比并提供settled()等画面静止与fresh()等新帧到达两个时间原语——它们被用来判断「动作后屏幕到底变没变」。hid_bridge.ino固件把 TinyUSB 的USBHIDMouse和USBHIDKeyboard包装成极简命令集。值得注意的细节move采用恒定步长每 8 ms 最多移动 10 个单位让 iOS 的指针加速度保持可预测home命令把指针狠狠甩进左上角作为每次动作的基准归零。agent.pyPLANNER_PROMPT教模型「只规划目标需要的、你亲眼看到的操作绝不凭空捏造账号或界面」ACTOR_PROMPT则把可执行动作收敛为一个封闭集合——tap / swipe / path / circle / type / key / home / back / wait / replan / done / fail坐标统一是 0–1000 的相对坐标一次回复最多 6 条DO行。llm.py极简的 OpenAI 兼容客户端把当前截图以data:image/jpeg;base64的形式与文字提示拼进 messagesPOST 到/chat/completions。它还处理了一个很现实的兼容性细节LLM_TOKEN_PARAMauto时若服务端返回 400 且提示需要max_completion_tokens新版 OpenAI 模型会自动切换参数名。闭环不是「点到为止」对位、校验、重规划这套系统最硬核的部分是它把「点错了怎么办」当作一等公民来处理。核心逻辑在 phone.py 和 vision.py指针对位与校准。鼠标是相对移动的所以服务端必须始终跟踪指针「自以为在哪」。每次点按前如果目标是小而密集的控件列表行、勾选框、小图标模型会标注precise服务端执行_aim()先轻轻左右挪动指针NUDGE 12个鼠标单位在前后两帧画面里用图像差分找出指针的真实位置偏了超过容差AIM_TOLERANCE 0.008约 0.8% 屏宽就立刻纠正再把这次的误差点记录进一条直线拟合让后续动作越做越准found before and after and (vision.pointer(before, after, (x, y), shift) or vision.pointer(before, after, (0.5, 0.5), shift, reach(0.5, 0.5))) if not found: return fx, fy found if max(abs(fx - x), abs(fy - y)) MAX_MISS: # 只从正常漂移中学习防止异常读数污染 self._seen[x].append((self._fix(x, x), fx)) self._seen[y].append((self._fix(y, y), fy)) self._save() if abs(fx - x) AIM_TOLERANCE and abs(fy - y) AIM_TOLERANCE: return dx, dy round((x - fx) * self.span[w]), round((y - fy) * self.span[h]) # 当场修正偏差 await self.device.send(fmove {dx} {dy})动作后屏幕校验。每轮动作结束服务端用 vision.py 的changed()对比动作前后的画面——指针经过的轨迹会被遮罩掉状态栏也被忽略所以「指针动了」不会误判为「屏幕变了」。点空了会被如实记为screen did NOT change下一轮模型必须换个位置或换种方式重试而不是将错就错继续点。卡住就重新规划。如果同一个动作重复 3 次且每次都「没引起变化」_repeating()判定见 agent.pyAgent 会带着失败上下文重新写一份计划Wi-Fi 链路断了、模型回复格式非法这类异常也会被捕获并按「hiccup」记录后自动恢复连续 3 次才放弃。整套循环最多 40 步每一步的思考时长与执行时长都被记录并展示。网页控制台看得见的现场够得着的兜底控制台index.html既是观察窗也是兜底闸实时手机画面点击 点按拖动 滑动滚轮 滚动全部通过 FastAPI 接口app.py 的/api/tap、/api/swipe、/api/scroll直达板子。手动操控Home、返回、输入文字、组合按键以及一键校准——校准失败时它会请你「在实时画面里精确点一下圆形指针」一秒钟手工完成。步骤截图墙模型每轮决策所依据的截图按时间钉在墙上红色波纹标出点按、黄色轨迹标出滑动与笔画旁边附上模型的英文思考中文界面下优先显示其中文翻译和思考/执行耗时点击卡片可放大。紧急停止大红按钮或键盘 Esc立即终止 Agent 并释放鼠标按键后台还会把指针归位保证任何状态都不会留下「长按不松手」的残局。界面内置英文与简体中文双语见 i18n.js。板子协议一条命令一个 ok板子本身「零逻辑」所有决策都在电脑端。它通过 Wi-Fi 与服务端建立 TCP 连接连接时先发一行hello 上次重启原因 开机毫秒数之后服务端每行发一条命令板子回复ok或err 原因。完整协议就十来个词见 hid_bridge.ino命令作用ping健康检查home把指针推到左上角已知位置move dx dy相对移动指针匀速移动让 iOS 指针加速度可预测press/release/click左键按下 / 松开 / 点击scroll v h滚轮type text输入 ASCII 文字key combo按键例如enter、cmdh、cmdspace工程细节同样藏在小处Wi-Fi 断开会自动松开所有按键并重连防止手势中断留下长按手机锁屏后 USB 休眠板子会先尝试远程唤醒唤不醒就立刻回复err phone usb asleep绝不干等固件里挂了一个 8 秒看门狗万一主循环卡死会自动重启。这些都被写进 README.md 的「板子协议」一节。边界能做什么、暂时做不了什么项目在 README.md 里毫不避讳地列出了限制这些边界本身就是「它到底能干什么」的重要一半iOS 不镜像的部分画面输入密码、Apple Pay、有版权保护的视频Agent 看不到手机锁屏后镜像断开Agent 工作时需要关闭自动锁定键盘输入仅支持 ASCII中文输入在路线图中坐标与校准按竖屏计算横屏 App 暂不支持修改辅助触控跟踪速度后需要重新校准多网卡的 Linux 机器上可能需要把 AvahimDNS限制到手机所在网卡。这些「做不到」和「能轻易做到」一样都来自同一套设计哲学——只依赖 iOS 向所有人开放的像素与指针通道因此不需要越狱但也要接受该通道本身的物理限制。大脑可替换从云端 API 到本地模型模型层是彻底的即插即用。.env里只需配置LLM_BASE_URL / LLM_MODEL / LLM_API_KEY任何 OpenAI 兼容的视觉模型都能上岗想精细化控制还能用ACTOR_*/PLANNER_*分别覆盖执行与规划两个角色的模型。项目自带的本地方案是 NVIDIA DGX Spark 上张量并行部署的Qwen3.8-Flash-Next实测关闭思考模式后每个动作约 1.3 秒、每次规划约 2 秒——这个时延已经接近「可围观」的实时感。仓库里还留了一个实验性的极简服务 transformers_server.py可以在本地用 Hugging Face 视觉语言模型如 DiffusionGemma跑出一个 OpenAI 兼容端点配合 run-docker.sh 一键容器化目标是将来做到完全离线。为什么反向控制比正向控制更容易让人围观观赏性AI 的「操作直播」天生有戏正向控制iPhone 点一下ESP32 亮个灯的叙事是「结果」——灯亮了三秒讲完。反向控制AI 操作真实 iPhone的叙事是「过程」——规划怎么写、每步看到了什么、为什么这么点、点空了怎么补救全都被步骤截图墙、实时日志和思考耗时可视化摊开在你面前。模型的每一次犹豫和纠错都是内容本身何况还有演示视频把整个过程录下来传播。这种「把 AI 的决策过程变成可回放、可复盘、可拆解的视频素材」的特质正是它天然适合围观的原因。反差感40 元硬件撬动封闭生态社区对「逆向打通苹果生态」这件事的兴趣是持续且可验证的伪造 iBeacon 广播包触发 iPhone 弹窗、用 AMS 协议接管手机音乐、用 HomeKey 协议模拟智能门锁……这类文章和数据一直有稳定的讨论热度因为它们满足同一种好奇——苹果的围墙花园里能不能从外面伸进去一只手而 esp32-iphone-agent 把这个叙事推到了新的高度不再只是「弹个窗、放首歌、开把锁」而是用一块 40 元板子 任意视觉模型完成对 iPhone 的完整、闭环、可纠错的操作。反差感的量级完全不同。工程上的「干净」让它可复现、可传播围观之余这个项目能持续获得讨论还因为它的工程极其「干净」每个环节都可以低成本复现无状态固件板子不含任何 AI 逻辑只有一套十来个命令的协议出问题可以直接在电脑端调试一键可复现README 甚至给出了「把整段 setup 说明直接丢给 Claude Code / Codex 之类的 AI 编程助手」的玩法让 AI 自己完成刷固件、装 UxPlay、配.env的整套部署全链路可观测设置HIDAGENT_DEBUG1后每次运行会在~/.hidagent/traces/下保存一个文件夹内含steps.jsonl每次模型调用的提示词、原始回复与耗时和模型每轮看到的截图 debug.py复盘一个失败案例的成本极低。同类方案对比为什么这条路线更轻仓库 README 的相关项目对比表正好解释了它在竞品图谱中的位置思路最接近的 VersaiOS 需要把 ESP32 用 USB 串口绑在电脑上且以 Windows 桌面端为主actell 要在 iPhone 上装 Agent App 并依赖开发者模式与自签名glassbox 需要 PicoKVM 这类 HDMI 采集硬件phone-agent 需要 Mac Xcode 编译签名。而 esp32-iphone-agent 的答案始终是同一句一块板、一台 Linux 或 Mac、一个视觉模型手机上什么都不装。唯一不变的前提是开启 iOS 里人人可用的辅助触控与屏幕镜像——这恰好是它「轻」的来源。围观之外边界与合理使用最后说点冷静的。反向控制不是万能钥匙密码输入、Apple Pay、DRM 视频这些不镜像的界面它永远看不到横屏 App 和中文输入仍在路线图上。项目也在 README.md 里郑重写下了合理使用原则——只自动化你自己拥有或被允许使用的设备与账号遵守相关 App 的条款并且时刻盯住运行现场、把紧急停止放在手边。毕竟 Agent 是在替你动手方向反转之后责任与乐趣一样大。【免费下载链接】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),仅供参考