Інтеграція Wi-Fi Direct у мобільне додаток
Wi-Fi Direct дозволяє двом пристроям з'єднуватися напряму без точки доступу. Це потужний інструмент для передачі великих файлів, спільної роботи або ігрових сесій — але один із найскладніших бездротових протоколів для реалізації на мобільних платформах. iOS не підтримує Wi-Fi Direct у публічному API взагалі. Android підтримує, але з застереженнями.
Android: Wi-Fi P2P API
WifiP2pManager — основний клас. Працює через Broadcast Receiver з інтентами WIFI_P2P_STATE_CHANGED_ACTION, WIFI_P2P_PEERS_CHANGED_ACTION, WIFI_P2P_CONNECTION_CHANGED_ACTION.
Ініціалізація
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 з'єднання нестабільні на деяких чипсетах (Qualcomm vs MediaTek ведуть себе по-різному). Реконект при розриві — обов'язковий.
Тільки одне P2P-з'єднання одночасно. Пристрій не може бути підключений до Wi-Fi AP і брати участь у Wi-Fi Direct групі одночасно на більшості пристроїв. На Android 10+ це частково змінилось з WifiP2pConfig.Builder.setNetworkName(), але не везде.
iOS. Нативного Wi-Fi Direct немає. Для кросс-платформенного peer-to-peer краще розглядати MultipeerConnectivity (iOS-тільки, через Wi-Fi/Bluetooth), або Nearby Connections API від Google (Android + iOS через єдиний SDK).
Альтернативи для кросс-платформи
| Технологія | iOS | Android | Дальність | Швидкість |
|---|---|---|---|---|
| Wi-Fi Direct | ❌ | ✅ | ~200м | до 250 Мбит/с |
| MultipeerConnectivity | ✅ | ❌ | ~100м | до 100 Мбит/с |
| Nearby Connections API | ✅ | ✅ | ~100м | до 50 Мбит/с |
| BLE | ✅ | ✅ | ~50м | 1-3 Мбит/с |
Терміни інтеграції Wi-Fi Direct (Android): 3-5 днів базової реалізації, 1-2 тижні з надійним переподключенням та передачею файлів. Вартість розраховується індивідуально.







