Інтеграція 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 |
Стоимость рассчитывается индивидуально — depends on required customization depth and testing volume. Зв'яжіться з нами — ми безкоштовно проаналізуємо ваш проєкт та запропонуємо оптимальне рішення.
Порівняння технологій 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 — найкращий вибір. Отримайте консультацію — наші інженери допоможуть визначитися з технологією.







