那些年试过的 ESP32 控手机方案:iBeacon 弹窗、AMS 音乐协议、HomeKit,这次轮到它了
【免费下载链接】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 的遥控器",是硬件圈经久不衰的执念。从 2019 年社区里用hap.h把 ESP32 变成 HomeKit 灯泡,到 2026 年有人用广播帧伪造让 iPhone"疯狂弹窗",再到基于 BLE 的 AMS 音乐协议精准控制播放器——每条路线都解决了一部分问题,也都在某个边界上戛然而止。本文梳理这三条真实存在的技术路线各自的原理与天花板,然后基于 esp32-iphone-agent 仓库源码,拆解第四条路线的实现:它让 AI 通过一块约 40 元的 ESP32-S3 完整地"看"和"操"一台真实 iPhone,无需 Mac、无需开发者账号、无需越狱。
路线一:iBeacon 伪造弹窗——只触发通知,控制不了
2026 年 2 月 CSDN 上有一篇《ESP32伪造iBeacon触发Apple设备弹窗原理与实现》,把社区流行的"evil apple juice"类项目讲得很透。核心事实是:只要构造一段合法的 BLE 广播帧,iPhone/Mac/iPad 就会在锁屏或通知中心弹出"附近有设备"的提示。
触发机制不依赖任何 GATT 连接,苹果在bluetoothd守护进程里内置了一套广播帧过滤器,直接在链路层解析 AD 结构。最小有效包长这样:
02 01 1A // Flags: General Discoverable, BR/EDR Not Supported 1A FF 4C 00 02 15 // Manufacturer Data: Apple ID 0x004C, iBeacon Type 0x0215 38 5D 8A 37 ... // 16 字节 Proximity UUID C7 2B 00 00 // Major + Minor C5 // TX Power = -59 dBm解析流水线是五级过滤:PHY 层校验 PDU → Host 层检查 Flags → 检测到 Company ID0x004C激活 AppleBeaconParser → 校验 32 字节 Payload 结构与 Major/Minor 非全零 → 结合 RSSI 与 TX Power 评估距离可信度,最后才向 SpringBoard 发kCBAdvEventProximityAlert事件弹窗。任何一个环节字节序不对,整包静默丢弃——这也是很多"仿冒失败"项目的死因。
但这条路的边界非常清楚:它能触发 UI 提示,却没有任何可编程的控制通道。弹窗本身不携带指令,用户点了"连接"也进不了你的逻辑,你甚至无法得知弹窗是否被看到。它本质是一个单向的"协议探针",除了让 iPhone 响一下,控制面为零。用来做闹钟提醒式的存在感知尚可,离"控制手机"差了整整一个双向通道。
路线二:AMS 协议——只控音乐,领域窄
另一条成熟的路线是 Apple Media Service(AMS)。2026 年 4 月的《手把手教你用蓝牙控制iPhone音乐:AMS协议详解与ESP32实战》给出了完整的工程细节:AMS 跑在标准 GATT 服务上,由三个特征构成:
| 特征 | UUID | 作用 |
|---|---|---|
| Remote Command | 9B3C81D8-57B1-4A8A-B8DF-0E56F7CA51C2 | 发送播放/暂停/音量等远程命令 |
| Entity Update | 2F7CABCE-808D-411F-9A0C-BB92BA96C102 | 订阅播放状态变更通知 |
| Entity Attribute | C6B2F38C-23AB-46D8-A6AB-A3A870BBD5D7 | 读取歌曲名、歌手、专辑、进度等元数据 |
实体模型分三类:Player(播放状态、音量)、Queue(播放队列、随机/循环模式)、Track(音轨元数据,UTF-8 编码)。相比 iBeacon,AMS 是真正的双向闭环——ESP32 发命令、收状态、读元数据,还能处理 iOS 多版本和主流音乐 App 的兼容性差异。
但它的天花板同样明显:整个协议只覆盖媒体控制这一个垂直领域。你控制不了"打开设置改 Wi-Fi",控制不了"回个微信",更谈不上跨 App 操作。AMS 把 ESP32 定位成一个"高配版蓝牙耳机按键",协议定义了它能碰什么,也就定义了它不能碰什么。领域锁死,是这条路线的根本限制。
路线三:HomeKit 桥接——官方通道,方向反了
还有一大批教程走的是 HomeKit 路线,时间跨度从 2019 年一直延续到 2025 年:早期用hap.h框架把 ESP32 注册成配件,后来用 HomeSpan,进阶的用 ESP-IDF 搭 HomeKit ADK 环境。这些方案都能实现"用 iPhone/Siri 语音控制 LED 灯、门锁",配合 MFi 相关的配对流程。
然而细看技术本质会发现:这条路线是让 iPhone 控制 ESP32,而不是 ESP32 控制 iPhone。方向恰好是反的。HomeKit 是"苹果设备 → 配件"的单向管控通道:ESP32 作为被管控方暴露 service/characteristic(比如一个灯泡的 On/Off 特性),Siri 或家庭 App 来读写它。你得到的是一个"能被 Siri 叫醒的智能灯",而不是一个"能帮 Siri 干活的手"。加上 HomeKit 配件必须过 MFi 认证流程(或使用非官方 SDK 的灰色地带),这条路在"遥控手机"这个目标上天然错位——它把问题从"控制端"挪到了"被控制端"。
终局对比:esp32-iphone-agent 的"全量控制"野心
前面三条路线的共同缺陷可以总结为一句:要么只有单向信号,要么领域被协议写死,要么控制方向根本反了。esp32-iphone-agent 换了一个思路——不走任何 iOS 私有协议,而是复制"人操作手机"的两条通路:用眼睛看屏幕,用手点屏幕。仓库的自我定位是:
Let an AI model use a real iPhone — with a $7 ESP32. No Mac, no developer account, no jailbreak.
眼:AirPlay 镜像,把屏幕变成 JPEG 帧流
眼睛的部分在 server/hidagent/screen.py:电脑上跑 UxPlay 作为 AirPlay 接收端,手机通过系统自带的"屏幕镜像"把画面投过来;随后一条 GStreamer 管道videorate ! jpegenc quality=75 ! fdsink把视频流以 8 fps 压成 JPEG 写入管道,服务端只保留最新一帧供 Agent 与网页使用。值得一提的细节是_supervise里的守护逻辑——UxPlay 在某些断开场景会自己退出,所以它被做成"退出即重启"的常驻进程。
手:USB HID 桥,ESP32 只当一个"哑外设"
手的部分是 hardware/hid_bridge/hid_bridge.ino。一块 ESP32-S3 插进 iPhone 的 USB-C 口(Lightning 机型用转接器),通过 TinyUSB 把自己枚举成一个标准 USB 鼠标加键盘。iOS 打开辅助触控(AssistiveTouch)后,鼠标移动会驱动屏幕上的圆形指针:点击 = 点按,拖动 = 滑动。
关键设计是板子不含任何逻辑:它通过 Wi-Fi 连到电脑,执行一行一行的 TCP 命令,每条命令回ok或err <原因>:
| 命令 | 作用 |
|---|---|
ping/home | 健康检查 / 把指针推到左上角已知位置 |
move <dx> <dy> | 相对移动,STEP=10单位每 8ms 匀速上报,保持 iOS 指针加速度可预测 |
press/release/click | 左键按下 / 松开 / 点击 |
scroll <v> <h>/type <text>/key <combo> | 滚轮 / ASCII 输入 / 组合键 |
固件里还有几个很工程化的细节:Wi-Fi 断开自动重连并释放所有按键(防止长按手势被截断);手机锁屏时 USB 挂起,板子先tud_remote_wakeup()尝试唤醒,唤醒失败立即回err phone usb asleep,绝不卡死等待;8 秒看门狗兜底,板子无响应就自动重启。电脑侧的对端在 server/hidagent/device.py,负责按命令类型估算超时(move按距离、type按字符数)、断线自愈与心跳保活。
脑:规划模型 + 执行模型,把"点屏幕"变成 AI 能懂的语言
真正让它从"遥控器"升级成"Agent"的是 server/hidagent/agent.py 里的双模型架构。规划模型(planner)拿到目标和当前屏幕,输出不超过 6 步的计划;执行模型(actor)每次看最新截图,输出THINK:加一条或多条DO:指令。动作集是精心设计的领域语言:
tap X Y [precise] swipe X1 Y1 X2 Y2 path X1 Y1 X2 Y2 … circle X Y R type TEXT key COMBO home | back | wait replan done ANSWER | fail REASON坐标统一归一化到 0–1000 的屏幕相对坐标,和帧尺寸无关。两个模型可以是同一个模型,通过 server/hidagent/llm.py 对接任意 OpenAI 兼容接口,图片以 base64image_url传入——这意味着云端 API 或自部署的 vLLM/SGLang/Ollama 都能当大脑。
闭环:指针校准、屏幕变化检测、卡住重规划
单纯"看 + 点"是不够的,真实世界里有漂移、有误触、有网络抖动。这个项目把闭环做得相当扎实:
- 指针闭环:server/hidagent/phone.py 里每次点按前(
precise模式)会横向轻推指针 12 个单位,在镜像画面里用 server/hidagent/vision.py 的pointer()找到它的真实落点,超过 0.008 屏幕比例的偏差先纠正再按;同时把"瞄准点 → 实际落点"的样本存进直线拟合(_fix),校准随运行越用越准。每隔 10 次手势还会home一次把指针怼回左上角,消除累计漂移。 - 屏幕变化检测:
vision.changed()对前后帧做两级灰度差分(32×64 粗检 + 半分辨率细检),并屏蔽指针轨迹区域与状态栏,所以"屏幕没变"是可信的信号——点空了会被发现并重试,而不是将错就错。 - 卡住重规划:同一个动作连续重复 3 次且屏幕无变化,判定为陷入循环,触发
replan (stuck)让规划模型换一条路;模型回复解析失败自动降采样重试;板子断线自动等待重连。
服务端是 FastAPI 写的 server/hidagent/app.py,网页端支持实时画面点按/滑动、实时日志、步骤截图墙、紧急停止(Esc)与中英双语界面。
效果与成本
仓库里留了两张真实运行截图。下图是"打开白板画一个笑脸"的完整过程——Agent 搜索并打开 App,用连续的笔画画出笑脸,每一步模型做决定时看到的截图都留在截图墙上,并叠加了红圈点按标记与黄色笔画轨迹:
另一张是"设置每天早上 7:00 重复的闹钟并保存":Agent 打开时钟,在时间滚轮里直接输入0700,在"重复"里逐天勾选,最后保存:
硬件门槛低得惊人:一块 XIAO ESP32S3 普通版(约 40–50 元),USB-C 口直连 S3 原生 USB 即可,iPhone 直接给板子供电;电脑端只要求 macOS 或 Linux 且与手机同网。设备插接状态见下图:
与 XCTest/WebDriverAgent 一类的正统自动化工具相比,差异是结构性的:
| 维度 | esp32-iphone-agent | XCTest / WebDriverAgent |
|---|---|---|
| Apple 开发者账号 | 不需要 | 需要(免费账号签名 7 天过期) |
| Xcode | 不需要 | 需要 |
| 电脑 | Mac 或 Linux | 仅 Mac |
| 手机安装 App | 无 | 需要测试运行器 |
| 越狱 | 不需要 | 不需要 |
| 任意 App(含游戏) | 可以(只看像素) | 大多可以(依赖无障碍控件树) |
这正是它"看像素、动指针"哲学的直接收益:因为走的完全是人的路径,所以手机上什么都不用装、系统什么都不用授权。
当然,"全量控制"目前也有诚实的边界:iOS 不镜像密码输入、Apple Pay 和 DRM 视频;手机锁屏镜像会断;键盘输入仅支持 ASCII;横屏 App 尚未支持。仓库的 Roadmap 也列了后续方向:基于 DiffusionGemma 的纯本地方案(server/serve/transformers_server.py 已有一个实验性的 OpenAI 兼容模型服务)、横屏适配、通过 iOS 拼音键盘输入中文。
回看三条旧路线,iBeacon 提供了"触发"却给不了"控制",AMS 给了"控制"却锁死在音乐领域,HomeKit 干脆把方向做反了。esp32-iphone-agent 的解法是把控制通道拆成"屏幕输入 + 指针输出"两个通用原语,再用视觉模型把它们接进 AI 的推理循环里。当一个只有几十元、比一支笔大不了多少的开发板,插上 iPhone 就能让 AI 替你画图、设闹钟、翻设置——"ESP32 控手机"这个命题,终于第一次做到了全量、闭环、可扩展。
【免费下载链接】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),仅供参考