web-dev-qa-db-ja.com

Apple TV over IPを制御するためにAppleのiOSリモートアプリが使用するプロトコルをリバースエンジニアリングした人はいますか?

Apple TV、具体的にはApple TV第4世代のtvOS9.1.1を実行しているようなものを制御できるプログラムを書くことができるかどうか知りたいです。 AppleのiOS用リモートアプリは可能です。4つの基本的な方向にナビゲートし、画面上のアイテムを選択し、ナビゲーションスタックを上に移動するためのコマンドを送信したいと思います。これは、基本的にAppleのリモートアプリが実行できることです。

誰かが使用するプロトコルをリバースエンジニアリングしたことがありますか? Cursory Googlingは、これまでのところ、以前の世代のApple TVとDAAPプロトコルについて、私が望んでいるものとは異なるもののように見える、時代遅れの結果をもたらしただけです。

14
GuyGizmo

Apple TV(現在tvOS 9.2を実行中)をpythonスクリプトから制御できました。制御できないことがわかりましたホームシェアリングを使用してリモートアプリに制御させる必要があるApple TV。ホームシェアリングが有効になっている場合、次の方法が機能するかどうかはわかりませんが、 Apple TVでは無効になっています。iOSリモートアプリには、デバイスを手動で追加するオプションがあります(残念ながら、必要だったため、すでにペアリングされているすべてのデバイスを削除する必要があります「デバイスの追加」ボタンが表示されるようにします。)iPhoneをApple TVにペアリングしたら、そのリクエストの一部を記録し、ペアリングGUIDをコピーして、構築しました。私自身の要求のいくつか。

必要なリクエストは次の3つだけです。

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

Apple TVにログインします。応答の最後の4バイトはセッションIDであり、ビッグエンディアンの4バイト整数としてエンコードされます。

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

ログアウトします。ログインすると新しいセッションIDが取得されるだけなので、厳密には必要ありませんが、期待どおりに実行することは悪い考えではありません。

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

ユーザー入力をApple TVに送信します。データは、コマンドを入力するいくつかのバッファーの1つ、または移動タッチの可能性があります。基本方向に移動する場合は、これらの要求のいくつかを送信して、動くタッチが必要です。

私はここでこれを行う方法を示すpythonスクリプトを持っています: http://Pastebin.com/mDHc353A

リクエストライブラリを利用します: http://docs.python-requests.org/en/master/

また、Adam Miskiewicz/githubユーザーskevyにも特に感謝します。これは、移動のために送信する適切なバッファーを便利に備えた彼のアトラスバックエンドリポジトリでこのファイルを利用したためです: https://github.com/skevy/atlas -backend/blob/master/atlas/services/appletv.coffee

1
GuyGizmo

tcpdumpを使用してiPhoneのトラフィックをキャプチャし、WireSharkで分析しました。リモートアプリは、ポート3689で通常のHTTPリクエストを使用してApple TVに問い合わせます。

アプリのワークフローは、次の4つのHTTPリクエストで構成されています。

  • /server-info Apple TV。それは Apple独自のDAAP応答(デジタルオーディオアクセスプロトコル) デバイスに関するいくつかのタグを提供して応答します。表示名のように。
  • /loginは、接続中にアプリが「Connecting to Apple TV ...」」メッセージを表示したときに実行され、ログインステータスについてDAAPで応答します。
  • これがボトルネックです。 /home-share-verifyは、アプリとApple TV)の間の接続を検証します。この呼び出しには、長い不明な文字列値を持つClient-DAAP-Validationヘッダーが必要です。ウィキペディアによると、これはiTunes 7.0以降で導入され、リバースエンジニアリングされていない検証済みソース間の証明書交換によって生成されたハッシュのようなものです。
  • /ctrl-int/1/{controlpromptupdate|controlpromptentry|playstatusupdate}は入力ボタンに対して行われた呼び出しのようです。

他のいくつかのマイナーコールがその間に発生します(Bonjourサービスの更新や/databasesコールなど)。

ここ および ここ より多くの情報を見つけることができます。これが、このシンプルな(ただし保護された)アプリの動作の概要を把握するのに役立つことを願っています。

7

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に設定し、古いappletvリモートアプリをアクティブにして、アプリが実行しているリクエストを表示することで、CONTROL_PAIR_IDとCONTROL_SESSION_IDを抽出しました

iphoneをfiddlerで動作するように設定する方法がわからない場合は、ここで見つけることができます: http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureForiOS

2
Shaybc

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
nbitto