הקצאת BLE עבור מכשירי IoT באמצעות אפליקציה ניידת
מפתחים מחפשים לעיתים קרובות דרך אמינה להעביר אישורי Wi-Fi למכשיר ללא מסך. הקצאת Bluetooth Low Energy היא הפתרון. היא אינה דורשת מעבר לרשת הטלפון, אמינה פי 10 מ-SmartConfig (במיוחד בסביבות רועשות), ומהירה פי 3 מהגדרת Wi-Fi ידנית. בנוסף, היא אינה תלויה בהגדרות הנתב. אנו עוזרים לך לשלב מנגנון זה באפליקציה שלך—מאב-טיפוס ועד פרסום בחנות. לצוות שלנו ניסיון של למעלה מ-7 שנים ב-BLE ו-IoT, עם יותר מ-50 פרויקטי הקצאה שהושלמו. נבחן את הפרויקט שלך תוך יומיים. לפי Bluetooth SIG, BLE משיג כ-95% חיבורים מוצלחים עם יישום נכון.
למה הקצאת BLE היא הבחירה הטובה ביותר עבור IoT
BLE צורך פחות חשמל מ-Wi-Fi Direct ועובד על כל הסמארטפונים המודרניים. עבור שבבים כמו ESP32, nRF52 ו-Nordic, זו השיטה המועדפת. במצב הקצאה, המכשיר מפרסם שירות BLE, האפליקציה מתחברת כלקוח GATT וכותבת את התצורה. לאחר הצלחה, המכשיר מתחבר ל-Wi-Fi ומפסיק לפרסם. הקצאת BLE אמינה פי 10 מ-SmartConfig, במיוחד בסביבות רועשות. עלות היישום מתחילה בדרך כלל מ-$5,000 עבור אינטגרציית ESPProvision, וחיסכון בלוגיסטיקה יכול להגיע עד 30% בזכות הפחתת הגדרות ידניות. מפתחי BLE מוסמכים מבטיחים חיבור אמין מובטח.
ארכיטקטורת GATT להקצאה
המכשיר במצב הקצאה מפרסם שירות BLE. האפליקציה הניידת מתחברת כלקוח GATT וכותבת נתונים למאפייני השירות. סכמה סטנדרטית עבור ESP-IDF:
- Service UUID:
021a9004-0382-4aba-aa36-ec4d15d65e0e(Espressif Provisioning) - מאפיין תצורה: כתיבה (SSID, סיסמה, מצב אימות)
- מאפיין סטטוס: הודעה (תוצאה של חיבור המכשיר לרשת)
לאחר כתיבת האישורים, המכשיר מנסה להתחבר ל-Wi-Fi ומודיע לטלפון דרך מאפיין ההודעה על הצלחה או כישלון.
תהליך ההקצאה ניתן לחלוקה לשלבים:
- סריקה אחר מכשירי BLE עם שירות ההקצאה.
- חיבור ומשא ומתן על MTU (בקשה ל-512 בתים).
- קריאה/כתיבה של מאפיינים דרך תור GATT.
- שידור אישורים והמתנה לאישור.
- סגירת החיבור ומעבר לניהול המכשיר.
הקצאת BLE מבטיחה אמינות וצריכת חשמל נמוכה, בניגוד ל-SmartConfig (תלוי נתב) ו-Wi-Fi Direct (צריכת חשמל גבוהה).
Android BLE API: מה משתבש
BLE באנדרואיד הוא מקור לכאב. יצרנים שונים מיישמים את הערימה בצורה שונה. BluetoothGatt.writeCharacteristic() עשוי להחזיר true בקריאה, אבל onCharacteristicWrite מגיע עם סטטוס GATT_ERROR (133)—השגיאה הבלתי מוסברת הנפוצה ביותר.
התבנית הנכונה היא תור פקודות. BLE אינו תומך בפעולות GATT מקבילות:
class BleCommandQueue {
private val queue: LinkedList<() -> Unit> = LinkedList()
private var isExecuting = false
fun enqueue(command: () -> Unit) {
queue.add(command)
if (!isExecuting) executeNext()
}
fun onCommandComplete() {
isExecuting = false
executeNext()
}
private fun executeNext() {
if (queue.isEmpty()) return
isExecuting = true
queue.poll()?.invoke()
}
}כל class BleCommandQueue { private val queue: LinkedList<() -> Unit> = LinkedList() private var isExecuting = false fun enqueue(command: () -> Unit) { queue.add(command) if (!isExecuting) executeNext() } fun onCommandComplete() { isExecuting = false executeNext() } private fun executeNext() { if (queue.isEmpty()) return isExecuting = true queue.poll()?.invoke() } } , writeCharacteristic, readCharacteristic עובר דרך התור. setNotification callback → onCharacteristicWrite. ללא זה, במהלך פעולות מקבילות, ערימת ה-GATT נתקעת והחיבור נופל.
אילו שגיאות מתרחשות במהלך משא ומתן על MTU?
כברירת מחדל, MTU הוא 23 בתים (20 בתים של תוכן). אישורים עם SSID וסיסמה ארוכים עשויים שלא להתאים. מיד לאחר החיבור, בקש הרחבה:
override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
gatt.requestMtu(512) // до 517 байт
}
}
override fun onMtuChanged(gatt: BluetoothGatt, mtu: Int, status: Int) {
// Теперь можно писать данные размером mtu - 3 байта
startProvisioning()
} Espressif provisioning-android SDK
Espressif מספקת SDK מוכן שמסתיר את עבודת ה-GATT ברמה הנמוכה:
val device = ESPProvisionManager.getInstance(context)
.createESPDevice(
ESPConstants.TransportType.TRANSPORT_BLE,
ESPConstants.SecurityType.SECURITY_1
)
device.connectBLEDevice(scanResult) { connected ->
if (!connected) return@connectBLEDevice
device.scanNetworks { networks, error ->
// networks — список Wi-Fi сетей, которые видит устройство
}
}
// После выбора сети пользователем
device.provision(selectedSsid, password) { status ->
when (status) {
ProvisioningStatus.SUCCESS -> navigateToSuccess()
ProvisioningStatus.FAILURE -> showError(status.toString())
}
}ה-SDK מיישם הצפנת ערוץ דרך SRP6a (Security 2) או Curve25519+AES (Security 1). אישורים לעולם אינם משודרים בטקסט פשוט.
iOS: CoreBluetooth + ESPProv
ב-iOS, השתמש ב-queue.onCommandComplete() Swift Package של Espressif או ב-override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { if (newState == BluetoothProfile.STATE_CONNECTED) { gatt.requestMtu(512) // до 517 байт } } override fun onMtuChanged(gatt: BluetoothGatt, mtu: Int, status: Int) { // Теперь можно писать данные размером mtu - 3 байта startProvisioning() } המקורי עבור פרוטוקולים מותאמים אישית.
import ESPProvision
ESPProvisionManager.shared.searchESPDevices(devicePrefix: "PROV_", transport: .ble, security: .secure) { devices, error in
guard let device = devices?.first else { return }
device.connect(delegate: self) { status in
if case .connected = status {
device.provision(ssid: selectedSSID, passPhrase: password) { status in
// handle result
}
}
}
}ב-iOS, אין פיצול של ערימת GATT—val device = ESPProvisionManager.getInstance(context) .createESPDevice( ESPConstants.TransportType.TRANSPORT_BLE, ESPConstants.SecurityType.SECURITY_1 ) device.connectBLEDevice(scanResult) { connected -> if (!connected) return@connectBLEDevice device.scanNetworks { networks, error -> // networks — список Wi-Fi сетей, которые видит устройство } } // После выбора сети пользователем device.provision(selectedSsid, password) { status -> when (status) { ProvisioningStatus.SUCCESS -> navigateToSuccess() ProvisioningStatus.FAILURE -> showError(status.toString()) } } עובד באופן עקבי בכל המכשירים. עם זאת, יש מגבלה: סריקת BLE ברקע עובדת רק עבור מכשירים עם Service UUIDs ידועים, הרשומים מראש ב-ESPProvision.
איך להימנע משגיאות הקצאה טיפוסיות?
- אין משוב על התקדמות. המכשיר לוקח 5–15 שניות להתחבר ל-Wi-Fi. ללא מחוון התקדמות, משתמשים חושבים שהאפליקציה קפאה ולוחצים על חזור.
- לא מטפלים בשגיאות סיסמה שגויה. המכשיר מחזיר סטטוס AUTH_ERROR דרך מאפיין ההודעה. הצג "סיסמת Wi-Fi שגויה"—לא "שגיאת חיבור".
- לא יוצאים ממצב הקצאה לאחר הצלחה. לאחר חיבור ל-Wi-Fi, המכשיר מפסיק לפרסם שירותי BLE—זה נורמלי. האפליקציה צריכה לסגור את חיבור ה-BLE ולעבור לשלב הבא.
מה כלול בעבודה
- ניתוח בחירת שבב ופרוטוקול (Espressif, Nordic, GATT מותאם אישית)
- עיצוב שירות GATT וסכמת נתונים
- יישום SDK נייד (iOS/Android) עם תור פקודות ומשא ומתן על MTU
- אינטגרציה עם ESPProvision או פיתוח פרוטוקול מותאם אישית
- טיפול בשגיאות, הצגת התקדמות, זרימת UX להקצאה
- פרסום ל-App Store ו-Google Play (TestFlight, Firebase Distribution)
- תיעוד והדרכת צוות
אם אתה משתמש בשבב שאינו Espressif כמו Nordic nRF52 או בפרוטוקול מותאם אישית, ה-SDK המוכן לא יעבוד. נפתח שירותים ומאפיינים מותאמים אישית, ניישם הצפנה (AES-128, Curve25519), ונטפל בשגיאות חיבור. זה לוקח 4–6 שבועות.
| סוג פתרון | לוח זמנים | עלות טיפוסית (USD) |
|---|---|---|
| ESPProvision SDK (iOS + Android) | 2–3 שבועות | $5,000 – $7,500 |
| פרוטוקול GATT מותאם אישית עם הצפנה | 4–6 שבועות | $12,000 – $18,000 |
אנחנו צוות פיתוח נייד עם ניסיון של 7+ שנים ו-50+ פרויקטי הקצאה שהושלמו. מפתחי ה-BLE המוסמכים שלנו מבטיחים חיבור אמין ומאובטח. צור קשר כדי לדון בפרויקט שלך ולקבל ייעוץ ארכיטקטוני להקצאת BLE.
מקורות: Bluetooth Low Energy בויקיפדיה







