Уявіть: користувач вмикає новий IoT-пристрій, але не може його налаштувати, оскільки додаток не бачить пристрій на Android 12. Помилка в WifiNetworkSpecifier — і на підтримку йде година. Такі кейси — наша рутина. Wi-Fi Provisioning — передача мережевих credentials (SSID, пароль) від мобільного додатка до IoT-пристрою, який ще не знає, до якої мережі підключатися. Звучить просто, але Android-фрагментація, відмінності в поведінці ConnectivityManager між версіями та особливості конкретних чипів роблять це нетривіальним завданням. Наприклад, на Android 10+ необхідно явно вказувати removeCapability(NET_CAPABILITY_INTERNET), інакше система не дозволить підключення до SoftAP без інтернету. Ми вирішуємо це завдання під ключ, спираючись на 5+ років досвіду в IoT-розробці та 20+ реалізованих проєктів. Це знижує витрати на підтримку та зменшує бюджет на налагодження. Отримайте консультацію — ми оцінимо ваш проєкт і запропонуємо оптимальне рішення.
Методи Wi-Fi Provisioning: порівняння
| Метод | Принцип | Надійність | Краще застосовувати |
|---|---|---|---|
| Soft AP | Пристрій створює Wi-Fi точку, телефон підключається і передає дані через HTTP/UDP | Висока на Android 9, середня на 10+ (потрібен WifiNetworkSpecifier) |
Універсальний варіант, коли немає BLE |
| SmartConfig / EZ Connect | Телефон надсилає credentials зашифрованими UDP-пакетами широкомовно | Низька при AP-ізоляції, на 5 ГГц не працює | Просте налаштування вдома, не для B2B |
| BLE + Wi-Fi комбо | BLE передає credentials, Wi-Fi вмикається після | Найвища, не вимагає перемикання мережі | Завжди, коли пристрій має BLE |
| QR-код з credentials | Credentials зашиті в QR на виробництві | Висока | Enterprise-деплой, поодинокі пристрої |
Soft AP надійніший за SmartConfig у 2–3 рази, але поступається BLE-комбо за UX.
Як правильно вибрати метод Provisioning?
Вибір залежить від:
- Наявності BLE на пристрої (якщо є — робіть BLE-комбо)
- Цільової аудиторії (споживчий або корпоративний сегмент)
- Вимог до безпеки (при BLE можна використовувати шифрування на рівні з'єднання)
Для B2B-пристроїв ми завжди рекомендуємо BLE-комбо або SoftAP, оскільки SmartConfig блокується корпоративними роутерами в 95% випадків. У будь-якому випадку, ми проєктуємо мультиметодний підхід з fallback.
Soft AP Provisioning на Android 10+: деталі реалізації
Основна складність — явне прив'язування HTTP-запитів до потрібної мережі. Без цього OkHttp використовує дефолтний маршрут (мобільні дані):
val specifier = WifiNetworkSpecifier.Builder() .setSsid("MyDevice_AP") .setWpa2Passphrase("provisioning_key") .build() val request = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkSpecifier(specifier) .build() val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { val client = OkHttpClient.Builder() .socketFactory(network.socketFactory) .dns { hostname -> network.getAllByName(hostname).toList() } .build() postWifiCredentials(client, ssid, password) } override fun onUnavailable() { onProvisioningFailed("Не вдалося підключитися до пристрою") } } connectivityManager.requestNetwork(request, callback, 30_000) // 30 сек таймаут removeCapability(NET_CAPABILITY_INTERNET) — критично. Без цього Android 10 відхилить запит на підключення до AP без інтернету.
На Android 9 і нижче — WifiManager.enableNetwork() + WifiManager.disconnect(). API застаріле, але працює.
ESP-IDF SoftAP Provisioning: офіційний підхід
Для Espressif пристроїв — esp_wifi_prov_mgr компонент + офіційний provisioning-android SDK від Espressif (документація ESP-IDF):
val wifiProvisioningManager = ESPProvisionManager.getInstance(context) val device = wifiProvisioningManager.createESPDevice( ESPConstants.TransportType.TRANSPORT_SOFTAP, ESPConstants.SecurityType.SECURITY_1 ) device.connectWiFiDevice { isConnected -> if (isConnected) { device.scanNetworks { networks, _ -> // Показати список мереж користувачеві } } } SDK шифрує transport через sec1 (Curve25519 key exchange). Сканування мереж через пристрій — цінна фіча: пристрій сам сканує оточення і повертає список, знижуючи помилки введення.
Коли SmartConfig працює, а коли ні?
Ti SmartConfig та Espressif ESP-TOUCH працюють лише якщо:
- Роутер не ввімкнув AP-ізоляцію клієнтів
- Телефон підключений до 2.4 ГГц (не 5 ГГц)
- Пристрій знаходиться в зоні впевненого прийому
У корпоративних мережах AP-ізоляція ввімкнена в 80% випадків. SmartConfig тут не працює. М'яко кажучи, це поганий вибір для B2B-пристроїв.
Типові помилки користувачів та як їх перехопити
Користувачі часто вводять пароль від мережі 5 ГГц, а ESP32 підтримує лише 2.4 ГГц. Перевірити заздалегідь:
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager val currentNetwork = wifiManager.connectionInfo val is5Ghz = currentNetwork.frequency > 4000 // 5 ГГц > 4000 МГц if (is5Ghz) showWarning("Переконайтеся, що IoT-пристрій підтримує 5 ГГц, інакше використовуйте 2.4 ГГц") На Android 10+: WifiInfo доступний лише з дозволом ACCESS_FINE_LOCATION — запитуйте явно.
Перевірка частоти економить до 40% часу на підтримку, оскільки користувач не витрачає 10 хвилин на введення неправильного пароля.
Порівняння платформ: Android vs iOS
| Параметр | Android | iOS |
|---|---|---|
| SoftAP | Вимагає WifiNetworkSpecifier (10+) або enableNetwork (9-). Працює на всіх версіях |
Вимагає NEHotspotConfiguration. Працює на всіх версіях |
| SmartConfig | Працює, але нестабільно під Android 12+ через обмеження | Не підтримується (iOS обмежує широкомовну відправку) |
| BLE-комбо | Повна підтримка Core Bluetooth | Повна підтримка Core Bluetooth |
| QR-код | Проста реалізація через камеру | Проста реалізація через AVFoundation |
Що входить у роботу?
- Аналіз вимог та вибір оптимального методу Provisioning (SoftAP, SmartConfig, BLE-комбо)
- Інтеграція SDK для конкретної платформи (Android, iOS, Flutter)
- Реалізація UX: сканування пристроїв, введення/вибір мережі, обробка помилок
- Тестування на 10+ моделях роутерів та версіях ОС
- Документація та передача вихідного коду
- Підтримка після запуску (в рамках гарантії)
Замовте консультацію для аналізу вашого пристрою — ми розберемо конфігурацію та підберемо best practice. Зв'яжіться з нами для оцінки проєкту.







