shaonialife / cardeck
git clone https://github.com/shaonialife/cardeck.git
v0.1.12 · today
CarDeck — 让 Android 手机扮演 CarPlay 发送端(非官方实验性项目)
—
stars, 24h
+69
stars, 7 days · #727
+69
stars, 30 days · #3,574
69
★ total · +69% this week
20
forks · 11 open issues
Star history starts 2026-10-20; the chart appears after the second daily snapshot.
LanguageKotlin
LicenseMIT
Created2026-10-18 (2d ago)
Last pushtoday
Watchers0
OwnerUser
GitHub topics
Links
README excerpt
# CarDeck — 让 Android 手机扮演 iPhone 直连车机 让一台普通 Android 手机(未 root)扮演 **CarPlay 发送端(iPhone 角色)**, 把 app 自绘界面投到支持 CarPlay 的车机上。 > **非官方项目**:本项目为个人实验性作品,与 Apple Inc. 及任何汽车制造商均无关联, > 未获授权或认证,**不是 MFi 产品**。CarPlay / AirPlay 是 Apple Inc. 的商标, > 文中出现仅用于说明兼容目标。 > > **驾驶安全**:仅限停车时配置与操作;行驶中断连可能导致导航中断,请以原厂导航为安全冗余。 > > 完整条款见 DISCLAIMER.md(与应用内首次启动的免责声明同源)。 ## 结论先行(可行性) - **方向与 DiPlay/xcertplay 相反**:它们是接收端(车机角色);本项目是发送端。 **DiPlay 是 xcertplay 的衍生版,也是本项目实际使用的测试台**;`reference/` 里两者的源码都留作参考(协议知识在 iAP2/链路层/Bonjour 层共享,角色逻辑互不包含)。 - **发送端不需要苹果签名身份**:iAP2 认证是单向的(手机验证车机的 MFi 证书, 车机信任手机自报结果,Oligo Security DEF CON 2025 已公开证实)。 - **有线 USB 路线已排除**(app 无法控制 USB gadget,荣耀无法解锁 BL), 只走无线:蓝牙 RFCOMM → 车机热点 → mDNS → iAP2/AirPlay。 - 详细协议依据见 docs/PROTOCOL-NOTES.md。 ## 下载安装 **推荐:GitHub Release**(可直接下载、附 SHA-256 与签名指纹): Releases **国内备用:百度网盘**(国内访问 GitHub 慢时用) > 通过网盘分享的文件:CarDeck > 链接: https://pan.baidu.com/s/1RQoDzFBermUobakZ0d0e3Q?pwd=xc5i > 提取码: xc5i 安装前请确认: - **Android 14+**(`应用横屏` 功能依赖 SDK 34 起的平台 ChangeId,13 及更早不可用) - 已安装并**启动** **Shizuku**(无线调试激活,免 root)——本应用的虚拟屏、触摸注入、 窗口状态读取全部经它完成,未就绪时无法连接 - 官网(含分步骤激活指南):https://shizuku.rikka.app/ - GitHub(版本与更新说明):https://github.com/RikkaApps/Shizuku - 首次启动会显示免责声明,需滑到底并等待 10 秒后才能接受 > 两个渠道提供的是同一个构建产物(官方 release 密钥签名)。网盘无法自动校验, > 建议下载后用 `apksigner verify --print-certs ` 核对证书指纹是否与 Release > 备注里公布的一致(SHA-256 `9457d04d2709094404a534ba06d7ecbc53cb1406224ec7c53c05a9c67ccc4970`), > 不一致就不要安装。 ## 路线图与 Go/No-Go | 阶段 | 内容 | 门槛 | 状态 | |---|---|---|---| | Phase 0 | 测试台 + 网络层 demo(本仓库) | 两台手机 mDNS 互发现 | ✅ 已验收(DiPlay 测试台) | | Phase 1 | iAP2 发送端会话(链路状态机 + 0x1D00/0x5702/0x4300) | 接收端日志显示「iPhone 接入」 | ✅ 已验收:完整走通至 0x4301,拿到热点凭据与 AirPlay 端点 | | Phase 2 | AirPlay 主会话(PairVerify + H.264 编码 + HID 回传) | 备用机显示本机画面并可触摸 | ✅ 已验收(2026-10-08 23:17):30fps 推流+渲染、触摸事件回传打通 | | Phase 3 | 真车(奥迪 MIB3)验证 | 车机点亮 | ✅ **全通(2026-10-11)**:视频稳定上屏 + 车机触摸/滑动可交互(详见下方 Phase 3-C) | | 兜底 | 买 Tbox 安卓盒子,把同一套自绘 UI 装进盒子 | — | 不需要(真车路线已通) | **Phase 3-C 全通(2026-10-11,奥迪实车验收)**:iAP2 → AirPlay 配对 → 视频推流 → 触摸回传 → 虚拟屏注入全链路可交互。本日攻坚战果(细节见 `docs/PROTOCOL-NOTES.md` §9c): 1. **AirPlay 配对 403 破案**:配对请求缺 Apple 标识头(`Content-Type: application/pairing+tlv8` + `X-Apple-HKP: 2`、pair-verify 加 `X-Apple-PD: 1`,对照 catplay PairingHelperTx 逐字)。 补齐后 pair-setup/pair-verify 全 200,车机保存长期公钥。 2. **屏幕流 400 破案**:SETUP 必须通告**真实 UDP 计时端口**(TimingServer,RTCP NTP 应答) 且 features 发**完整 iPhone 能力清单**(接收端按「车机支持 ∩ 手机提议」算交集, 只提 videoPlayback 会得到空集 → 视频管线不启用);modesChanged 资源声明先行; UA/sourceVersion 用 iPhone 自报值(566.25.21),勿用车机的。 3. **会话 10s 拆链破案**:双心跳缺一不可——keepAlive UDP ping(车机 keepAlivePort,10s 周期) + `POST /feedback`(1s 周期,catplay FEEDBACK_INTERVAL)。 4. **触摸链路(本日最后战场,五连破)**: - 车机命令必须走**事件通道 socket** 上的 `POST /command`(fire-and-forget、独立 CSeq、 Events 密钥),发在 RTSP 控制连接上车机收不到(DiPlay sendCommandLocked 实证) - `hidSetInputMode`(uuid 原样字符串回传)武装 HID 后车机才开始发触摸 - 奥迪 `/info hidDevices[].uuid` 是**字符串** "0"/"1"(触摸=uuid 1 eso_touchScreen, 报文 5 字节 `[tip 1bit][X u16LE][Y u16LE]`,坐标上限 1412×654=屏幕分辨率) - 事件通道是双向 RTSP:**每条来向请求立即回 200**,否则车机请求管道