闭盖立起轻敲,充电盒接管光标
一个合盖的 AirPods 充电盒立在桌面上,Mac 屏幕的光标跟着它转。轻敲盒身正面,等于一次点击。没有拆机,没有焊接,充电盒还是充电盒。
图:合盖充电盒体感控制 Mac 光标的演示画面。来源:IT之家
2026 年 11 月,开发者 Andy Gao(GitHub 用户 musubipapi)以 MIT 协议开源了这套方案,项目名 AirPointer。README 首页写明功能:移动合盖的充电盒就是移动光标,轻敲正面就是点击。
接入只有四步:把 AirPointer 拖进 macOS 无障碍(Accessibility)名单,授权它驱动光标与点击;开盖、闭盖、平放、立起;对着屏幕上三个点校准;轻敲盒身三次完成敲击教学。日常使用按 fn ⌃,随时连接或暂停。
图:连接与校准流程,开盖、闭盖、平放、立起的顺序不能颠倒。来源:AirPointer GitHub 仓库
实测范围写得毫不含糊:AirPods Pro 3 加 macOS 26 加 Apple Silicon,样本是一台 Mac 配一副耳机;AirPods Pro 2 能被识别,但没有测过。把「样本量一」写在最前面的硬件项目不多,这一份先把能力边界亮了出来。
无障碍接口管输出,私有蓝牙协议管输入
整条链路分三层:两个助手进程加一个应用。ClosedCaseRestore 先把 AirPods 的常规蓝牙链路拉起来;ClosedCaseMotion 接着重连一次,因为体感数据通道只在连接建立后的一小段时间内应答。这个应答窗口靠逆向试出来,官方文档不会写。
数据流走单向管道:助手把运动数据写进去,应用每秒回一次心跳。心跳一停,助手立即停掉传感器、释放占用。消费级硬件的私有协议调用里很少见到看门狗设计,这里补上了。
输出侧全是苹果自家的设施。应用拿到无障碍权限后直接驱动光标与点击;指向前光标被临时放大到 2 倍,实际调的是一个 macOS 私有接口。官方通道与私有调用在同一个项目里各司其职。
音频同样安排得很细:会话期间 Mac 的声音和麦克风全部从 AirPods 移走,应用同时对耳机播静音,维持音频链路不断开。姿态解算交给 Orientation.js,把盒子的朝向换算成屏幕坐标;ClosedCaseTap 捕捉朝正面突发的运动特征,命中就触发点击,并在 Mac 上放一声短促提示音。
图:应用窗口、菜单栏面板与指向时的刘海区状态。来源:AirPointer GitHub 仓库
应用崩溃,不会留下一只还在往外吐数据的耳机。拿别人的固件当外设用,心跳加自动回收是应有的自我约束。
30 分钟一到,固件定时器掐断会话
项目里最有分量的内容藏在已知限制一节:合盖约 30 分钟后,会话自动终止,运动数据停发,耳机在重新开盖前不可达。限制来自苹果固件,应用自己没有设。开发者把 AirPods Pro 3 的固件镜像 rkof.bin(H2 芯片,版本 9A348)读了一遍,定位到定时器 0x63 的完整逻辑:
| 固件地址 | 行为 |
|---|---|
0x17d2a4 | 构造状态掩码:掩码非零、dock 状态检查通过且定时器未在跑,就启动定时器;掩码归零则取消 |
0x17d326 | 载入定时时长:1,800,000 毫秒,即 30 分钟 |
0x17d294 | 状态检查:dock 状态等于 6,大概率对应合盖入座 |
0x17cddc | 定时器到期触发:复查状态,随后调用一条不会返回的 fatal assert |
实测会话在合盖后约 1,805 秒终止,与 1,800,000 毫秒加调度余量吻合。README 注明:证据来自固件静态分析与计时统计,实时抓包验证还没有做。
苹果在耳机固件里给闭盖状态的传感器会话挂了看门狗,到期直接拒绝服务。定时器的动机没有官方说法,省电与防止传感器长期空转是合理推断。运动传感器硬件一直是现成的,固件用一条 1,800,000 毫秒的定时器圈定了它的用途。
排障清单里另有两个细节。刚连接后约 20 秒的指针卡顿属正常;会话到期后开盖再合盖即可续用,合盖状态下重连不会重置计时。
副作用清单比功能列表还长
README 在讲怎么用之前,先用一张表讲代价。会话结束会消耗掉充电盒里存储的诊断数据;部分 AirPods 连接设置会停留在会话设定的状态,蓝牙重置后是否恢复,作者注明尚不清楚。
每次连接都会让 AirPods 蓝牙链路瞬断一次,通话中不要连。指向前光标被放大到 2 倍,强退应用后要等下次启动才恢复原尺寸。
数据面干净:所有状态文件留在 ~/Library/Application Support/AirPointer/,不上传任何内容;30 分钟会话的原始运动数据约 20 MB,主动开启录制才会写到本地。征用厂商未开放的硬件,功能清单和副作用清单要一起读。这份逐条标注未知项的诚实,本身就是项目可信度的一部分。
一副打鸭子,验收整条链路
为证明这条链路能干什么,开发者写了一个网页版打鸭子游戏,玩法对着任天堂 Duck Hunt:充电盒充当光枪,挥动瞄准,轻敲开火。选题选得准——只考验瞄准和开火两个动作,对延迟与采样率的要求落在体感指针的能力区间内,又足以暴露延迟毛刺。
交互模式接近 Wii 遥控器的指针玩法。主机厂商当年为这套交互专门造了硬件,如今靠一只音频配件的未公开协议调用复现,门槛是一份 Xcode 构建脚本。
苹果没有开放充电盒传感器接口的迹象,短期也看不到开放的可能。只要无障碍通道还在、固件镜像还能被读出来,这类征用就会继续出现。AirPointer 留下的最有价值的资产是那张四行的固件地址表:下一个想动充电盒传感器的人,可以从 0x17d326 直接开始读。
参考链接:
- AirPointer 开源项目 GitHub 仓库 README
- 打鸭子体感游戏 Demo
- IT之家报道《AirPods 耳机充电盒秒变苹果 Mac 无线鼠标》