是否有人逆向设计了 Apple iOS Remote 应用程序用于通过 IP 控制 Apple TV 的协议?

Has anyone reversed engineered the protocol used by Apple's iOS Remote app for controlling an Apple TV over IP?

我很好奇我是否可以编写可以控制 Apple TV 的程序,特别是第 4 代 Apple TV 运行 tvOS 9.1.1,例如 Apple 的 iOS 远程应用程序能够。我想向它发送命令以在四个主要方向上导航、在屏幕上选择一个项目、在导航堆栈中向上移动——基本上是 Apple 的 Remote 应用程序可以执行的操作。

有没有人对它使用的协议进行逆向工程?到目前为止,粗略的谷歌搜索只得到了关于早期 Apple TV 和 DAAP 协议的过时结果,这看起来与我想要的有所不同。

我使用 tcpdump 捕获了 iPhone 上的流量,并使用 WireShark 对其进行了分析。 Remote 应用程序在端口 3689 上向 Apple TV 发出正常的 HTTP 请求。

应用程序的工作流程包含四个 HTTP 请求:

  • /server-info 用于获取有关 Apple TV 的信息。它以 Apple proprietary DAAP response (Digital Audio Access Protocol) 响应,提供有关设备的一些标签,例如显示名称。
  • /login 在连接期间执行,当应用程序显示 "Connecting to Apple TV..." 消息时。它以有关登录状态的 DAAP 进行响应。
  • 这是瓶颈。 /home-share-verify 验证应用程序和 Apple TV 之间的连接。此调用需要一个 Client-DAAP-Validation header 和一个长的未知字符串值。根据维基百科,这似乎是 iTunes 7.0+ 中引入的经过验证的来源之间的证书交换生成的散列,并且从未进行过逆向工程。
  • /ctrl-int/1/{controlpromptupdate|controlpromptentry|playstatusupdate} 似乎是对输入按钮的调用。

中间还会触发其他一些次要调用(例如 Bonjour 服务更新或 /databases 调用)。

Here and here 你可以找到更多信息。希望这有助于了解这个简单(但受保护)应用程序的工作原理。

我确实设法通过 python 脚本控制了我的 Apple TV(目前是 运行 tvOS 9.2)。事实证明,您 不需要 使用家庭共享来让远程应用程序控制 Apple TV。我不知道如果启用家庭共享,以下方法是否有效,但在 Apple TV 上禁用它后,iOS Remote 应用程序可以选择手动添加设备。 (这可能需要删除所有已配对的设备,因为不幸的是,我必须这样做才能显示 'Add a device' 按钮。)一旦我将 iPhone 与 Apple TV 配对,我记录了它的一些请求,复制了配对GUID,然后构造了一些自己的请求。

唯一需要提出的三个请求是:

/login?pairing-guid=< your pairing guid here >&hasFP=1

登录 Apple TV。响应的最后四个字节是会话 ID,编码为大端四字节整数。

/logout?session-id=< your session id here >

注销。并非绝对必要,因为我发现登录只会让你获得一个新的会话 ID,但按照预期的方式做事可能不是一个坏主意。

/ctrl-int/1/controlpromptentry?prompt-id=114&session-id=< your session id here >

将用户输入发送到 Apple TV。数据是输入命令或可能是移动触摸的多个缓冲区之一。对于主要方向上的移动,发送多个此类请求以模拟移动触摸是必要的。

我有一个 python 脚本演示如何在此处执行此操作: http://pastebin.com/mDHc353A

利用请求库:http://docs.python-requests.org/en/master/

还要特别感谢 Adam Miskiewicz / github 用户 skevy,因为我在他的 atlas-backend repo 中使用了这个文件,它方便地有正确的缓冲区来发送移动:https://github.com/skevy/atlas-backend/blob/master/atlas/services/appletv.coffee

我想告诉 alexa 触发 appletv,这会唤醒我的 appletv,然后通过 HDMI 和 CEC 打开我的电视,

为了做到这一点: 从你的 mac\linux\windows 简单地 运行: curl -XPOST -d 'cmcc\x00\x00\x00\x01\x30cmbe\x00\x00\x00\x04menu' 'http://10.1.1.56:3689/ctrl-int/1/controlpromptentry?prompt-id=144&session-id=1'

抽象命令是: curl -XPOST -d 'cmcc\x00\x00\x00\x01\x30cmbe\x00\x00\x00\x04menu' 'http://{APPLETV_IP}:3689/ctrl-int/1/controlpromptentry?prompt-id={CONTROL_PAIR_ID}&session-id={CONTROL_SESSION_ID}'

我通过将我的iphone wifi http代理设置设置为我的mac提取了CONTROL_PAIR_ID和CONTROL_SESSION_ID,并激活了旧的appletv远程应用程序和显示应用程序正在执行的请求

如果您不知道如何设置 iphone 以使用 fiddler,您可以在这里找到它: http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureForiOS