Интеграция 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 ведут себя по-разному). Reconnect при обрыве — обязателен.
Только одно 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 недели с надёжным переподключением и передачей файлов. Стоимость рассчитывается индивидуально.







