Android: Сетевые коммуникации с помощью Nearby (PlayServices API)
Совсем недавно Google предоставила мобильным разработчикам Android новую технологию сетевого обмена данными — Nearby. Мне она стала сразу интересна, так как позволяет устанавливать локальное соединение между Android устройствами без особых заморочек! Нет нужды заставлять пользователя вводить IP адрес и порт, он просто инициирует соединение, а клиенты к нему просто подключаются. На странице описывающей технологию указаны следующие варианты использования:
— многопользовательские игры на индивидуальных экранах – игроки играют в сетевые игры каждый со своего устройства, которые объединены в сеть (классика жанра);
— многопользовательские игры на общем экране – в данном случае в качестве сервера может выступать GoogleTV, на нём будет происходить основной игровой процесс, а все подключившиеся будут использовать свой телефон/планшет в качестве игрового контроллера (как на фото!);
— и конечно для любого обмена данными между различными Android устройствами.
Уже сейчас вы можете пропробовать эту технологию в игре Beach Buggy Racing:
После того как основной материал статьи был подготовлен, мне стало интересно на сколько хорошо система контролирует очерёдность доставляемых пакетов. Специально для этих целей я подготовил маленькое приложение для пересылки фотографий в виде текста. С одного устройства на другое пересылались десятки тысяч пакетов по 2048 символов каждый. Очерёдность не была нарушена, ни одного пакета не утеряно. За контроль очерёдности доставки пришлось заплатить временем доставки, оно увеличилось.
Рассмотрим принципы работы с Nearby.
Дабы не создавать велосипед я взял оригинальный пример и рассмотрел его с переводом всех комментариев.
Прежде всего удостоверьтесь что на вашем телефоне имеется последняя версия сервисов GooglePlay — https://play.google.com/store/apps/details?id=com.google.android.gms.
Теперь перейдём к основным моментам проекта:
В проект добавлена библиотека PlayServices (в файл «build.gradle»), именно она позволяет работать с Nearby:
Работу с Nearby можно разделить на следующие этапы:
1) Создание главного объекта доступа – GoogleApiClient. Запуск клиента. Остановка клиента
2) Запуск рекламации намерения стать точкой доступа
3) Запуск поиска точек для соединения
4) Присоединение к точке
5) Обработка заявок на присоединение
6) Контроль соединения
7) Принятие и обработка сообщений от оппонента
8) Отправка сообщения
Рассмотрим всё по порядку.
Создание главного объекта доступа – GoogleApiClient. Запуск клиента. Остановка клиента. Тут всё просто. В конструкторе активности создаём главный объект доступа к Nearby. При старте активности запускаем его, при остановке активности отключаемся от сети.
Следующий этап — Запуск рекламации намерения стать точкой доступа, метод startAdvertising:
Если пользователь будет беспрестанно «жмахать» по кнопке “Advertise”, он получит сообщение что мол всё работает нормально, расслабся 🙂 — STATUS_ALREADY_ADVERTISING
Третий этап — Запуск поиска точек для соединения:
Всё очень прозрачно и понятно. Просто запуск поиска точек доступа.
Теперь рассмотрим — Присоединение к точке обмена данными. Для этого сначала необходимо найти доступные точки доступа, а затем присоединяться к нужной. Метод onEndpointFound специально создан для того, чтобы сообщать о новой найденной точке:
В методе “connectTo” реализован диалог выбора точки к которой возможно подключиться. При выборе одного из варианта переходим к непосредственному подключению:
Если всё прошло успешно, то можно начинать обмен сообщениями.
Для обработки заявок на присоединение предназначен метод onConnectionRequest:
За контроль соединения отвечают ряд методов:
onDisconnected – обработка разрыва связи;
onConnected – обработка подключения;
onEndpointLost – обработка разрыва связи;
onConnectionSuspended – обработка прерывание соединения;
onConnectionFailed – обработка неудачного соединения.
Контроль за переподключением клиентов (например при разрыве связи при выходе пользователя из зоны действия WiFi) полностью ложится на разработчика.
Для обработки приходящих сообщений необходимо переписать метод onMessageReceived:
Отправка сообщений осуществляется с помощью двух методов:
1) Nearby.Connections.sendReliableMessage – отправка надёжных сообщений;
2) Nearby.Connections.sendUnreliableMessage – отправка ненадёжных сообщений.
При использовании первого метода, система сама контролирует правильность очерёдности доставляемых сообщений, во втором случае последовательность может нарушиться, так как контроля никакого нет. Зато второй метод быстрее, поэтому его лучше использовать когда требуется отправлять большое количество сообщений, например при отправке положения курсора на экране.
В ресурсах необходимо указать идентификатор сервиса по которому будет происходить поиск и подключения клиентов.
Для разрешения рекламации приложения в манифесте необходимо прописать следующее:
Если вы соберёте это приложение и запустите его на своих устройствах то сможете наблюдать следующее:
При первом взгляде может показаться что использование API Nearby сложно и громоздко, но это только на первый взгляд. В итоге разработчик получает готовый, надёжный, контролируемый инструмент для сетевого обмена данными. Лично мне это решение очень понравилось, не надо больше контролировать очередность прихода пакетов с данными, просить пользователей ввести ip адрес и номер сокета, производить дополнительные настройки… Красота!
Как включить функцию Nearby Sharing в Windows 10?
Microsoft добавила функцию Nearby Sharing в Windows 10, которая позволяет обмениваться файлами между устройствами, находящимися поблизости. Передача происходит по беспроводной сети Wi-Fi или Bluetooth, что облегчает обмен данными во время путешествий.

Требования к использованию функции Nearby Sharing
Чтобы воспользоваться функцией, требуется выполнения следующих условий:
- На устройствах должна быть установлена версия Windows 10 1803 и выше.
- Активировано свойство Bluetooth с низким энергопотреблением. Чтобы включить эту функцию, откройте Диспетчер устройств командой devmgmt.msc из окна Win + R. Разверните вкладку Bluetooth, щелкните правой кнопкой мыши на адаптере и выберите Свойства. На вкладке Сведения щелкните на выпадающий список «Свойств» и выберите «Bluetooth radio supports Low Energy Central Role». Убедитесь, что установлено значение «true». Это означает, что поддерживается Bluetooth с низким энергопотреблением.
Включение функции Nearby Sharing
Откройте диалоговое окно Win + R, введите команду ms-settings:crossdevice и нажмите на Enter.

Откроется окно Параметры – Система — Shared experiences. В правой части окна включите опцию Nearby Sharing.

Общий доступ к файлу через Проводник
Теперь узнаем, как поделится файлами, например, документами, изображениями и прочими.
Откройте Проводник Windows совместным нажатием на клавиши Win + E. Перейдите в папку с файлом, который хотите передать. Выберите пункт Поделиться в верхнем меню. Выберите файлы для отправки и нажмите на опцию Поделиться.
Во всплывающем окне выберите имя устройства, на которое хотите отправить файлы. На этом устройстве появится уведомление о получении файлов. Щелкните по нему, чтобы получить доступ к данным.
Общий доступ к изображению из приложения «Фотографии»
Откройте изображение, которое хотите передать в приложение «Фотографии».
Нажмите на кнопку Поделиться в правом верхнем углу окна. Затем выберите устройство, на которое хотите передать файл.

На устройстве, получающем изображение, появится уведомление. Щелкните на него, чтобы получить доступ к изображениям.
Общий доступ к странице из Microsoft Edge
Можно поделиться определенной страницей с устройствами Neary. В браузере перейдите на страницу для передачи ее на другое устройство. Нажмите на значок с тремя точками в правом верхнем углу браузера и выберите пункт Поделиться.

Во всплывающем окне укажите устройство, на которое хотите отправить страницу.
На принимающем устройстве при получении страницы отобразится уведомление. Нажмите на него, чтобы получить доступ к странице.
Программирование сокетов. Сеть и сокет
Web Sockets (веб-сокеты) — это технология, позволяющая создавать интерактивное соединение для обмена сообщения в онлайн-режиме. Соединение создаётся в сети между сервером и клиентом (браузером). В отличие от протокола HTTP, веб-сокеты позволяют работать с 2-направленным потоком данных, поэтому можно с уверенностью сказать, что технология является уникальной. Для наилучшего понимания давайте разберём особенности работы сокетов и посмотрим, а чем они конкретно отличаются от HTTP.
Как функционирует HTTP?
Про протокол HTTP (HTTPS) знает каждый, так как мы постоянно встречаемся с ним в своих браузерах. Как правило, браузер постоянно запрашивает у сервера, есть ли для него сообщения, а потом получает их. Здесь возможны различные типы запросов (POST, GET, PUT), причём каждый из них имеет своё назначение. Особенности работы хорошо видны на картинке:

А что сокеты?
Сокет для ответа не нуждается в ваших повторяющихся запросах. Сокет в сети работает таким образом, что достаточно лишь один раз выполнить запрос, а потом ждать отклика. И вы можете спокойно «слушать» сервер, который отправит сообщения по мере готовности.

Когда используют веб-сокет?
Сокет применяется в том случае, если вы, к примеру, разрабатываете: — чат- и IoT-приложения; — программы, работающие в режиме реального времени; — многопользовательские игры.
Когда нежелательно применять сокет?
Особых противопоказаний в отношении сокета и сокетов нет. Один из недостатков — несовместимость с некоторыми видами браузеров, но этот минус уже практически изжил себя, так как сегодня около 95 % браузеров поддерживают сокеты.
Тем не менее иногда сокет вам всё же не нужен, и зависит это от того, с каким типом приложения вы будете работать. Например, вы создаёте простую CMS и вам совершенно нет нужды обеспечивать функциональность в режиме реального времени.
Не стоит применять сокет и в REST API, так как будет вполне достаточно стандартных HTTP-запросов (GET, DELETE, POST и PUT). В целом специалисты не рекомендует использовать сокет, если это не риалтайм-приложение, но вопрос о недостатках сокетов требует более детального рассмотрения в рамках отдельной статьи.
От теории к практике
Давайте напишем сокет самостоятельно. Для создания клиента будем использовать язык программирования JavaScript, а для создания сервера — Node.js.
Собственно говоря, мы подобрали максимально простые примеры, которые в первую очередь нужны для того, чтобы разобраться в сути такой технологии, как сокет.
Cоздание клиента
Cоздание сервера
И что в итоге?
Что же, давайте продемонстрируем работу созданных нами сокетов:
Есть ли эквивалент сокету в HTTP?
В принципе, есть. Смотрите, HTTP должен проверять канал в сети на наличие новых сообщений. Следовательно, мы можем задействовать dirty check, то есть «грязную проверку». При этом подходе клиент с заданной периодичностью (например, каждые 100 мс) будет проверять, есть ли новые сообщения на сервере. Не вникая в XMLHttpRequest, можно применять библиотеку Axios. Это достаточно понятный и декларативный инструмент. Итак, наш клиент:
А теперь посмотрим, что делается на сервере:
Делаем выводы
Можно с уверенностью заявить, что сокет — довольно перспективная веб-технология, поэтому уже сейчас её использует множество разработчиков. Кроме того, сокеты прекрасно подходят для взаимодействия в реальном времени, включая онлайн-игры.