Передача данных между устройствами

Рейтинг: 2Ответов: 1Опубликовано: 02.11.2014

Здравствуйте!

Столкнулся с такой задачей: есть два устройства - А и Б, они находятся в одной Wi-Fi сети. Из А в Б надо передать данные (например, base64 строка). Сначала А ищет поддерживаемые устройства в сети, затем перед получением устройство Б должно спросить пользователя, мол, принять данные или нет. Каждое устройство должно выступать в роли и передатчтка, и приёмника.

Вопрос: как можно это реализовать? С подобной задачей сталкиваюсь в первый раз. В гугле был, но ничего дельного найти не смог (наверное, плохо искал), везде этот NFC. Что-то слышал про сокеты, может быть, стоит копать в их сторону?

Update 0: WiFi Direct тоже не подойдёт, так как нужна поддержка 2.3+.
Update 1: В данный момент смог решить проблему поиска устройств. Обычный код выложу днём, а сейчас напишу псевдокод:
1. Получаем внутренний IP устройства (лично у меня это 192.168.1.12)
2. Отсекаем последнее число, теперь можно делаем диапазон IP: 192.168.1.1—192.168.1.255
3. В цикле подключаемся к каждому IP с помощью InetAddress, далее у объекта InetAddress вызываем isReachable(int timeout), если true, значит в сети есть девайс с таким именем. В моём случае программа пытается "спросить" у найденного клиента, есть ли на нём моя программа.
Update 2: Читаю документацию по сокетам, с каждым перечитыванием становится чуточку понятнее :) Обязательно отпишусь о прогрессе!

Ответы

▲ 2Принят

Разбиваем задачу на две части - поиск устройств и передача данных. С передачей данных вопросов не должно возникать - если айпи-порт известен, то подключиться и послать данные можно.

С первой частью также давно существует решение. Называется оно ZeroConf, оно же Avahi, оно же Bonjour (это все одно и то же, просто часть названий запатентирована, поэтому и такая гонка).

Для андроида (да и для java) есть готовая библиотека - jmdns. В айфонах/маках оно из коробки. Говорят, что в новых андроидах оно также из коробки.

Суть работы протокола. Он работает в два этапа. В первом случае каждый участник сети рассылает udp посылки с короткой информацией о себе, а потом по запросу от одного участника другой может выдать вторую порцию информации, где уже будет и ip.
Там можно вставлять свои пользовательские поля и передавать свою специфичную информацию.

Этот протокол очень широко используется, поэтому он достаточно хорошо протестирован. Примеры реального использования - AirDrop, поиск принтеров в сети.