תארו לעצמכם שמשתמש מדליק מכשיר IoT חדש אך אינו יכול להגדיר אותו כי האפליקציה לא רואה אותו באנדרואיד 12. השגיאה נמצאת ב-WifiNetworkSpecifier — והתמיכה נמשכת שעה. מקרים כאלה הם המציאות היומיומית שלנו. Wi-Fi Provisioning הוא העברת פרטי רשת (SSID, סיסמה) מאפליקציה ניידת למכשיר IoT שעדיין לא יודע לאיזו רשת להתחבר. זה נשמע פשוט, אבל פיצול אנדרואיד, הבדלים בהתנהגות ConnectivityManager בין גרסאות, ומוזרויות ספציפיות של שבבים הופכים את זה ללא טריוויאלי. לדוגמה, באנדרואיד 10+ עליכם לקרוא במפורש ל-removeCapability(NET_CAPABILITY_INTERNET), אחרת המערכת דוחה חיבורים ל-SoftAP ללא אינטרנט. אנחנו פותרים זאת במפתח מלא, תוך הסתמכות על 5+ שנות פיתוח IoT ו-20+ פרויקטים שהושלמו. זה מפחית עלויות תמיכה ותקציבי ניפוי שגיאות בעד 40%. קבלו ייעוץ — נעריך את הפרויקט שלכם ונציע את הפתרון הטוב ביותר.
שיטות Wi-Fi Provisioning: השוואה
| שיטה | עיקרון | אמינות | מקרה שימוש מומלץ |
|---|---|---|---|
| SoftAP | המכשיר יוצר נקודה חמה Wi-Fi; הטלפון מתחבר ושולח פרטי כניסה דרך HTTP/UDP | גבוהה באנדרואיד 9, בינונית ב-10+ (דורש WifiNetworkSpecifier) |
אוניברסלי, כשאין BLE |
| SmartConfig / EZ Connect | הטלפון משדר פרטי כניסה מוצפנים UDP | נמוכה תחת בידוד AP; נכשל ב-5 GHz | התקנה ביתית פשוטה, לא ל-B2B |
| שילוב BLE + Wi-Fi | BLE מעביר פרטי כניסה; Wi-Fi מתחיל לאחר מכן | הגבוהה ביותר; אין צורך במעבר רשת | תמיד, כשהמכשיר כולל BLE |
| קוד QR עם פרטי כניסה | פרטי כניסה מוטמעים ב-QR בייצור | גבוהה | פריסה ארגונית, מכשיר יחיד |
SoftAP אמין פי 2–3 מ-SmartConfig אך נופל מ-BLE combo בחוויית משתמש. ב-95% מהסביבות הארגוניות, SmartConfig נכשל; SoftAP מצליח ב-99% מהמקרים.
איך לבחור את שיטת ה-Provisioning הנכונה?
הבחירה תלויה ב:
- זמינות BLE במכשיר (אם כן, לכו על BLE combo)
- קהל היעד (צרכני לעומת ארגוני)
- דרישות אבטחה (BLE מאפשר הצפנה ברמת חיבור)
למכשירי B2B, אנו תמיד ממליצים על BLE combo או SoftAP, כי SmartConfig חסום על ידי נתבים ארגוניים ב-95% מהמקרים. בכל תרחיש, אנו מתכננים גישה מרובת שיטות עם גיבוי.
SoftAP Provisioning באנדרואיד 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 сек таймаут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 сек таймаут הוא קריטי. בלעדיו, אנדרואיד 10 דוחה את הבקשה להתחבר לנקודה חמה ללא אינטרנט.
באנדרואיד 9 ומטה — removeCapability(NET_CAPABILITY_INTERNET) + WifiManager.enableNetwork(). ה-API מופחת אך עובד.
ESP-IDF SoftAP Provisioning: גישה רשמית
למכשירי Espressif — רכיב WifiManager.disconnect() בתוספת ה-SDK הרשמי esp_wifi_prov_mgr (תיעוד 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 מצפין את התעבורה דרך provisioning-android (החלפת מפתחות Curve25519). סריקת רשת דרך המכשיר היא תכונה חשובה: המכשיר סורק את סביבתו ומחזיר רשימה, מה שמפחית שגיאות קלט ב-30%.
מתי SmartConfig עובד ומתי לא?
Ti SmartConfig ו-Espressif ESP-TOUCH עובדים רק אם:
- הנתב לא הפעיל בידוד לקוחות AP
- הטלפון מחובר ל-2.4 GHz (לא 5 GHz)
- המכשיר נמצא בטווח אות חזק
ברשתות ארגוניות, בידוד AP מופעל ב-80% מהמקרים. SmartConfig פשוט לא עובד שם. זו בחירה גרועה למכשירי B2B.
טעויות משתמש נפוצות ואיך לתפוס אותן
משתמשים לעיתים קרובות מזינים את הסיסמה לרשת 5 GHz בעוד ESP32 תומך רק ב-2.4 GHz. בדקו מראש:
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 ГГц")באנדרואיד 10+: 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, _ -> // Показать список сетей пользователю } } } נגיש רק עם הרשאת sec1 — בקשו זאת במפורש.
בדיקת תדר חוסכת עד 40% מזמן התמיכה, כי המשתמש לא מבזבז 10 דקות בהזנת סיסמה שגויה.
השוואת פלטפורמות: אנדרואיד לעומת iOS
| תכונה | אנדרואיד | iOS |
|---|---|---|
| SoftAP | דורש 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 ГГц") (10+) או WifiInfo (9-). עובד בכל הגרסאות |
דורש NEHotspotConfiguration. עובד בכל הגרסאות |
| SmartConfig | עובד אך לא יציב באנדרואיד 12+ עקב הגבלות | לא נתמך (iOS מגביל שליחת שידורים) |
| BLE combo | תמיכה מלאה ב-Core Bluetooth | תמיכה מלאה ב-Core Bluetooth |
| קוד QR | יישום פשוט דרך מצלמה | יישום פשוט דרך AVFoundation |
מה כלול בעבודה שלנו?
- ניתוח דרישות ובחירת שיטת provisioning אופטימלית (SoftAP, SmartConfig, BLE combo)
- אינטגרציית SDK לפלטפורמות ספציפיות (אנדרואיד, iOS, Flutter)
- יישום UX: סריקת מכשירים, בחירת/הזנת רשת, טיפול בשגיאות
- בדיקות על 10+ דגמי נתבים וגרסאות מערכת הפעלה
- מסירת תיעוד וקוד מקור
- תמיכה לאחר השקה (במסגרת אחריות)
צרו קשר לייעוץ — ננתח את תצורת המכשיר שלכם ונבחר שיטות מומלצות. עם 5+ שנות ניסיון ו-20+ פרויקטים שהושלמו, נוכל לקצץ בעלויות התמיכה שלכם ב-40%. פנו אלינו להערכת פרויקט.







