Кто-нибудь изменил протокол, используемый удаленным приложением Apple iOS для управления Apple TV по IP?

Мне любопытно, можно ли мне писать программы, которые могут управлять Apple TV, в частности Apple TV 4-го поколения под управлением tvOS 9.1.1, например, удаленное приложение Apple для iOS. Я хотел бы отправить ему команды для навигации по четырем основным направлениям, выбора элемента на экране, поднятия навигационного стека-по сути, то, что может сделать удаленное приложение Apple.

кто-нибудь сделал какую-либо работу по обратному проектированию протокола, который он использует? Бегло погуглил только до сих пор не дал устаревшие результаты о телевизорах Apple более раннего поколения и протоколе DAAP, который выглядит как-то иначе, чем то, что я хочу.

4 ответов


я захватил трафик на моем iPhone с помощью tcpdump и проанализировал его с помощью WireShark. Удаленное приложение запрашивает Apple TV с обычными HTTP-запросами на порту 3689.

рабочий процесс приложения состоит из четырех HTTP-запросов:

  • /server-info для получения информации о Apple TV. Он отвечает Apple proprietary DAAP response (Digital Audio Access Protocol) предоставление некоторых тегов об устройстве, таких как дисплей имя.
  • /login выполняется во время подключения, когда приложение отображает "подключение к Apple TV..." сообщение. Он отвечает DAAP о статусе входа в систему.
  • вот узкое место. /home-share-verify проверяет соединение между приложением и Apple TV. Этот вызов требует Client-DAAP-Validation заголовок с длинным неизвестным строковым значением. Согласно Википедии, это похоже на хэш, генерируемый обменом сертификатами между проверенными источниками, который был представлен в iTunes 7.0+ и никогда не реверс-инжинирингом.
  • /ctrl-int/1/{controlpromptupdate|controlpromptentry|playstatusupdate} представляется звонки для входных кнопок.

некоторые другие незначительные вызовы запускаются между ними (например, обновление службы Bonjour или /databases звонок).

здесь и здесь вы можете найти более подробную информацию. Надеюсь, это поможет получить представление о том, как работает это простое (но защищенное) приложение.


Я хотел сказать alexa, чтобы вызвать appletv, и это разбудит мой appletv и через HDMI & CEC включите мой телевизор,

для того, чтобы сделать это: с вашего mac\linux\windows просто запустите: завиток -XPOST -д 'смкк\х00\х00\х00\с x01\x30cmbe\х00\х00\х00\x04menu' 'http://10.1.1.56:3689/ctrl-int/1/controlpromptentry?prompt-id=144 & session-id=1'

абстрактная команда: завиток -XPOST -д'смкк\х00\х00\х00\с x01\x30cmbe\х00\х00\х00\x04menu' 'http://{APPLETV_IP}: 3689/ctrl-int / 1 / controlpromptentry?prompt-id={CONTROL_PAIR_ID} & session-id={CONTROL_SESSION_ID}'

я извлек CONTROL_PAIR_ID и CONTROL_SESSION_ID, установив Мои настройки прокси-сервера http iphone wifi на мой mac с fiddler на нем и активировал старое удаленное приложение appletv и отобразил запросы, которые приложение выполняет

Если вы не знаете, как настроить iphone на работу с fiddler, вы можете найти его здесь: http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureForiOS


мне удалось управлять моим Apple TV (в настоящее время работает tvOS 9.2) из скрипта python. Оказывается, вы не нужно чтобы использовать Home Sharing для удаленного управления приложением Apple TV. Я не знаю, будет ли работать следующий метод, если включен домашний доступ, но с его отключением на Apple TV удаленное приложение iOS имеет возможность вручную добавить устройство. (Это может потребовать удаления всех устройств, с которыми он уже сопряжен, так как это, к сожалению, необходимо для я, чтобы заставить его отобразить кнопку "Добавить устройство".) После того как я соединил свой iPhone с Apple TV, я записал некоторые из его запросов, скопировал GUID сопряжения, а затем построил некоторые из моих собственных запросов.

необходимо сделать только три запроса:

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

вход в Apple TV. Последние четыре байта ответа-это идентификатор сеанса, закодированный как большое четырехбайтовое целое число.

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

выходит. Не совсем необходимо, так как я обнаружил, что ведение журнала in просто дает вам новый идентификатор сеанса, но, вероятно, не плохая идея делать все так, как он ожидает.

/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/

также особая благодарность Адаму Мискевичу / пользователю github skevy, так как я использовал этот файл в своем РЕПО atlas-backend, который удобно имел правильные буферы для отправки на движение: https://github.com/skevy/atlas-backend/blob/master/atlas/services/appletv.coffee


AppleTV 2,3 и 4 можно контролировать с помощью HomeSharing.рамки. Неофициальная спецификация протокола 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 framework: протокол объясняется в : https://github.com/jeanregisser/mediaremotetv-protocol