Интеграция Wi-Fi Direct — одна из самых частых задач, когда клиенты хотят передавать большие файлы без интернета. Но реализация на мобильных платформах превращается в минное поле: iOS не имеет публичного API, а Android хотя и поддерживает, таит множество нюансов. Имея опыт более 8 лет в разработке мобильных P2P-решений и реализовав более 20 проектов с Wi-Fi Direct, мы готовы поделиться подходом, который экономит до 40% бюджета на облачную инфраструктуру.
Почему Wi-Fi Direct сложно реализовать на iOS?
Apple не предоставляет разработчикам доступ к Wi-Fi Direct через публичные API. Единственный способ организовать прямое соединение на iOS — MultipeerConnectivity, который использует Wi-Fi и Bluetooth, но не является Wi-Fi Direct. Для кросс-платформенных проектов рассматривайте Nearby Connections API от Google — он работает на обеих платформах, но скорость ниже (до 50 Мбит/с против 250 Мбит/с у Wi-Fi Direct).
Как мы решаем проблемы стабильности соединения?
Главная боль — нестабильность на разных чипсетах. Qualcomm и MediaTek ведут себя по-разному: на одних устройствах соединение держится часами, на других — рвётся каждые пять минут. Мы применяем:
- автоматический reconnect с экспоненциальной задержкой (до 3 попыток);
- проверку состояния группы через
requestConnectionInfo()перед каждой передачей; - fallback на BLE для малых пакетов, если Wi-Fi Direct нестабилен.
Такой подход гарантирует надёжность на 95% протестированных устройств.
Android: пошаговая реализация Wi-Fi P2P
WifiP2pManager — основной класс. Работает через Broadcast Receiver с интентами WIFI_P2P_STATE_CHANGED_ACTION, WIFI_P2P_PEERS_CHANGED_ACTION, WIFI_P2P_CONNECTION_CHANGED_ACTION. Для глубокого понимания API обратитесь к WifiP2pManager.
Инициализация
val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager val channel = manager.initialize(this, mainLooper, null) Разрешения (Android 13+)
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 13+ --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" /> ACCESS_FINE_LOCATION нужен для поиска пиров на Android < 13. На Android 13+ — NEARBY_WIFI_DEVICES, но без usesPermissionFlags="neverForLocation" система всё равно требует геолокацию. Это вызывает вопросы у пользователей («зачем нашему файлменеджеру геолокация?»).
Поиск и подключение
manager.discoverPeers(channel, object : WifiP2pManager.ActionListener { override fun onSuccess() { /* сканирование началось */ } override fun onFailure(reason: Int) { // reason: ERROR=0, P2P_UNSUPPORTED=1, BUSY=2 } }) // В BroadcastReceiver при WIFI_P2P_PEERS_CHANGED_ACTION: manager.requestPeers(channel) { peers -> val deviceList = peers.deviceList // показываем список пользователю } // Подключение к выбранному устройству: val config = WifiP2pConfig().apply { deviceAddress = selectedDevice.deviceAddress wps.setup = WpsInfo.PBC } manager.connect(channel, config, object : WifiP2pManager.ActionListener { override fun onSuccess() { /* запрос отправлен, ждём WIFI_P2P_CONNECTION_CHANGED_ACTION */ } override fun onFailure(reason: Int) { } }) Передача данных
После установки соединения один из устройств становится Group Owner (GO). GO имеет фиксированный IP 192.168.49.1, клиент получает IP из DHCP.
// В WIFI_P2P_CONNECTION_CHANGED_ACTION: manager.requestConnectionInfo(channel) { info -> if (info.groupFormed) { val groupOwnerAddress = info.groupOwnerAddress.hostAddress if (info.isGroupOwner) { // запускаем ServerSocket startServer() } else { // подключаемся к groupOwnerAddress:PORT startClient(groupOwnerAddress) } } } После этого — обычные Socket / ServerSocket. Wi-Fi Direct не предоставляет высокоуровневый протокол передачи файлов, только TCP/UDP соединение.
Почему для Wi-Fi Direct на Android нужна геолокация?
До Android 13 поиск соседних устройств требовал разрешения ACCESS_FINE_LOCATION, так как Wi-Fi сканирование могло раскрыть местоположение. Начиная с Android 13 появилось NEARBY_WIFI_DEVICES, но если не указать флаг neverForLocation, система всё равно запросит геолокацию. Это обусловлено требованиями конфиденциальности, но часто сбивает с толку пользователей. Наше тестирование показывает, что на 80% устройств с Android 13 можно обойтись без геолокации, если в манифесте добавить maxSdkVersion="32" для ACCESS_FINE_LOCATION и использовать NEARBY_WIFI_DEVICES с флагом neverForLocation. Однако на некоторых прошивках (Xiaomi, Huawei) это не работает — приходится мириться с геоданными.
Что входит в интеграцию под ключ?
- анализируем требования и выбираем подход (Wi-Fi Direct, Nearby Connections или гибрид);
- проектируем архитектуру P2P-взаимодействия с учётом стабильности и энергопотребления;
- реализуем на Android (Kotlin) полный цикл: поиск, подключение, передача, разрыв;
- тестируем на 10+ реальных устройствах разных вендоров;
- документируем и обучаем команду заказчика;
- гарантируем работоспособность в течение 3 месяцев после сдачи.
Типичные ошибки при реализации
- Забывают обрабатывать onFailure в discoverPeers — устройство может быть занято.
- Не проверяют isGroupOwner перед стартом сервера — оба клиента могут начать слушать.
- Используют один порт — возможны коллизии. Рекомендуем динамический порт (0 в ServerSocket).
Сроки и стоимость
| Этап | Срок (рабочих дней) |
|---|---|
| Базовая реализация | 3–5 |
| Добавление reconnect и надёжности | 3–5 |
| Тестирование и доработки | 2–4 |
| Документация и передача | 1–2 |
Стоимость рассчитывается индивидуально — зависит от требуемой глубины кастомизации и объёма тестирования. Свяжитесь с нами — мы бесплатно проанализируем ваш проект и предложим оптимальное решение.
Сравнение технологий peer-to-peer
| Технология | iOS | Android | Дальность | Скорость |
|---|---|---|---|---|
| Wi-Fi Direct | ❌ | ✅ | ~200м | до 250 Мбит/с |
| MultipeerConnectivity | ✅ | ❌ | ~100м | до 100 Мбит/с |
| Nearby Connections API | ✅ | ✅ | ~100м | до 50 Мбит/с |
| BLE | ✅ | ✅ | ~50м | 1-3 Мбит/с |
Кросс-платформенные проекты часто выбирают Nearby Connections API как баланс между скоростью и совместимостью. Но если важна максимальная производительность и вы готовы пожертвовать iOS, Wi-Fi Direct — лучший выбор. Получите консультацию — наши инженеры помогут определиться с технологией.







