Взаимодействие Android-устройств в локальной сети
Предположим, мы пишем игру для Android, которая подразумевает некое сетевое взаимодействие между устройствами. Причем наши устройства находятся в одной сети и мы хотим, чтобы взаимодействие между ними осуществлялось быстро, а значит вариант с обменом данными через интернет нам не подходит. Ах да, еще одна маленькая ложка дегтя — мы хотим охватить максимально возможную аудиторию, для чего нам необходимо поддерживать Android 2.3.
Что же нам делать? Давайте поговорим об этом, а заодно рассмотрим относительно новые возможности Android SDK для соединения двух и более устройств.
О чем это и для кого это?
Как-то раз, уйдя с предыдущего места работы и погрузившись в заслуженный отдых, я принялся писать сетевую игру, в которую могут играть люди, находящиеся в одной локальной сети. И сразу же столкнулся с тем, что для нормального функционирования подобной игры нам мало соорудить сетевое взаимодействие — нам нужно сделать нормальное и быстрое обнаружение устройств в сети. Собственно, в данной статье я поделюсь своим опытом в реализации решения для данной задачи.
Сразу оговорюсь, что статья предназначена в большей мере для тех, кто имеет опыт Android-разработки, написал несколько приложений и хочет расширить свой кругозор, а также улучшить профессиональные навыки.
Какие возможные способы решения существуют?
- Android Network Service Discovery. Простой и эффективный способ обнаружения устройств. На Android Developer есть пошаговое руководство по подключению NSD, есть пример NsdChat, который можно скачать там же. Но есть один существенный минус — данный метод поддерживается только начиная с API Level 16, то есть с Android 4.1 Jelly Bean;
- Второе решение, предлагаемое нам на сайте Android Developer — Wi-Fi Peer-to-Peer. Проблема этого метода та же самая — поддерживается он только начиная с API Level 16;
- Есть странное решение, которое предлагается некоторыми программистами на Stack Overflow — самостоятельно сканировать локальную сеть на предмет наличия сервера. То есть проходить по всем адресам сети. Это уже сейчас звучит как странный велосипед, а теперь представьте, что порт нашего сервера назначается автоматически. Таким образом, сканирование даже самую небольшой сети становится достаточно долгой и трудоемкой задачей;
- Наконец, мы можем обратить внимание на Java-библиотеки и написать что-нибудь с их использованием. Например, JmDNS.
Последний способ выглядит вполне адекватным и, кажется, может обеспечить нас требуемой скоростью и удобством обнаружения устройств в сети для конечного пользователя.
Я вооружился JmDNS и решил попробовать соорудить несколько классов, которые по максимуму упростят написание описанных выше приложений. Но для начала пришлось немного повырезать дубликаты .class-файлов из jar-пакета JmDNS (проблема описана здесь):
Далее я взял исходный код NsdChat с Android Developer и изменил его служебный класс, который отвечает за инициализацию сокетов и организацию сетевого взаимодействия. Также я написал wrapper для JmDNS
Здесь размещены 4 основные функции для работы Network Discovery:
- startServer для создания сервера и регистрации соответствующего сервиса в локальной сети;
- findServers для поиска серверов;
- reset для окончания работы с Network Discovery и последующего освобождения ресурсов;
- wifiLock для запроса блокировки Wi-Fi.
В завершении я написал универсальный класс ConnectionWrapper для полноценной организации обнаружения, а также обмена сообщениями в локальной сети. Таким образом, создание сервера в конечном приложении выглядит следующим образом:
А вот и mServerHandler, использующийся для приема и обработки сообщений:
Отправка сообщений еще проще:
И, наконец, метод для обнаружения и подключения к серверу:
Как видите, все очень просто. А главное, все это работает в любой версии Android для максимум двух устройств. Но сделать так, чтобы это работало для условно неограниченного числа устройств очень легко, и очевидное решение придет к вам почти сразу после детального изучения класса Connection. Пусть это будет в качестве домашнего задания.
Ах, да, весь код доступен для изучения и использования всеми желающими в моем репозитории на GitHub.. И, конечно, не исключаю то, что некоторые вещи можно сделать лучше и проще, поэтому не стесняйтесь форкать и делать pull request’ы.
Источник
ПО для взаимодействия ПК и смартфона
С момента покупки смарта на Android меня заинтересовало его функциональное наполнение. На практике оказалось, что Android способен выполнять практически любую задачу, решаемую на обычном ПK, только медленнее и не всегда удобнее. Зато дополняет ПК он прекрасно, и механизмов использования возможностей смарта на ПК и возможностей ПК на смарте — уйма.
Статья ориентирована в основном на формирующихся и будущих пользователей Android-смартфонов; надеюсь, что продвинутые пользователи также найдут в ней что-то новое и/или внесут свою лепту. Под катом по пунктам, в вопрос-ответном стиле.
Как использовать интернет-соединение ПК на смарте?
- Всё уже написано до меня. Лично я использую Connectify (создание WiFi Hotspot на Windows 7).
Как использовать интернет-соединение смарта на ПК?
- Всё уже написано до меня в том же топике. Здесь я пользуюсь стандартными возможностями ОС Android (Беспроводная связь и сети >> Режим модема, доступно начиная с Android 2.2). Владельцам смартов с более ранней версией Android следует обратить внимание на PdaNet (USB-Tethering, Bluetooth DUN).
Как расшарить файловую структуру устройства?
- Способ 1. Стандартно — через data-кабель. Недостатки очевидны — проводной контакт, приходится выгружать sd-карту, иногда устанавливать драйвер. Достоинство — скорость передачи.
Способ 2. Поднять на устройстве FTP (SSH, SMB, HTTP, HTTPS, WebDAV, AFP) -сервер. Способ надёжный и простой, требует WiFi-соединения с компьютером. Поднять FTP-сервер на устройстве способны такие программы, как On Air (предлагает также взаимодействие по протоколам WebDAV и AFP), SwiFTP, также возможность встроена в программы File Expert и Remote Web Desktop.
On Air отличается простым интерфейсом и минимумом настроек. После старта сервера генерируется четырёхзначный цифровой пароль (при попытках брута сервер обваливается после n-го количества запросов, по всей видимости, встроенная мера предосторожности), отображается адрес сервера. Основные недостатки в том, что нельзя вручную задавать имя пользователя, пароль (можно только указать, что этот пароль всегда будет статичным), порт сервера, share-каталог. Достоинство — простота.
SwiFTP FTP Server наиболее полноценный FTP-сервер из тех, которые я перепробовал. Указывается имя пользователя, пароль, порт и даже share-каталог (только здесь нашёл такую опцию). Недостаток — отсутствие возможности шаринга в один клик (имеется ввиду, что нельзя создать на рабочем столе ярлык, при щелчке на который поднимался бы ftp-сервер), и сам интерфейс не располагает.
File Expert (мой выбор) — приложение, выступающее как файловый менеджер, но включающее в себя как FTP, так и WEB-сервер. Достаточно настроек, нельзя только указать share-каталог (всегда sdcard). Можно создать ярлык быстрого запуска FTP- или WEB-сервера.
Remote Web Desktop (Full-версия платная) выступает как многофункциональный WEB-сервер, дополнительно встроен и FTP-сервер. Большой недостаток — в бесплатной версии для FTP-сервера ограничена скорость — всего 100 kb/s (в среднем без ограничения
2-4 Mb/s). Однако WEB-сервер обладает широким спектром возможностей. В платной версии возможно взаимодействие по протоколу HTTPS (нигде больше не видел такой возможности). Аналогов достаточно (обычно в названии содержат Web Desktop или что-то похожее), однако Remote Web Desktop наиболее функциональный, в бесплатной версии не так много ограничений.
Samba Filesharing (предложено belk) позволяет поднять на устройстве SMB-сервер. Наиболее актуально для пользователей Windows — устройство будет отображаться как общая сетевая папка. Нужен рут.
Платная QuickSSHd запускает SSH-сервер на смартфоне, на ПК остаётся воспользоваться каким-либо SCP/SFTP клиентом (Windows: WinSCP; Linux: OpenSSH; Mac: Cyberduck).
Способ 3. Доступ к файлам через bluetooth. Давний способ, требует наличия на принимающем устройстве блютуза. На Android дополнительного ПО не требуется, только включить видимость устройства. На Windows понадобится что-то вроде BlueSoleil.
- Способ 4. Использования интернет (файловые серверы, dropbox). Самоочевидно.
UPD: В ES Проводник недавно добавили возможность работы с dropbox.
Как просматривать файловую структуру ПК?
- Способ 1. Использование bluetooth. На устройстве устанавливаем ES Проводник (Настройки >> Bluetooth опции >> Убираем галку «Скрыть BT»; указываем папку обмена). На ПК для Windows понадобится BlueSoleil, в его настройках указать share-каталог.
- Способ 2. Поднять на ПК FTP (SMB, WEB) -сервер. Опять же, на смарте выручает ES Проводник, всё необходимое в нём есть. На компьютере под управлением Windows 7 можно воспользоваться
глючнымвстроенным в IIS FTP-сервером. А можно просто просматривать общие сетевые папки Windows (вкладка «ЛВС» в ES Проводник, вкладка «Сеть» в File Expert) — по Microsoft SMB Protocol.
Как получить полный доступ к камере устройства (управление, медиапоток)?
- Самый верный способ — воспользоваться возможностями IP Webcam for Android. Требуется — наличие стабильного WiFi (интернет) -соединения. При помощи IP Webcam поднимаем WEB-сервер, предварительно указав такие настройки, как разрешение видео, качество, ориентация, логин/пароль, порт, возможность передачи аудиопотока. После старта сервера заходим по указанному адресу (у меня это 192.168.2.101:8080) из браузера и выбираем любой из способов взаимодействия — можно открыть поток в медиаплеере, открыть панель удалённого управления, использовать java-плагин для браузера (воспроизводим видео и аудио в браузере, нужна только java!), использовать javascript для обновления кардов в браузере, просматривать транслируемое медиа на другом смартфоне при помощи tinyCam Monitor PRO (в бесплатное версии отсутствует возможность сканирования сети на наличие камер), использовать камеру смартфона для общения в Skype. Приведены краткие инструкции. Не добиться желаемого результата очень тяжело.
Как транслировать потоковое медиа со смартфона?
- Очень просто — установить VLC Direct. На ПК понадобится VLC Player. В VLC Direct на смарте можно воспользоваться Automatic Wizard в Settings — здорово облегчает весь процесс.
Как просматривать потоковое медиа на смартфоне?
- Воспользоваться каким-либо потоковым плеером — AndroStream Free (Pro), Stream Media Player (Pro), LittlePlayer Free (Pro).
Как управлять компьютером при помощи смартфона на базе Android?
- Способ 1. Полный контроль — при помощи VNC (RDP). На комп ставим VNC-сервер (TightVNC, RealVNC), на смарт VNC-клиент (Remote VNC w/Ad, VNC Viewer (платная)). Устанавливаем стабильное соединение с компом по WiFi, настраиваем сервер, клиент — и вуаля! Можно печатать текст, управлять мышкой, нажимать сочетания клавиш — почти полностью управлять ОС. Для управления по протоколу RDP тоже хватает клиентов.
Есть одно но — RealVNC использует проприетарный протокол, поэтому шифрованное соединение удастся установить только если на Android вы будете использовать платный VNC Viewer.
Способ 2. Контроль над отдельными приложениями. Это справедливо для некоторых плееров (Aimp UControl), для клиента uTorrent 3 (µTorrent Remote) и проч. Мощное решение по управлению торрентами — Transdroid — советует хабровчанин Wizard999 (поддержка µTorrent, Transmission, rTorrent, Vuze, Deluge и BitTorrent 6).
Способ 3. Использование смартфона в качестве мышки. Это позволяет делать RemoteDroid (Pro), на ПК потребуется запустить Remote Droid Server. Как намекает pilgr, существуют также приложения, позволяющие управлять активным приложением на ПК, эмулируя нажатие горячих клавиш/сочетаний: Unified Remote (Full), MultiRemote, gPad remote touchpad/keyboard; а также (пиарчик) его собственная разработка — piCat (пока alpha).
Способ 4 (предложено EveresT). Воспользоваться TeamViewer App for Android. Обеспечивает полный контроль. Бесплатно для некоммерческого использования, прекрасно работает через интернет (точнее, это её основное предназначение). На ПК понадобится поставить немобильную версию (Windows; Mac; Linux Red Hat, Fedora, Suse, Mandriva, Debian, Ubuntu 32-Bit, Debian, Ubuntu 64-Bit). Все настройки интуитивно понятны, продукт просто потрясающий!
Хабраюзеры Saenco и anagnost настояли, чтобы была упомянута альтернатива — LogMeIn. Правда
покабесплатного клиента для Android нету — только платные: ать, два. Сам не испытывал — говорят что удобно.Способ 5 (предложено naryl, SantaClaus16). На смартфоне воспользоваться SSH-клиентом (например, ConnectBot), на ПК развернуть SSH-сервер (Linux: OpenSSH; Windows: MobaSSH; Mac). Проверил связку ConnectBot+MobaSSH — работает! Метод для
линуксоидовлюбителей консоли. - Великолепный VNC/RDP-клиент — Wyse PocketCloud (Pro) — подсказал (опять же) хабраюзер Wizard999. На Windows или Mac ставится PocketCloud Companion — с его помощью можно через интернет пользоваться вашим любимым VNC или RDP-сервером, установленном на ПК. Для авторизации нужен Google-аккаунт (у кого его нет). Вводим гугль-логин и гугль-пароль на смартфоне и на ПК (понятно, что вводить понадобится только один раз). После авторизации с ПК на андроиде сразу отображается соединение, заходим и вводим наш VNC или RDP-пароль (или Windows-пароль, в зависимости от того, как вы настроили свой VNC или RDP-сервер). У меня получилась такая связка: Android — Wyse PocketCloud, Windows — PocketCloud Windows Companion и RealVNC (способ аутентификации — VNC Password). Выходит эдакая смесь способов 1 и 4 — очень хорошая идея.
Как управлять смартфоном при помощи ПК?
- Задача не слишком практична, но если требуется её решить — то на помощь приходит Remote Control Add-on. Потребуется рут. Программка поднимает VNC-сервер на устройстве. После достаточно открыть в браузере отображаемый URL (требуется java) или в любом VNC-клиенте (ip:5901, шифрования нет).
Если под управлением имеется ввиду просмотр/написание SMS, управление контактами и проч., то удобно будет воспользоваться возможностями Remote Web Desktop или подобной программой (напр., Remote Desktop).
Хабраюзер SabMakc предлагает использовать MyPhoneExplorer (only for Windows, поддержка смартов на Android включена с версии 1.8). Возможно подключение через bluetooth, USB-шнур и по WiFi, много плюшек.
Как использовать клавиатуру ПК для ввода текста на смартфоне?
- При установленном WiFi-соединении можно воспользоваться WiFi Keyboard или ezKeyboard (в первой вводимый текст сразу отображается в смартфоне, но не отображается в браузере, также предусмотрен игровой режим; во второй вводимый текст отправляется только после нажатия кнопочки). WiFi-клавиатура предусмотрена и в Remote Web Desktop (при этом можно как включать, так и отключать автосинхронизацию), но есть небольшая недоработка — галочка WiFi Keyboard в настройках смартфона снимается сама по себе (по неясным причинам), что не даёт использовать необходимый способ ввода (нужно опять лезть в настройки языка и клавиатуры, ставить галочку). Лично я отдаю предпочтение ezKeyboard, хотя пользуюсь редко (Swype, знаете ли, крутая штука).
Как использовать GPS-модуль смартфона на ПК (внешний GPS-приёмник)?
- Способ 1. Через bluetooth — воспользоваться GPS over BT. Инструкция для LG GT540 (линк предоставил diesel80).
- Способ 2. Через USB-шнур. Со стороны смартфона понадобится ShareGPS. Инструкция для LG GT540 (линк предоставил diesel80).
Как напрямую посылать ссылки из браузера ПК на смартфон?
- Воспользоваться приложением Chrome to Phone (предложил A1lfeG). На ПК для браузера понадобится установить расширение (Chrome, Firefox, Opera). К сожалению, в маркете для России приложение не доступно (или мне показалось?). Альтернатива — LinkPush. Расширения как таковые есть только для Chrome и для Firefox; остальные могут воспользоваться bookmarklet-ом (опционально можно включить нотификацию в Google Talk). Самому Chrome to Phone потрогать не удалось, но, по всей видимости, программа более функциональна, чем LinkPush.
Понятное дело, что не все вопросы и способы взаимодействия ПК и устройств на базе Android я рассмотрел. Если у вас есть иные предложения или замечания — приводите их в комментариях, постараюсь позже включить в статью.
UPD: с момента первоначальной публикации статья претерпела серьёзные изменения (в основном дополнения), как и некоторые взгляды её автора. Спасибо всем за советы!
Источник