JarekToro/bunatv
GitHub: JarekToro/bunatv
一个 Bun 原生的 TypeScript 库,通过从头实现 Apple TV 的 Companion、MRP 和 AirPlay 协议来提供透明的局域网设备控制能力。
Stars: 6 | Forks: 0
# BunATV
一个用于在本地网络控制 Apple TV 设备的 TypeScript/Bun 库。BunATV 实现了 Apple 的 Companion、MRP (Media Remote Protocol) 和 AirPlay 2 协议,让你可以直接访问每个协议发送的消息——没有抽象外观,也没有魔法分组。
## 什么是 BunATV?
BunATV 是一个**库优先**的项目。它暴露了用于控制 Apple TV 设备的原始协议接口:发现、配对、遥控输入、音量、电源、媒体播放、应用启动、文本输入等。每个协议的 API 都与实际通过网络传输的内容密切对应。
为了方便起见,包含了一个 CLI (`bunatv`),但它只是库之上的一层薄包装,并没有暴露所有功能。该库是主要接口。
## 目标
- **通过构建来学习。** 通过在 TypeScript 中从头开始实现来理解 Apple 的设备控制协议——而不是通过包装或移植现有的库。
- **协议透明度。** 提供忠实于底层协议的 API,暴露原始消息和数据结构,而不是将它们隐藏在高级抽象之后。
- **逆向工程未文档化的内容。** 这些协议的许多方面并没有公开文档。这个项目是一个进行逆向工程的机会(使用 ghidra 分析 Apple Frameworks 发现了许多额外的 MRP 消息)。
- **改进我感兴趣的东西** 毫秒级精度的运行时间推算、TTL 感知的 mDNS 缓存(让后续查找变得更快),以及 Bun 在现实世界自动化中的性能特征。
## BunATV 不是什么
- **不是 PyATV 的移植。** BunATV 深受 [PyATV](https://github.com/postlund/pyatv) 的启发,并基于其研究,但它是一个从头开始的 TypeScript 实现,有着不同的设计理念——而不是逐行的翻译。
- **不是流媒体应用。** BunATV 用于控制 Apple TV 设备。它(目前)不向它们流式传输音频或视频。
- **不是 CLI 优先。** CLI 是一个便利工具,可能会被重写。并非所有已实现的功能都在那里暴露。库 API 才是预期的接口。
## 状态
- **Companion 协议:** 正常工作 —— 配对、连接、遥控、音量、电源、应用启动、文本输入、触摸
- **MRP 协议:** 功能正常 —— 核心遥控、播放和正在播放功能正常工作;许多高级消息类型(语音、游戏控制器、键盘)未处理
- **AirPlay 2:** 基础设施已实现(传输、认证、帧处理)——用作 MRP 的底层传输
- **RAOP (AirPlay 1 音频):** 流式传输堆栈已实现 —— RTSP ANNOUNCE/SETUP/RECORD、UDP RTP 音频、同步数据包、重传积压、DAAP 元数据
- **CLI:** 用于发现、配对和基本控制的功能正常
## 哪些功能可用
### Companion 协议
- 通过 mDNS **发现**局域网上的 Apple TV
- TTL 感知的解析缓存显著加快了后续查找和 CLI 命令
- 使用屏幕上的 **4 位 PIN 码**进行**配对**
- 为未来的会话**重用凭证**
- 用于状态更改通知的**兴趣订阅**
- **遥控按键** —— HID 风格的命令(导航、菜单、主屏幕、播放/暂停等)
- **音量控制** —— 获取、设置、调大、调小
- **电源/注意力状态** —— 查询和唤醒/睡眠控制
- **应用启动** —— 按 bundle ID 启动应用
- **文本输入** —— 在搜索字段和表单中输入
- **触摸输入** —— 触摸事件和手势
### MRP 协议(通过 AirPlay 2)
- **正在播放状态** —— 活动播放器、曲目元数据、带有毫秒级精度推算的播放位置
- **播放控制** —— 播放、暂停、跳过、快进/快退、章节、随机/重复模式、播放速率
- **音乐/资料库命令** —— 喜欢、不喜欢、禁止、书签、评分、心愿单、专辑/播放列表导航
- **高级遥控** —— 带有 protobuf 消息的完整 HID 命令集
- **键盘/文本输入** —— 设置、插入和清除焦点文本字段,具有键盘会话状态和编辑属性事件
- **音量** —— 设置/静音以及显式的 `getVolume`/`getVolumeMuted` 查询和被动的音量变化跟踪
- **扬声器管理** —— 添加、删除和设置 AirPlay 输出设备
- **触摸/手势控制** —— 可配置持续时间的点击和滑动
尚未实现:语音输入、游戏控制器输入、播放会话迁移、设备端点发现。
### RAOP / AirPlay 1 音频
- **RTSP 会话** —— 带 SDP (L16 PCM, 44100 Hz, 立体声) 的 ANNOUNCE、SETUP (UDP 端口协商)、RECORD、FLUSH、TEARDOWN
- **UDP 音频通道** —— 实时 RTP 数据包发送,具有针对时间漂移的突发补偿
- **控制通道** —— 每秒发送一次 UDP 同步数据包(NTP 墙上时钟 ↔ RTP 时间戳锚定);处理来自接收器的重传请求
- **DAAP 元数据** —— 通过带有 `application/x-dmap-tagged` 的 RTSP `SET_PARAMETER` 发布标题、艺术家、专辑和持续时间
- **封面图** —— 通过 `SET_PARAMETER` 发布专辑封面(自动检测 JPEG 或 PNG)
- **进度** —— 通过 `SET_PARAMETER` 以 RTP 时间戳单位发布播放位置
- **音量** —— 以 dBFS 或 0–100 百分比形式设置音量(包含 `pctToDbfs` 转换)
- **MFi-SAP** —— 用于 AirPort Express 设备的 `authSetup`(静态 Curve25519 密钥)
- **Digest 认证** —— 用于受保护接收器的可选密码
## 安装/运行
此仓库专为 Bun 设计。
### 从源码运行
```
bun install
bun run cli -- --help
```
### 构建独立的 CLI 二进制文件
```
bun run build:cli
./dist/bin/bunatv --help
```
## CLI
CLI 可执行文件名为 `bunatv`。
```
Usage: bunatv
Version: 1.0.0
Description:
Control Apple TV devices from the command line
Options:
-h, --help - Show this help.
-V, --version - Show the version number for this program.
-o, --output - Output format (text, json, table) (Default: "text", Values: "text", "json", "table")
-v, --verbose - Verbose output with detailed information (Default: false)
--no-color - Disable colored output (Default: false)
--debug [level] - Set logging level (silent, error, warn, info, debug, trace) (Values: "silent", "error", "warn", "info", "debug",
"trace")
Commands:
discover - Discover Apple TV devices on the network
info - Get detailed information about a specific device
pair - Pair with an Apple TV device
wizard - Interactive setup wizard for Apple TV connection
control - Control an Apple TV device
debug - Debug utilities for BunATV
```
## 日志与调试
BunATV 使用 **pino** 和 **debug** 进行日志记录
### 模块级 debug 过滤 (`DEBUG`)
可以通过 `DEBUG` 命名空间匹配器来过滤日志。
- `DEBUG` 在代码中默认为 `*`
示例:
```
# 显示所有日志
DEBUG=bunatv:*
# 仅显示 companion protocol 日志
DEBUG=bunatv:companion:*
# 显示所有 crypto 操作
DEBUG=bunatv:crypto:*
# 显示特定模块
DEBUG=bunatv:hap:auth,bunatv:companion:api
# 排除 noisy 模块
DEBUG=bunatv:*,-bunatv:encoding:*
```
要查找所有可用的命名空间,请使用 [astgrep](https://ast-grep.github.io/) 运行 `ast-grep --pattern "createLogger(\$ARG)" .`
## 路线图
- **Companion 正在播放** —— Companion 协议中存在用于正在播放信息的较新协议消息,但需要进一步的逆向工程才能完全映射出来
- **AirPlay 音频/视频流传输** —— RAOP/AirPlay 1 音频发送器已完成;AirPlay 2 音频/视频流传输是下一步
- **可发布的包** —— 清理公共 API 接口并发布到 npm/JSR
## 许可证
MIT
标签:AirPlay, Apple TV控制, Bun, TypeScript, 协议实现, 安全插件, 智能设备控制, 自动化攻击