Разработка мобильного приложения для настройки IoT-устройств (Provisioning)
Provisioning — первое, с чем сталкивается пользователь при распаковке нового IoT-устройства. Если этот процесс занимает больше 2 минут или требует инструкции, конверсия в активных пользователей падает. Задача разработки — сделать из технического процесса (передача Wi-Fi credentials, регистрация на платформе, первичная конфигурация) линейный UX из 3–4 шагов.
Что такое IoT Provisioning технически
Устройство «из коробки» не знает Wi-Fi пароль и не привязано к аккаунту пользователя. Нужно передать ему три вещи:
- Сетевые credentials (SSID + password)
- Идентификатор владельца (user_id или token с платформы)
- Начальную конфигурацию (часовой пояс, имя устройства, endpoint сервера)
Технически это делается через:
- BLE (Bluetooth Low Energy) — устройство в режиме provisioning поднимает GATT-сервер, мобильное приложение пишет данные в характеристики
- Wi-Fi Soft AP — устройство поднимает собственную точку доступа, телефон подключается и передаёт данные через HTTP
- SoftAP + BLE комбо — BLE для discovery и начального обмена, Wi-Fi для передачи сертификатов
- QR-код — базовые credential зашиты в QR при производстве, телефон сканирует и дополняет данными аккаунта
Выбор метода зависит от железа устройства. Если ESP32 — поддерживает все варианты. nRF52 — только BLE. RTL8710 — только Wi-Fi.
ESP-IDF Provisioning: практика
Espressif предоставляет готовый esp_prov компонент на стороне прошивки и официальные SDK для мобильных приложений:
- Android:
com.espressif:provisioning-android - iOS:
ESPProvision(Swift Package Manager)
Флоу через BLE с Android SDK:
ESPProvisionManager.getInstance(context).searchBleEspDevices("PROV_") { devices, error ->
// devices — найденные устройства с префиксом PROV_
val device = devices?.firstOrNull() ?: return@searchBleEspDevices
device.connectBLEDevice(bleScanResult) { session ->
device.provision(ssid, passphrase) { status ->
when (status) {
ProvisioningStatus.SUCCESS -> onProvisioned()
ProvisioningStatus.FAILURE -> onFailed(status.error)
ProvisioningStatus.CONFIG_SENT -> updateProgress(50)
}
}
}
}
Под капотом SDK устанавливает зашифрованную сессию через Session Security (протокол sec1 — Curve25519 + AES-CTR), передаёт Wi-Fi credentials через protocomm layer. Протокол Protobuf — бинарный, компактный.
Типичная проблема: searchBleEspDevices не находит устройство, хотя оно включено. Причина чаще всего — устройство уже прошло provisioning и не рекламирует BLE-сервисы. Нужна кнопка «сброс к заводским настройкам» в инструкции.
Wi-Fi Provisioning через Soft AP
Устройство поднимает точку PROV_XXXXXX. Телефон должен подключиться к ней — это нетривиально на Android, потому что система может решить, что эта сеть «без интернета» и переключиться обратно на сотовые данные.
На Android 10+ явное подключение через WifiNetworkSpecifier:
val specifier = WifiNetworkSpecifier.Builder()
.setSsid("PROV_${deviceSuffix}")
.setWpa2Passphrase(apPassword)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(specifier)
.build()
connectivityManager.requestNetwork(request, object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
// Все HTTP-запросы к устройству нужно делать через этот network объект
val client = OkHttpClient.Builder()
.socketFactory(network.socketFactory)
.build()
sendProvisioningData(client)
}
})
Без явного network.socketFactory в OkHttp запросы уйдут через дефолтный интерфейс (сотовая сеть), а не через AP устройства — соединение не установится.
UX-сценарий и обработка ошибок
Плохой UX: бесконечный спиннер. Хороший: прогресс с конкретными шагами — «Поиск устройства», «Подключение», «Отправка сети», «Устройство подключается к Wi-Fi», «Регистрация». Каждый шаг — таймаут. Если устройство не подключилось к Wi-Fi за 30 секунд — предложить проверить пароль.
Самая частая ошибка пользователей: вводят пароль от 5 ГГц сети, а устройство поддерживает только 2.4 ГГц. Детектировать это заранее — через WifiManager.scanResults проверить, на какой частоте работает выбранная SSID. На Android 30+ для этого нужны ACCESS_FINE_LOCATION или NEARBY_WIFI_DEVICES разрешения.
Сроки
Provisioning через один канал (BLE или Soft AP) с использованием Espressif SDK: 2–4 недели. Кастомный протокол, мультивендорная поддержка, полный flow с регистрацией на платформе: 5–8 недель. Стоимость рассчитывается индивидуально.







