Кто-нибудь изменил протокол, используемый удаленным приложением 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