📈 GH Trending Explorer 🎲 Surprise me

← all repos

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**,否则车机请求管道