- PVSM.RU - https://www.pvsm.ru -

Как работает Chromecast?

Введение

Загорелся я недавно выбором беспроводного адаптера для передачи видео. Смотрел китайские адаптеры с Miracast/DLNA и, естественно, не обошел меня стороной и Chromecast. Если с такими технологиями, как WiDi, Miracast и донглами вроде AIRTAME все понятно (не требуется поддержка со стороны софта, видится системой как еще один монитор), как устроен Chromecast внутри я не был до конца уверен, как и не был уверен, подойдет ли он мне. Однако, я нашел open-source проект эмулятора Chromecast LeapCast [1], и решил его испробовать в работе, а также изучить протокол.

Установка и использование

Установка на ArchLinux довольно простая — достаточно установить пакет leapcast-git [2] из AUR. Необходимо еще установить Google Chrome или Chromium, т.к. его нет в зависимостях.

Запускаем программу и видим следующую картину:

Скрытый текст

INFO:root:Starting SSDP server
INFO:root:Starting LEAP server
INFO:root:Loading Config-JSON from Google-Server
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): clients3.google.com
INFO:root:Parsing Config-JSON
INFO:root:Added edaded98-5119-4c8a-afc1-de722da03562 app
INFO:root:Added PlayMovies app
INFO:root:Added 00000000-0000-0000-0000-000000000000 app
INFO:root:Added 1812335e-441c-4e1e-a61a-312ca1ead90e app
INFO:root:Added 06ee44ee-e7e3-4249-83b6-f5d0b6f07f34 app
INFO:root:Added 2be788b9-b7e0-4743-9069-ea876d97ac20 app
INFO:root:Added GoogleSantaTracker app
INFO:root:Added 06ee44ee-e7e3-4249-83b6-f5d0b6f07f34_1 app
INFO:root:Added Pandora_App app
INFO:root:Added aa35235e-a960-4402-a87e-807ae8b2ac79 app
INFO:root:Added YouTube app
INFO:root:Added HBO_App app
INFO:root:Added TicTacToe app
INFO:root:Added Revision3_App app
INFO:root:Added Songza_App app
INFO:root:Added a7f3283b-8034-4506-83e8-4e79ab1ad794_2 app
WARNING:root:Didn't add Netflix because it has no URL!
INFO:root:Added GoogleMusic app
INFO:root:Added 18a8aeaa-8e3d-4c24-b05d-da68394a3476_1 app
INFO:root:Added Post_TV_App app
INFO:root:Added ChromeCast app
INFO:root:Added Hulu_Plus app
INFO:root:Added GoogleCastSampleApp app
INFO:root:Added GoogleCastPlayer app
INFO:root:Added Fling app

Открываем любое приложение на андроид-смартфоне, поддерживающее Chromecast (например, YouTube), и можем подключиться к Leapcast:
image [3]
В это же время в логе:

Скрытый текст

INFO:tornado.access:200 GET /ssdp/device-desc.xml (192.168.0.105) 2.22ms
INFO:tornado.access:200 GET /apps/YouTube (192.168.0.105) 3.18ms
INFO:tornado.access:200 GET /apps/YouTube (192.168.0.105) 3.67ms
INFO:tornado.access:201 POST /apps/YouTube (192.168.0.105) 5.29ms
INFO:root:Channel for app set to <leapcast.services.websocket.ServiceChannel object at 0x195f690>

Ого, работает! Как же оно работает?

Протокол

Для поиска и первоначального управления (запуск нужного приложения, получение параметров) используется протокол DIAL [4] — некий симбиоз SSDP для поиска и HTTP REST + XML для управления. SSDP, возможно, знаком вам, если вы использовали UPnP и DLNA, а REST-часть достаточно простая.

  1. При запуске LeapCast, происходит подключение к серверу Google с целью получения списка официально поддерживаемых приложений в формате json [5]. В этом файле описываются всякие параметры для каждого приложения: по какой ссылке отправлять запрос, с какими параметрами запускать и так далее.
  2. LeapCast анонсирует себя по SSDP.
  3. Android-клиент (в моем случае YouTube) находит LeapCast по SSDP, получает о нем информацию (обращаясь к /ssdp/device-desc.xml), далее убеждается, что устройство работает с YouTube (запрашивая /apps/YouTube), подключается к серверу YouTube, забирает у него pairing token, отправляет его LeapCast в POST-запросе (на все тот же /apps/YouTube).
  4. LeapCast запускает Chrome/Chromium-приложение по ссылке www.youtube.com/tv [6]?${POST_DATA}
  5. Далее, для связи Android и LeapCast используется протокол RAMP [7] (Google удалил спецификацию со своего сайта). Он описывает взаимодействие между устройствами посредством пересылки json-сообщений внутри WebSocket.
  6. Для завершения взаимодействия, Android посылает DELETE-запрос на Leapcast на тот же URL

В случае с YouTube, как я понимаю, WebSocket поднимается на стороне серверов YouTube, однако, другие приложения (например, Google Music) требуют LeapCast создать WebSocket, и управление происходит уже внутри вашей беспроводной сети.

Следует заметить, если приложение, которые поддерживает Chromecast, не было одобрено в Google (и, соответственно, записи о нем в json нет), то пользователи смогут им воспользоваться только войдя в режим разработчика и загрузив информацию о нем. Достаточно печально.

Заключение

В общем-то, с LeapCast вы можете превратить любое устройство, способное запускать Python + Chrome в почти полноценный аналог Chromecast, если, по какой-то причине вы не можете купить и так дешевое устройство. А я так и не надумал покупать его, т.к. не работает без интернета, требуется одобрение приложений Google, да и вообще.

Автор: ValdikSS

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/news/53931

Ссылки в тексте:

[1] LeapCast: https://github.com/dz0ny/leapcast

[2] leapcast-git: https://aur.archlinux.org/packages/leapcast-git/

[3] Image: http://habr.habrastorage.org/post_images/ddd/59a/3bf/ddd59a3bf5670567f6174408554ffadb.png

[4] DIAL: http://www.dial-multiscreen.org/

[5] официально поддерживаемых приложений в формате json: https://clients3.google.com/cast/chromecast/device/config

[6] www.youtube.com/tv: https://www.youtube.com/tv

[7] RAMP: https://github.com/dz0ny/leapcast/wiki/RAMP-protocol

[8] Источник: http://habrahabr.ru/post/210742/