问题 是否有人反过来设计Apple的iOS Remote应用程序用于控制Apple TV over IP的协议?


我很好奇我是否可以编写可以控制Apple TV的程序,特别是运行tvOS 9.1.1的Apple TV第4代,就像Apple的iOS版远程应用程序一样。我想发送命令,用于在四个主要方向上导航,在屏幕上选择一个项目,向上导航堆栈 - 基本上是Apple的远程应用程序可以执行的操作。

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


9229
2018-02-12 05:59


起源



答案:


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

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

  • /server-info 获取有关Apple TV的信息。它响应一个 Apple专有的DAAP响应(数字音频访问协议) 提供有关设备的一些标签,例如显示名称。
  • /login 在连接期间,当应用程序显示“正在连接到Apple TV ...”消息时执行。它以DAAP响应登录状态。
  • 这是瓶颈。 /home-share-verify 验证应用程序和Apple TV之间的连接。这个电话需要一个 Client-DAAP-Validation 带有长未知字符串值的标头。根据维基百科的说法,这似乎就像是在iTunes 7.0+中引入的经过验证的资源之间的证书交换生成的哈希,而且从不进行逆向工程。
  • /ctrl-int/1/{controlpromptupdate|controlpromptentry|playstatusupdate} 似乎是对输入按钮的调用。

其中一些其他小调用会在两者之间被触发(如Bonjour服务更新或 /databases 呼叫)。

这里 和 这里 你可以找到更多的信息。希望这有助于概述这个简单(但受保护)的应用程序是如何工作的。


6
2018-02-28 23:15



谢谢(你的)信息!我想知道我是否可以通过使用来自我的iPhone或越狱的iPod Touch的哈希来解决验证步骤,因为我只是尝试为自己的设备执行此操作而我并不是要尝试解决一般情况。 - GuyGizmo
我不知道这个哈希是如何工作的...我想每次应用程序连接到电视时都会生成哈希值,因此使用它可能会变得更难。 - Nicola Giancecchi


答案:


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

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

  • /server-info 获取有关Apple TV的信息。它响应一个 Apple专有的DAAP响应(数字音频访问协议) 提供有关设备的一些标签,例如显示名称。
  • /login 在连接期间,当应用程序显示“正在连接到Apple TV ...”消息时执行。它以DAAP响应登录状态。
  • 这是瓶颈。 /home-share-verify 验证应用程序和Apple TV之间的连接。这个电话需要一个 Client-DAAP-Validation 带有长未知字符串值的标头。根据维基百科的说法,这似乎就像是在iTunes 7.0+中引入的经过验证的资源之间的证书交换生成的哈希,而且从不进行逆向工程。
  • /ctrl-int/1/{controlpromptupdate|controlpromptentry|playstatusupdate} 似乎是对输入按钮的调用。

其中一些其他小调用会在两者之间被触发(如Bonjour服务更新或 /databases 呼叫)。

这里 和 这里 你可以找到更多的信息。希望这有助于概述这个简单(但受保护)的应用程序是如何工作的。


6
2018-02-28 23:15



谢谢(你的)信息!我想知道我是否可以通过使用来自我的iPhone或越狱的iPod Touch的哈希来解决验证步骤,因为我只是尝试为自己的设备执行此操作而我并不是要尝试解决一般情况。 - GuyGizmo
我不知道这个哈希是如何工作的...我想每次应用程序连接到电视时都会生成哈希值,因此使用它可能会变得更难。 - Nicola Giancecchi


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

为了做到这一点: 从你的mac \ linux \ windows运行简单: 卷曲-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}&会话id = {CONTROL_SESSION_ID}”

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

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


2
2017-10-13 16:24





我确实设法从python脚本控制我的Apple TV(目前运行tvOS 9.2)。事实证明,你没有 需要 使用家庭共享让远程应用程序控制Apple TV。如果启用了Home Sharing,我不知道以下方法是否有效,但在Apple TV上禁用了该方法,iOS Remote应用程序可以选择手动添加设备。 (这可能需要删除它已经配对的所有设备,因为不幸的是我必须让它显示“添加设备”按钮。)一旦我将我的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


1
2018-05-05 04:51



捕获数据包是获取guid的唯一方法吗? - phillee
它可能是,但我不确定。可能有某种方法可以通过手机获取它,特别是如果它被越狱,但这就是我得到的全部。 - GuyGizmo
太棒了,谢谢!获得协议可用命令的更完整列表会很棒。嗅探(现在旧的)远程应用程序给了我一个“playpause”命令,它与Python脚本中的其他命令相同,最后一位是“\ x09playpause”。我真的想弄清楚按住topmenu按钮,即在tvOS上调出睡眠菜单。 - Tyler


AppleTV 2,3和4可以使用HomeSharing.framework进行控制。 非官方AirPlay协议规范:nto.github.io/AirPlay.html

Android DACP遥控器: http://dacp.jsharkey.org/ 示例实现@: https://github.com/benumc/lms-lmq/blob/master/Apple_tv.rb

AppleTV4还使用了mediaremotetv框架:协议在中解释 : https://github.com/jeanregisser/mediaremotetv-protocol


1
2017-11-18 10:02