Содержание статьи
Сегодня мобильный гаджет — это уже не роскошь и не игрушка гика, назначение которой известно только ему самому, а такая же обычная вещь, как телевизор или микроволновка. Большинство из нас владеют не только смартфоном, но и планшетом, ноутбуком, портативной игровой приставкой, а у многих есть умные HDMI-стики под управлением Android. Проблема всего этого многообразия только в том, что в мобильных ОС нет средств для синхронизации и удаленного взаимодействия множества устройств.
Вместо введения
Google и Apple сделали многое для того, чтобы их девайсами было пользоваться настолько удобно, насколько это возможно. Единый аккаунт для доступа к сервисам, прозрачная синхронизация данных, облачное хранилище для настроек — это только часть реализованных софтверными гигантами функций, которые делают гаджеты чрезвычайно удобными в использовании и экономят уйму времени.
Тем не менее, когда речь заходит о синхронизации нескольких устройств между собой, возникают серьезные проблемы. Ни в одной ОС просто нет такой функциональности. Конечно, мы можем привязать все устройства к единому Google- и Apple-аккаунту, который позволит нам устанавливать последние версии софта, получать письма, сообщения и другие уведомления сразу на все девайсы. Однако ни о какой синхронизации настроек, списков установленных приложений и данных на карте памяти речи не идет, каждое устройство — это «вещь в себе», которая может иметь доступ к одному облаку-хранилищу, но не более того.
Мы не будем разбираться, почему сложилась такая ситуация, а вместо этого обсудим способы решения проблемы, то есть попытаемся найти инструменты и модификации, которые помогли бы нам настроить синхронизацию и взаимодействие различных устройств. Android-устройства разного назначения в наших широтах распространены гораздо сильнее iOS, поэтому речь пойдет о зеленом роботе.
Что к чему
Когда мы говорим «синхронизация нескольких устройств», то чаще всего имеем в виду смартфон и планшет, именно эти два устройства пользуются наибольшей популярностью. Однако, кроме них, на рынке существует масса других Android-девайсов, включая умные телевизоры, набравшие популярность китайские HDMI-донглы, а также более экзотические вещи, такие как игровая приставка OUYA и карманная консоль NVIDIA Shield.
Лично у меня имеется в общей сложности шесть различных Android-девайсов, из которых я ежедневно пользуюсь тремя и еще одним как минимум несколько раз в неделю. Это смартфон, планшет, игровая консоль и HDMI-донгл. Устройства, как видно, сильно разнятся по назначению, функциональности, а также установленным версиям Android. Поэтому задача их синхронизации и взаимодействия была довольно нетривиальной, требовалось обеспечить общий доступ всех устройств к файловому хранилищу, синхронизацию приложений между нужными девайсами, сделать из смартфона универсальный пульт управления, а также поднять DLNA-сервер, с которого все устройства могли тянуть мультимедиафайлы.
Данные приложений
Первое, что следует сделать, — это организовать синхронизацию настроек и данных приложений между устройствами. По сути, это главная проблема, которая содержит в себе наибольшее количество подводных камней. Дело в том, что в Android сделать синхронизацию настроек и данных приложений далеко не так просто, как в классических настольных ОС. Если в той же Windows или Linux достаточно просто скопировать файлы и каталоги настроек приложения на другую машину, то здесь мы, во-первых, столкнемся с проблемой разграничения прав, которая не позволяет одному приложению получить доступ к данным другого, а во-вторых, можем получить проблему несовместимости устройств между собой.
По причине первого ограничения синхронизация настроек приложений возможна только при наличии прав root на обоих устройствах, по причине второго не обойтись без специализированных инструментов, которые могут исправить проблемы в случае их возникновения. Всего существует два типа инструментов, которые нам подойдут, это приложения для бэкапа типа Titanium Backup и Helium, а также специализированные приложения для синхронизации, вроде DataSync и AppSync. Преимущество первых в асинхронности работы: скопировал настройки сегодня, восстановил на другом девайсе завтра. Преимущество вторых в возможности настройки синхронизации по времени, например каждую ночь.
К счастью, есть инструмент, который сочетает в себе достоинства обоих подходов. DataSync не только умеет копировать настройки приложений и файлы на карте памяти на любой девайс в той же локальной сети, но и позволяет делать бэкап в Dropbox или Box.com, а в качестве дополнения имеет поддержку Bluetooth и NFC, которая пригодится в дороге.
Хакер #178. Mesh-сети или строим свой интернет
Алгоритм использования DataSync следующий. Устанавливаем приложение на все устройства, которые должны участвовать в синхронизации, запускаем его. Далее на том устройстве, которое должно принять или передать свои настройки другому, выбираем нужные приложения и файлы. Все они будут добавлены в очередь (Queue), получить доступ к которой можно, выдвинув панель снизу. После этого нажимаем на иконку синхронизации сверху (две стрелки) и выбираем нужное устройство из списка. Тап по устройству откроет диалог выбора типа синхронизации: в обе стороны (возможность доступна только в платной версии), туда или сюда. После выбора начнется процесс синхронизации.
Само собой разумеется, что каждый раз запускать приложение и включать синхронизацию не самое интересное занятие, поэтому в DataSync есть возможность настроить синхронизацию по расписанию. Для этого достаточно сохранить очередь с помощью иконки дискеты вверху экрана, затем долго удерживать палец на ее имени в списке и выбрать в меню пункт Schedule Queue. Так ты получишь возможность настроить выборочную синхронизацию нужных приложений на разных устройствах.
По принципу своей работы DataSync — это типичный бэкапер. Он берет пакет с приложением, затем копирует все его настройки и файлы и отправляет на удаленное устройство. Поэтому он может быть также использован для: а) собственно бэкапа приложений, б) установки нужных приложений вместе с настройками на новое/перепрошитое устройство с другого устройства и в) для асинхронной синхронизации: одно устройство сохраняет в Dropbox, другое (другие) — восстанавливает.
Файлы
Кроме синхронизации приложений, DataSync вполне можно использовать для обмена файлами между девайсами. В случае редких копирований небольших объемов данных (книги, например) его возможностей будет вполне достаточно, а вот если речь идет о постоянных синхронизациях файлов в обе стороны, а также о доступе к большим хранилищам данных (домашний медиаархив), DataSync не подойдет.
После множества экспериментов с разными утилитами синхронизации я пришел к выводу, что наиболее удобны CifsManager, позволяющий подключать SMB-диски к любому каталогу на карте памяти (видим всем приложениям), SSHFSAndroid, подключающий шары по протоколу SSH, и DropSync, который автоматически синхронизирует указанный каталог с диском Dropbox.
Монтирование SMB-шар
Чтобы подключить расшаренную Windows-папку вручную, нужно выполнить такую последовательность команд:
$ insmod /sdcard/ko/dns_resolver.ko
$ insmod /sdcard/ko/md4.ko
$ insmod /sdcard/ko/cifs.ko
$ insmod /sdcard/ko/nls_utf8.ko
$ mount -t cifs -o iocharset=utf8,username=юзер,password=пароль,file_mode=0777,dir_mode=0777 //IP/share /sdcard/cifs
INFO
Кроме UPnP/DLNA, XBMC также поддерживает технологию потокового вещания Apple AirPlay: «Настройки -> Службы -> AirPlay -> Разрешить XBMC получать содержимое AirPlay».
В отличие от многих других SMB, SSH и Dropbox-клиентов, которые можно найти в маркете, эти три приложения не ограничивают доступ к шарам только через себя, а вместо этого монтируют их к общедоступным каталогам, так что с данными можно работать из любой программы. CifsManager и SSHFSAndroid удобно использовать для доступа к домашней файлопомойке; подключаем сетевой диск и работаем с файлами, как с локальными (правда, медиасервер их индексировать не будет).
DropSync идеально подходит для синхронизации небольших объемов данных между разными устройствами и ПК: чтобы, например, распространить электронную книгу на все устройства, достаточно скачать ее на ноутбук и положить куда-нибудь в ~/Dropbox/Books, буквально через несколько секунд она появится на всех девайсах с установленным и настроенным DropSync. И никакой зависимости от локальной сети и интернет-соединения как такового (синхронизация произойдет, как только появится доступ к сети).
Теперь о том, как все это настроить. Начнем с CifsManager. Здесь все очень просто и сложно одновременно. С одной стороны, достаточно запустить приложение, нажать кнопку «Add New Share…» и в открывшемся окошке вбить адрес сервера в формате IP/имя-шары, указать имя юзера:пароль и точку монтирования, например /sdcard/cifs, создав каталог заранее. Затем нажимаем по сконфигурированной шаре, и она смонтируется.
Но это только теория, на практике все несколько сложнее. По сути, CifsManager — это всего лишь оболочка для запуска примерно такой команды:
$ mount -t cifs -o username=юзер,password=пароль,file_mode=0777,dir_mode=0777 //IP/имя-шары /sdcard/cifs
Однако она сработает только в том случае, если в ядро вшит модуль cifs.ko, либо его можно найти по адресу /system/lib/cifs.ko. Если это не так, файловая система подключена не будет, а «не так» это на очень многих смартфонах. Что делать, если модуля нет? Здесь два варианта: либо прошить ядро с поддержкой cifs, либо найти/скомпилировать подходящий для своего ядра модуль.
О том, как выбирать и прошивать ядра, у нас уже была целая статья, поэтому остановимся на втором варианте. В общей сложности, кроме модуля cifs.ko, для новых версий Android нам понадобятся также модули md4.ko, dnsresolver.ko, а также опционально nlsutf8.ko, если в шаре будут файлы с русскими именами. При этом все модули должны быть скомпилированы именно для той версии ядра Linux, которая прошита в девайс. Найти их удастся далеко не для каждого устройства, но попытаться стоит, используя поисковые запросы вроде galaxy s3 cifs.ko. Обычно все необходимые модули запакованы в один zip-архив, который достаточно развернуть и скопировать на карту памяти. Далее заходим в настройки CifsManager, ставим галочку напротив опции Load vid insmod, а в поле Path to cifs.ko перечисляем пути до всех модулей через двоеточие, например: "/sdcard/md4.ko:/sdcard/dnsresolver.ko:/sdcard/nlsutf8.ko:/sdcard/cifs.ko". После этого программа должна начать нормально монтировать шары.
Если же подобные извращения ради возможности получить доступ шаре тебя совсем не радуют, то я хотел бы обратить внимание на SSHFSAndroid, который позволяет монтировать удаленные ФС по протоколу SSH. Фактически это просто обертка вокруг известной файловой системы пространства пользователя sshfs, использующая модуль Linux-ядра FUSE, включенный во все стоковые ядра начиная с Android версии 2.2 (с помощью FUSE в Android происходит монтирование установленных на карту памяти приложений и виртуальных карт памяти).
Пользоваться SSHFSAndroid довольно просто. После запуска главное окно приложения будет пусто, за исключением кнопок «+» и «Настройки» в верхней части окна. Чтобы подключить новую ФС, нажимаем кнопку «+» и последовательно заполняем все поля выведенного на экран меню: Name — произвольное имя, Host — IP или имя хоста (например, 192.168.0.100), Remote path — путь до каталога на удаленной стороне (например, /home/vasya), Mount point — точка монтирования (/sdcard/share), Username — имя юзера и Password — пароль соответственно. Далее нажимаем кнопку «Сохранить» (пиктограмма в виде дискеты) и, вернувшись на главный экран, просто кликаем на пункте с именем соединения. После запроса прав root файловая система будет смонтирована к указанному каталогу, с которым можно работать с помощью любого файлового менеджера.
Теперь о DropSync. По сути, это приложение выполняет ту же задачу, что и настольная версия Dropbox: позволяет хранить файлы на флешке, периодически синхронизируя их с облачным хранилищем. Синхронизация происходит только в отношении изменившихся файлов, а каталоги для синхронизации можно выбирать индивидуально, отправляя и получая из облака только то, что реально нужно на смартфоне, без необходимости качать несколько гигабайт.
DropSync очень прост в использовании, надо лишь выбрать каталог для синхронизации, каталог в Dropbox и метод синхронизации: в одну сторону или в обе. После этого софтина повиснет в фоне и будет периодически копировать изменения в файлах на диск Dropbox и обратно. Сразу рекомендую приобрести Pro-версию, в ней реализована поддержка Linux-технологии inotify для моментальной синхронизации сразу после изменения файлов, а также убрано ограничение на размер файла в 5 Мб и на один синхронизируемый каталог.
UPnP/DLNA
Главная проблема всех перечисленных способов обмена файлами в необходимости получения root, настройки и даже установки разных модулей. В XXI веке, когда смартфоны чуть ли не заваривают тебе кофе, это выглядит несколько архаично. Некоторое время назад была придумана технология UPnP (Universal Plug and Play), которая позволяет соединить все доступные «умные» устройства в общую сеть с возможностью доступа к различным функциям. К сожалению, разработчики софта и операционных систем недооценили возможности UPnP, и сегодня технология в основном используется только для обмена и удаленного проигрывания мультимедиафайлов в составе технологии DLNA, которая стала идеологическим наследником и расширением UPnP. Эти две технологии (часто они упоминаются как единый стек технологий) сегодня используются везде, включая разные медиапроигрыватели и телевизоры. В Android поддержки UPnP/DLNA как таковой нет, но ее можно найти в большом количестве мультимедийных приложений, а также специализированном софте, вроде BubbleUPnP и торрент-клиентах.
В своей основе стек UPnP/DLNA базируется на классической клиент-серверной модели взаимодействия, в которой сервер выступает в роли раздатчика мультимедиаконтента, а клиент получает его и проигрывает. Отличие от других технологий только в том, что каждое устройство здесь зачастую носит универсальный характер, выступая в роли как сервера, так и клиента, а также может быть контроллером, который управляет остальными устройствами и позволяет определять, что, где и откуда будет проигрываться (хотя все зависит от реализации, конечно).
Такая архитектура в сочетании с автоматическим объединением устройств в сеть позволяет реализовывать самые разнообразные схемы взаимодействия устройств. В нашем случае мы можем буквально в несколько тапов сделать так, чтобы фильм, хранящийся в памяти планшета, начал проигрываться на HDMI-донгле, используя в качестве пульта управления смартфон. А еще в несколько тапов — чтобы музыка из донгла заиграла на смартфоне.
Есть три основных Android-приложения, поддерживающих UPnP/DLNA. Это VPlayer (через VPlayer uPnP DLNA Plugin), XBMC и BubbleUPnP. Первый позволяет проигрывать контент с DLNA-сервера, второй — раздавать и проигрывать, а третий — это комбайн в стиле «все в одном», который играет, раздает и управляет другими клиентами и серверами. Встроенная поддержка клиентского DLNA есть также в HDMI-донглах на базе чипов Rockchip 3066 и Rockchip 3166 (это практически любой современный донгл).
В моей домашней конфигурации, включающей в себя TV-приставку OUYA с подключенным жестким диском, а также HDMI-донгл, телефон и планшет, используются следующие приложения: на OUYA, которая, кроме воспроизведения медиаконтента на телевизоре, также отвечает за хранение всех мультимедиаданных, установлен XBMC, в настройках которого включены все режимы работы DLNA (Службы -> UPnP -> Все опции). На телефон и планшет установлены BubbleUPnP, HDMI-стик идет со встроенным клиентом DLNA.
Для того чтобы проиграть тот или иной медиафайл на каком-либо устройстве, теперь достаточно запустить BubbleUPnP, выбрать на вкладке Devices устройство для отображения контента (RENDERERS), в качестве раздатчика контента выбрать XBMC — и все. Далее находишь нужный файл в библиотеке (вкладка "LIBRARY") и тапаешь по нему. В любой момент я могу сменить устройство для отображения или раздачи контента, и воспроизведение продолжится на нем. Никаких настроек, никаких IP-адресов и номеров портов.
Chromecast
DLNA — прекрасная технология, но она не рассчитана на стриминг потоков из сети Интернет. Другими словами, если мы захотим посмотреть видео в YouTube, придется запускать клиент сайта на самом устройстве, хотя гораздо удобнее было бы выбрать нужное видео на смартфоне, а затем автоматически запустить его на телевизоре.
INFO
Поддержка стриминга по протоколу Chromecast есть в приложении YouTube for Google TV. Для активации выбираем в меню пункт Pair with mobile device и следуем инструкциям.
Специально для таких целей Google изобрела аналог Apple AirPlay, названный Chromecast. Официально эта технология поддерживается только одноименным HDMI-донглом производства самой Google, но протокол оказался настолько прост, что очень скоро энтузиасты его разобрали и создали альтернативную реализацию в составе приложения CheapCast.
Теперь, чтобы превратить любой Android-девайс в Chromecast, достаточно установить на него приложение CheapCast из маркета, запустить и нажать кнопку запуска вверху экрана. После этого во всех поддерживающих Chromecast приложениях автоматически появится кнопка в форме прямоугольника с логотипом Wi-Fi в углу. Нажимаем на кнопку, выбираем устройство, и видео проигрывается на нем.
Единственная проблема в том, что в данный момент Chromecast-стриминг поддерживают только YouTube и встроенный медиаплеер, но Google обещала добавить поддержку в PLay Фильмы, Netflix и несколько других. Над возможностью стриминга из любых приложений работал Kush из команды CyanogenMod, однако Google быстро завернула эту разработку, отключив возможность стриминга любым сторонним приложениям.
Пульт/джойстик
Для управления разными TV-приставками, HDMI-стиками и в некоторых случаях планшетом понадобится «удаленный» пульт. Я не предлагаю покупать специальные Bluetooth-пульты или оборудовать девайсы инфракрасными приемниками, вместо этого превратим в пульт смартфон. Из всего многообразия приложений-пультов, которые можно найти в Google Play, единственный достойный вариант — это DroidMote. Клиент у него бесплатный, однако за сервер для Android-устройства придется заплатить 80 рублей.
Клиент и сервер находят друг друга и соединяются в автоматическом режиме, поэтому настраивать ничего не придется. Из инструментов управления доступны: тачпад, клавиатура, мультимедиапульт и джойстик. Последний, кстати, особенно интересен тем, что позволяет создать маппинг клавиш к точкам на экране управляемого устройства, так что с его помощью можно играть в абсолютно любые игры, даже если они не поддерживают джойстик.
INFO
SSHFSAndroid не работает в Android 4.2, однако автор обещает исправить проблему в ближайшее время.
Функциональность сервера доступна только в платной версии BubbleUPnP, стоимостью 140 рублей.
Для расшаривания карты памяти любого гаджета можно использовать приложение SambaDroid. Оно не требует настройки и запускает Samba-сервер автоматически после старта приложения.
Выводы
Объединение гаджетов в одну слаженно работающую сеть — непростая задача, и описанные в данной статье приемы не идеальны и подойдут не всем. Однако пока у нас нет других инструментов, и приходится только ждать, когда сама Google или разработчики CyanogenMod добавят такие возможности в Android. В том, что это произойдет, я уверен на 100%, вопрос только когда.