文档 · 随安装包分发

排障与兼容性

真实踩过的坑、设备兼容矩阵、已知问题。

目的:把每次实测踩到的坑,变成下一位 AI 的检查项。 维护规则:每做一个新任务,回填一条「现象 / 根因 / 规避 / 证据」;配方级的步骤同步进 给 AI 的操作手册。 最后更新:2026-10-23(新增 §2.2 语音桥) 相关:给 AI 的操作手册(操作手册)· control/README.md(控制层与 §7 坑位,源码仓库)· 接入 AI(MCP)(接入)


0. 开工 30 秒检查

status()      → device / screen / calibrated
screenshot()  → 当前页、列、键盘状态、是否有弹窗

iPhone 端两个总开关(每次新设备/换机必查,埋得很深) 1. 辅助触控必须开:设置 → 辅助功能 → 触控 → 辅助触控。不开就没有鼠标指针, 所有 click/move 都像“没反应”。 2. 鼠标键「使用主键盘」必须关:设置 → 辅助功能 → 触控 → 辅助触控 → 指针设备 → 鼠标键 → 使用主键盘。开着时键盘被当成鼠标:i j k l m o u 7 8 9 . 不落屏、 回车不换行而是弹菜单、指针乱跳。这是 2026-10-22「11 个字符永不落屏」的真正原因, 关掉立即恢复,不需要重启手机。

反模式:别自己发明流程(会浪费大量时间,而且不可靠) - ❌ 手改 calib.json / 自己补像素偏移 / “这次先 +0.02 试试”——校准错了就 calibration_request; - ❌ 不用 click_text 而靠目测坐标反复盲点;不用 scroll(fine) 而自己拼拖拽; - ❌ 连续 changed=false 不换目标、不查日志,闭眼重试; - ❌ 绕过 MCP 直接 curl /api/raw 或写脚本操作手机(排障例外,要说明); - ❌ 自己跑校准向导(必须用户点「开始」); - ❌ 遇到问题先怀疑固件/重装 App,而不是先看 status / app_logs。 先翻 AI_GUIDE §1.0 的工具表,再动手。摸索 10 分钟不如查表 10 秒。

0.1 新设备 / 新场景:先建立基线

用户可能换 iPhone / iPad、换 iOS 版本、换指针大小、换网络。同一套坐标、滚动距离、返回手势不要跨设备复用。

第一次接触一台设备或一个 App,先记下:

项怎么取
设备 / 系统用户告知,或从屏幕「关于本机」看
指针大小设置 → 辅助功能 → 触控 → 辅助触控 → 指针控制
镜像分辨率status() 的 aspect、截图尺寸
校准calibrated + control/calib.json 里对应的 profiles 键
投屏延迟校准向导第一步会测(这台 0.53 s)
BLEstatus 里 connected/encrypted/sub/kb/ms

然后用计算器 7+8=15 验证这张表是否适合当前设备。不要凭“上次也是 iPhone”就直接操作。

基线写进 §6.1,任务中的新发现写进对应小节;下一个 AI 先翻这里,再动手。


1. 屏幕源(AirPlay)

现象根因规避
App 打开后画面变横屏、随后冻结,点击/滚动帧 hash 不变部分第三方 App 的投屏保护(实测)换 App;或用 UVC 采集绕过;不要重校准(不是坐标问题)
使用上述 App 期间 screen=false 两次,其中一次 UxPlay 被看门狗重启投屏会话被 App 带崩等 / 请人重投屏;不要连续操作
同局域网多台 Mac 的投屏名都叫 Quileg接收端名写死现为 Quileg - <电脑名> (4位ID),每台唯一;BLE 名本身带 MAC 后缀
画面静止时取不到新帧AirPlay 只在画面变化时发帧用「画面变化」判断,不要用「帧新鲜度」
长距离移动时 409BLE + Wi-Fi 共存抖动409 后 ensure_ble() + 重试;画图/校准都要包重试
横屏 App 下点击系统性偏移校准表是竖屏的,宽高比从 0.463 变 1.778不要硬点;换竖屏页或重新校准
所有工具突然 connection refusedApp 被 ⌘Q 退出(0.5.0 起关窗只是隐藏)让用户看 Dock / 重开 App;不要重投屏

2. 输入(中文 / 英文 / 标点)

2.1 部分字符不落屏 / 回车弹菜单:鼠标键「使用主键盘」被打开(2026-10-23 更正)

现象:type_text、App 软键盘、POST /api/raw {"text":"type i"} 三条路都一样——在备忘录/Spotlight 里 下面 11 个字符从不落屏,其余字母数字、大小写、标点、顺序全部正常:

i j k l m o u 7 8 9 .
usage: 0x0C 0x0D 0x0E 0x0F 0x10 | 0x12 | 0x18 | 0x24 0x25 0x26 | 0x37

同时还有两个伴随症状:回车不换行,而是弹出功能选项/菜单;指针有时自己乱跳。

根因(2026-10-23 用户定位):iPhone 的 设置 → 辅助功能 → 触控 → 辅助触控 → 指针设备 → 鼠标键 → 使用主键盘 被打开了。 键盘被系统当成鼠标:i/j/k/l 移动、u/o 点击、7/8/9 方向、. 等,Return 被当作点击。 这 11 个正好是鼠标键的键位——不是固件坏,也不是 HID 键位状态坏。

恢复:把 使用主键盘 关掉(不需要时把 鼠标键 也关掉),立即恢复; 不需要重启 iPhone、不需要重配对。

前置:辅助触控 必须开着,否则 iPhone 上根本没有鼠标指针(见 §0)。

为什么之前误判:2026-10-22 那次靠「重启 iPhone」恢复了,于是归因为“HID 键位状态坏了”; 实际是设置开关的问题(重启/重配后开关被重置或后续被关掉)。现在以开关状态为准。

同一块板 + 同一固件,只换宿主(当时的证据,结论仍成立——手机侧设置问题):

宿主结果
macOS(Sublime Text)✅ aib ijklm 789. 14 个字符全落屏
iPadOS 18(备忘录)✅ hijklm 全部进入拼音组合
这台 iPhone(iOS 18)❌ 11 个全丢(当时鼠标键开着)

已排除(别重复走这几步):

假设实测结果
固件 kLayout 写错 / 出厂镜像旧源码表与 app-16m.bin、factory-16m.bin 逐字节一致;key i 返回 ok(不是 err unknown key),说明运行时映射非零
按压时长太短、被 iOS 合并type(10 ms)与 key(40 ms)同样丢
大小写 / Shift / ⌘ 组合小写、大写、⌘I 全丢;同一修饰键下 ⌘B(0x05)正常
报告槽位(第 1 槽被特殊处理)key h+i(同一报告 keys[0]=0x0B, keys[1]=0x0C)只出 h,i 在槽 2 也丢
中文输入法 / 硬件键盘布局删除中文输入法、确认「英语(美国)/ ANSI」后现象不变
文本替换(自定义短语)列表只有 1 条正常替换,无空映射
绑定 / 描述符缓存忽略设备重配后现象不变(当时重启才“恢复”,实为开关状态变化)

排查顺序(以后照这个走,别先怀疑固件):

  1. type_text("aib") 自检,确认是「部分字符」还是「完全打不进去」;
  2. 换宿主(Mac 或 iPad)打同一串:换了就好 = 手机侧问题,不要动固件、不要重校准;
  3. 先查手机两个开关:辅助触控 = 开;指针设备 → 鼠标键 → 使用主键盘 = 关;
  4. 仍不行再:重启 iPhone → 重新配对 → 还原键盘词典 → 第二台 iPhone 对照。

2.2 语音桥:Mac 朗读 → 手机听写(2026-10-23 实测)

用途:中文输入最慢的是点候选;让 Mac 用 speak() 朗读、手机输入法听写,直接上屏。 speak → /api/speech → 系统 say。

起停方式:双击 Control 开始,单击 Control 停止(不需要点屏幕麦克风)。 MCP 调用:dictation("start") / dictation("stop")(0.6.0 起)。 它会先按一次 Shift 唤醒 HID 键盘,再双击/单击 Control —— iOS 会吞掉空闲后的第一次按键, 直接 key(combo="ctrl", repeat=2, gap_ms=60) 常常只算一次 Control,听写起不来(2026-10-23 实测)。

三个坑

现象根因规避
只落前几个字,后面没有转写延迟 1.5–3 s,截图/OCR 太早说完等 2–3 s 再验收;同一句多截一帧,第二帧才完整
小麦克风变“暂停态”后再说话没反应误以为暂停 = 停止暂停态照常收音,直接说下一句即可;真停了会连橙点一起消失
Spotlight 搜索框说完什么都不进搜索框不走同一条转写路径(实测 2/2 空白)用备忘录 / 短信等真实文本框验收

其他实测:F5(Apple 键盘听写键)无效且会收起软键盘;Mac 音量 56% 够用; 自动标点(, 。)和自动换行由 iOS 加,不是 speak 加的;单会话约 30 s 无话音自动结束。

与拼音点选的关系:语音桥快,但依赖扬声器/麦克风/环境噪声;关键内容仍要 OCR 复核, 听写不可用时回退 §2 的拼音 + 候选点选。

证据:操作员 2026-10-23 实测(iPhone iOS 18 / 固件 0.7.0 / App 0.9.25): 听写快捷键设置、两句连续落屏、单击 Control 停止的截图。

3. 坐标与点击

4. 校准

4.5 UVC 采集卡(HDMI 有线投屏)

现象根因规避
整屏绿色雪花、画面隐约可见采集卡发 UYVY(2vuy),AVFoundation 的 BGRA/NV12 转换在这块 Hagibis(MACROSILICON) 上是错的取原生 2vuy,自己按 UYVY 解释;ffmpeg 用 -pixel_format uyvy422
找黑边全失败,整帧都被当成画面2vuy 是 Cb Y Cr Y,亮度 Y 在奇数字节扫描 p[y*bpr + x*2 + 1],不要读第一个字节
OCR 在 888×1920 上反而更差Apple Vision 对大字号不敏感送 OCR 前缩到 ~600 宽;坐标仍归一化
画面横过来了采集卡的「竖屏模式」把竖屏内容旋转 90° 塞进 1920×1080不要只靠宽高比(真横屏 App 也是 2.17)。按「文字行横竖 + 时钟在不在上半屏」判定:uvc-frame --rotate ocr 自动转,orientation() 可复核
OCR 四个方向都能读出字Apple Vision 对旋转文字有一定识别力用 bbox 的宽>高 判横排、HH:MM 的 y<0.5 判正立,别用「文字总量」当方向分
第一帧有撕裂/上半屏噪声刚 startRunning 时的半帧丢掉前 2 帧再发
拔掉采集卡后画面变成「摄像头看到的房间」旧逻辑取「第一个外部摄像头」兜底,iPhone 连续互通相机也是 external,被当成了采集卡只认 modelID 含 uvc 的外部设备,并排除 FaceTime / iPhone / iPad;找不到就报错退出,不申请权限、不回退摄像头
同一个 key 在 Windows 上行为不对cmd 在 Windows 是 Win 键;策略按平台区分统一写 gui,先 keymap_check(platform="windows"),别用 iOS 经验套
F1–F12/Home/End 发不出去固件 < 0.6.0 没有这些键升级到 0.6.0(本机已升级);老固件会返回 firmware_unsupported,不要重试
换视频源后点击整体偏不同源的画面尺寸/裁切不同,旧档案是按分辨率存的档案键改为 源:分辨率(airplay:500x1080、uvc:888x1920),切源时按 X-Video-Source 自动启用;没有对应档案就不会乱用别的源
双开时只有一路有实时画面iOS 同一时间只维护一个外接显示/镜像会话:接了 HDMI 再开 AirPlay 镜像,另一路会停在最后一帧(或反之)。live 只代表 UVC 有 TCP 连接,不代表有帧所以不做自动切换:手动选源,另一路只做监视。界面按内容变化标「实时 / 无更新 Ns」,冻结的格子边框变琥珀色。
采集卡插着但 HDMI 没接,AI 仍把它当画面采集卡会输出纯色/「无信号」底图,live 仍为 true缩略图灰度标准差 < 6 连续 3 秒 → signal=false 并提示;不会自动换源(需用户手动切)
拔卡后插回不恢复旧 helper 进程不退出,AVCaptureSession 跟着设备一起死了看门狗:5 秒无帧且 isConnected=false → 退出码 3;服务端每 10 秒重试,插回后自动重建(实测 10 秒恢复)
日志里出现两套 AirPlay receiver started / UVC capture startedGUI 刚启动、:8890 还没监听时,MCP 宿主拉起 --mcp,旧逻辑会自己再起一套服务端0.9.4 起用 server.lock + 先等 2 秒;抢不到锁就等对方的 API
App 请求相机不弹窗、直接拒绝hardened runtime 的 App 缺 com.apple.security.device.camera 权限,TCC 的规则是「缺少权限就不弹窗」entitlements.plist 加 camera;Info.plist 加 NSCameraUsageDescription,两者缺一不可

实测日志(2026-10-21): service: kTCCServiceCamera requires entitlement com.apple.security.device.camera but it is missing … Policy disallows prompt … access denied

5. 数据安全(真实踩过)

6. App 兼容矩阵(持续更新)

App投屏点击/输入备注
信息✅✅收件人要点建议项变成 +86 标签;Tab 切正文
备忘录✅✅绘图入口 = 底部圆形「A」;画布内 press → move → release 画线
计算器✅✅按键大,适合验证坐标
设置✅✅键盘布局在「通用 → 键盘」
相机✅未测
网格测试 App✅✅适合校准画布

6.2 圆角参数(按屏幕,实测后填)

python control/measure_corners.py --device "设备 / 系统" 会把结果写进 control/corner_profiles.json;下表只做人读汇总。不同手机不要互相套用。

设备 / 系统源:分辨率四边 inset (px)圆角 R (px)实测时间
iPhone (iOS 18)airplay:500x1080L 7.36 / R 8.14 / T 7.22 / B 8.1661.352026-10-23 13:14
(待实测)uvc:888x1920

这一份的 TL/BR 实测停车点与几何模型只差 1.7 / 0.5 px(模型可信); TR 偏 39 px、BL 没测到——那两个角落在状态栏电池/底部按钮的 hover 区, 检测被污染。所以档案里的四个角停车点按模型生成(inset + 0.293R),实测值只用来算半径。

6.1 设备基线(每台设备一行,实测后填)

设备系统指针分辨率校准档案延迟备注
iPhone 16eiOS 18小/中500×1080500x1080~0.2–0.35 s—
iPad Air 11" M3iPadOS 18小/中500×1080(letterbox)500x1080~0.2–0.35 s端到端跑通
iPhone SE 3iOS 18小/中500×1080500x1080—Lightning 适配器供电不足
新设备先按 §0.1 建基线,再补这一行

表里只放实测过的;换手机、换指针大小、换分辨率都要新起一档,不要拿旧行的坐标硬套。

2026-10-22 补记(2026-10-23 更正根因):有一台 iPhone(iOS 18)出现过「11 个字符永不落屏」 (i j k l m o u 7 8 9 .)和「回车弹菜单」,同板同固件在 macOS / iPadOS 上正常。 真正原因是 辅助触控 → 指针设备 → 鼠标键 → 使用主键盘 被打开;关掉即恢复,不需要重启。详见 §2.1。

7. 一次实验的记录模板

任务:
设备/系统/指针/分辨率:
前置:status / screenshot(附路径)
动作:每一步的命令 + 前后截图
结果:成功 / 失败(现象)
根因:
规避:可复用的规则
证据:artifacts/xxx.jpg

回填:本文对应小节 + 给 AI 的操作手册 的配方/故障表。

9. 便宜板(ESP32-S3-N16R8):XMC Flash 的坑(2026-10-22 实测)

背景:XIAO ESP32S3 Plus 较贵,改用 YD ESP32-S3-COREBOARD V1.4(N16R8,¥20 级)做实验。 固件改用统一的 s3_16m_universal(见 firmware/hid_bridge/src/board.h)。

9.1 烧官方 16M 镜像后无限重启

9.2 用 App 刷机会报串口噪声

9.3 NVS 配置写不进去(已解决,2026-10-23)

8. 待解问题

本页内容与安装包内文档同源,版本见 VERSION.txt。未在页面上展示的细节,可在 Releases 页下载的 DMG 中找到完整原文。