ב-Android 12 נוספה תמיכה ב-Wi-Fi STA/STA בו-זמנית, שמאפשרת למכשירים להתחבר לשתי רשתות Wi-Fi בו-זמנית. התכונה האופציונלית הזו מאפשרת את הפונקציות הבאות.
- יצירה לפני ניתוק: המכשיר יוצר חיבור לרשת Wi-Fi חדשה לפני שהוא מפסיק את החיבור הקיים. כך אפשר לעבור בצורה חלקה יותר בין רשתות Wi-Fi.
- חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית: המכשיר מתחבר לרשת מקומית בלבד בלי לשבש את החיבור הראשי של המכשיר לאינטרנט.
- חיבור בו-זמנית לאינטרנט ולרשת מוגבלת: המכשיר מתחבר לרשת מוגבלת (זמינה רק לאפליקציות מסוימות עם הרשאות) בלי לשבש את החיבור הראשי של המכשיר לאינטרנט.
- (Android 13 ואילך) שימוש בו-זמנית בכמה רשתות עם חיבור לאינטרנט: המכשיר מחובר לשתי רשתות, שתיהן ללא הגבלות וזמינות לכל האפליקציות, ומספקות חיבור לאינטרנט.
בדף הזה מתוארת התנהגות המכשיר כשהתכונה הזו מופעלת, ופרטים על ההטמעה ליצרנים ולספקים של מכשירים.
הטמעה
כדי להטמיע בו-זמניות של STA/STA ב-Wi-Fi, המכשירים צריכים לתמוך באפשרויות הבאות:
שבב ה-Wi-Fi או הקושחה חייבים לתמוך בשני חיבורי STA בו-זמנית. הקושחה חייבת לתמוך בכל השילובים של הערוצים והתדרים בשני החיבורים. כדי למנוע בעיות בביצועים, מומלץ להשתמש בשבב Wi-Fi עם תמיכה ב-DBS 2x2+2x2.
המכשיר חייב לתמוך בממשקי ה-API הבאים בהטמעת AIDL או HIDL של
IWifiChip
.IWifiChip.setMultiStaPrimaryConnection(String ifName)
IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
לשילוב של ממשק ה-HAL ל-Wi-Fi צריכים להיות שני ממשקי STA בו-זמנית שנחשפים באמצעות פורמט מפרט כמו
[{STA} <= 2, ...]
. למידע נוסף, ראו ביצועים בו-זמניים בממשקים מרובים של Wi-Fi.
אם התנאים המוקדמים האלה מתקיימים, כדי להטמיע בו-זמניות של STA/STA ב-Wi-Fi, מבצעים את הפעולות הבאות:
להפעיל פונקציה אחת או יותר בנפרד באמצעות שכבות-על של משאבים בסביבת זמן ריצה (מושבתות כברירת מחדל).
- יצירה לפני הפסקה:
config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
- חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית:
config_wifiMultiStaLocalOnlyConcurrencyEnabled
- חיבור לאינטרנט וחיבורים מוגבלים בו-זמנית:
config_wifiMultiStaRestrictedConcurrencyEnabled
- שימוש בכמה רשתות בו-זמנית עם חיבור לאינטרנט:
config_wifiMultiStaMultiInternetConcurrencyEnabled
- יצירה לפני הפסקה:
מאמתים כל הטמעה כפי שמתואר בקטעים המתאימים.
כדי לתמוך טוב יותר בפעילות בו-זמנית של STA/STA ב-Wi-Fi, מומלץ להשתמש ב-method NetworkCallback#onCapabilitiesChanged()
במקום ב-WifiManager#getConnectionInfo()
במסגרות ובאפליקציות בהתאמה אישית של יצרני ציוד מקורי (OEM). השיטה WifiManager#getConnectionInfo()
מחזירה את הערך WifiInfo
רק לרשת אחת והיא הוצאה משימוש ב-Android 12. למידע נוסף, קראו את המאמר Wi-Fi Network Request API לקישוריות peer-to-peer.
Make-before-break
הפונקציה make-before-break מאפשרת למכשירים להתחבר לרשת Wi-Fi חדשה תוך שמירה על החיבור לרשת ה-Wi-Fi הקיימת, ומנתקת אותם מהרשת הישנה רק אחרי שהם מתחברים לרשת ה-Wi-Fi החדשה ויש להם גישה לאינטרנט.
התרחיש לדוגמה של יצירת חיבור לפני ניתוק פותר את הבעיות הבאות ב-Android 11 ואילך, שבהן המכשיר צריך להתנתק מרשת ה-Wi-Fi הקיימת לפני שמתחבר לרשת חדשה (ניתוק לפני חיבור).
כשמתחברים לרשת חדשה, יכול להיות שהמכשיר יזהה שהסיסמה של רשת ה-Wi-Fi שמורה בו שגויה, או שלרשת החדשה אין גישה לאינטרנט. הפעולה הזו מאלצת את המכשיר לחזור לרשת הישנה, וכתוצאה מכך יש פרק זמן משמעותי שבו אין חיבור ל-Wi-Fi.
הרשת הישנה מנותקת באופן פתאומי, כלומר כל החיבורים נסגרים. לרוב, האפליקציות לא מגיבות טוב לניתוק פתאומי של החיבור, ויכול להיות שהמשתמש יחווה כמה שניות ללא חיבור לאינטרנט עד שהחיבור החדש יתבצע באופן מלא.
רשת ברירת המחדל משתנה פעמיים, מרשת ה-Wi-Fi הישנה לרשת הסלולרית, ואז מרשת הסלולרית לרשת ה-Wi-Fi החדשה. כתוצאה מכך, האפליקציות מגיבות לשינויים ברשת פעמיים. בנוסף, המכשיר צריך להשתמש בנתונים סלולריים למשך זמן קצר.
התהליך 'יצירה לפני ניתוק' משמש רק למעברים אוטומטיים בין רשתות Wi-Fi שמבוצעים על ידי מערכת ההפעלה. במעברים בין רשתות שמבוצעים ביוזמת משתמשים נעשה שימוש בתהליך העבודה הקודם של ניתוק לפני חיבור, שבו הרשת הקודמת מנותקת לחלוטין לפני שהרשת החדשה מחוברת. במקרים מסוימים, התהליך break-before-make משמש גם במעברים אוטומטיים שמתחילים במערכת ההפעלה. לדוגמה, כשעוברים בין שתי רשתות שמוגדרות להשתמש באותו כתובת MAC של היצרן.
אפליקציות יכולות לבדוק אם התרחיש הזה נתמך במכשיר באמצעות API WifiManager#isMakeBeforeBreakWifiSwitchingSupported()
.
אימות של 'יצירה לפני שבר'
כדי לאמת את ההטמעה, מפעילים מעבר אוטומטי לרשת Wi-Fi (כך מוודאים שזמינה רשת עם עוצמת אות חזקה יותר מהרשת המקושרת) ומוודאים שהמכשיר שומר על החיבור הקיים בזמן שהוא מתחבר לרשת החדשה. כדי להציג את הסטטוס של שני ממשקי ה-Wi-Fi ולוודא ששניהם מחוברים, משתמשים בפקודה הבאה.
adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status
אם אין חיבור לרשת החדשה, המכשיר ינסה להתחבר אליה תוך שמירה על החיבור לרשת הקיימת, ויפסיק את הניסיון כשיחוש שאין אינטרנט ברשת החדשה. לאחר מכן, המכשיר ממשיך להשתמש בחיבור הקיים בתור רשת ה-Wi-Fi הראשית.
חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית
הפונקציה חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית מאפשרת למכשירים להתחבר לחיבור מקומי בלבד, כמו חיבור למכשיר IoT, בו-זמנית עם הרשת הראשית שמספקת את החיבור לאינטרנט. הפונקציה הזו משפרת את חוויית המשתמש כשמתחברים ישירות למכשירי IoT, כמו מצלמות. החיבור מתבצע באמצעות ממשק ה-API WifiNetworkSpecifier
שנוסף ב-Android 10.
ב-Android 11 ובגרסאות ישנות יותר, המכשירים מתנתקים מרשת ה-Wi-Fi הראשית כשהם מתחברים למכשיר IoT, וכתוצאה מכך החיבור לאינטרנט מתנתק (אלא אם יש במכשיר סוג אחר של תעבורת נתונים זמין, כמו חבילת גלישה).
אפליקציות יכולות לבדוק אם הפונקציה הזו נתמכת במכשיר באמצעות API WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported()
.
למידע נוסף על השינויים בפונקציה של חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית ב-Android 12, ראו Wi-Fi Network Request API for peer-to-peer connectivity.
אימות חיבור מקומי בלבד וחיבור לאינטרנט
כדי לאמת את הפונקציה הזו, צריך להשתמש בבדיקת CTS MultiStaConcurrencyWifiNetworkSpecifierTest
.
חיבור לאינטרנט וחיבורים מוגבלים בו-זמנית
הפונקציה חיבור בו-זמנית לאינטרנט ולרשת מוגבלת מאפשרת למכשיר להתחבר בו-זמנית לרשת Wi-Fi ראשית של המשתמש ולרשת Wi-Fi מוגבלת שזמינה רק לאפליקציות נבחרות.
אפליקציות יכולות לבדוק אם הפונקציה הזו נתמכת במכשיר באמצעות API WifiManager#isStaConcurrencyForRestrictedConnectionsSupported()
.
כדי לאפשר למכשיר להתחבר לרשתות Wi-Fi משניות מוגבלות:
מוסיפים הצעות לרשתות Wi-Fi עם הערך true למשתנה
setOemPaid
אוsetOemPrivate
.ב-
ConnectivityManager
, שולחיםNetworkRequest
עם היכולות המתאימות:NET_CAPABILITY_OEM_PAID
עבורsetOemPaid
NET_CAPABILITY_OEM_PRIVATE
עבורsetOemPrivate
כשהמכשיר מזהה תוצאות סריקה עם רשת שתואמת להצעה בתשלום או להצעה הפרטית של יצרן הציוד המקורי, הוא מתחבר אליה באופן אוטומטי כרשת משנית.
אימות של חיבור לאינטרנט וחיבורים מוגבלים בו-זמנית
כדי לאמת את הפונקציה הזו, צריך להשתמש בבדיקת CTS MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest
.
מספר רשתות בו-זמנית עם חיבור לאינטרנט
התכונה חיבור בו-זמנית לכמה רשתות עם חיבור לאינטרנט זמינה ב-Android מגרסה 13 ואילך. התכונה מאפשרת למכשיר להתחבר בו-זמנית לשתי רשתות (AP) ללא הגבלות (לכל האפליקציות יש גישה) שמספקות גישה לאינטרנט.
אפליקציות יכולות לבדוק אם התכונה הזו נתמכת במכשיר באמצעות השיטה WifiManager#isStaConcurrencyForMultiInternetSupported()
.
אם יש תמיכה בתכונה, אפליקציות עם הרשאות יכולות להפעיל אותה באמצעות השיטה WifiManager#setStaConcurrencyForMultiInternetMode(int mode)
. למאפיין יש את המצבים הבאים:
WifiManager#WIFI_MULTI_INTERNET_MODE_DBS_AP
: הגבלת חיבורים כפולים לתדרים הכפולים של נקודת קצה ל-DBS.WifiManager#WIFI_MULTI_INTERNET_MODE_MULTI_AP
: חיבור לנקודות AP שרירותיות שבהן החיבורים הנפרדים משתמשים בתדרים שונים.WifiManager#WIFI_MULTI_INTERNET_MODE_DISABLED
: השבתת התכונה.
כדי לשלוח שאילתה לגבי מצב התכונה הפעיל כרגע, משתמשים בשיטה WifiManager#getStaConcurrencyForMultiInternetMode()
.
כשהתכונה מופעלת, אפשר לבצע את השלבים הבאים כדי לבקש רשת Wi-Fi נוספת עם חיבור לאינטרנט.
יוצרים ספציפי רשת Wi-Fi באמצעות
WifiNetworkSpecifier.Builder
. בוחרים תדר לספציפי באמצעות השיטהsetBand()
. אין לציין את ה-SSID או את ה-BSSID, כי המערכת של Wi-Fi בוחרת את הרשת הנוספת לתחום הנדון.באמצעות
ConnectivityManager
, יוצריםNetworkRequest
עם היכולתNET_CAPABILITY_INTERNET
.מוסיפים את המפרט לבקשת הרשת יחד עם מכונה של
NetworkCallback
כדי לעקוב אחרי סטטוס הבקשה, ושולחים את הבקשה אלConnectivityManager
. אם תוצאת הסריקה כוללת רשת שמורה עם התדר המבוקש והחיבור לרשת הצליח, הקריאהNetworkCallback.onAvailable()
תופעל באובייקט ה-callback.
אימות של כמה רשתות בו-זמנית עם חיבור לאינטרנט
כדי לאמת את הפונקציה הזו, משתמשים בבדיקה הבאה של CTS:
- CTS:
MultiStaConcurrencyMultiInternetWifiNetworkTest
הנחיות לגבי צ'יפים של Wi-Fi של ספקים
ספקי צ'יפים של Wi-Fi יכולים להיעזר בהנחיות הבאות כדי לתמוך בו-זמניות של STA/STA ב-Wi-Fi.
צ'יפ ה-Wi-Fi חייב לתמוך בשני חיבורי STA בו-זמנית. כלומר, הוא תומך באפשרויות הבאות:
- לכל ממשק STA יש MAC ייחודי שניתן לתכנת באמצעות המסגרת.
- אפשר ליצור ולמחוק את ממשק ה-STA המשני באופן דינמי.
- כל STA יכול להיות מחובר ל-SSID שונה (באותה תדר או בתדר אחר).
- כל STA יכול להתחבר לאותו SSID (באותה תדר או בתדר אחר). אסור אף פעם לחבר את שני ה-STA לאותו BSSID.
תכונות קריטיות חייבות לפעול לפי ממשק, והן חייבות להיות זמינות בממשק הראשי. בהמשך מופיעה רשימה של המאפיינים החיוניים האלה:
חייבת להיות תמיכה בנדידה לפחות בממשק הראשי (הגדרה באמצעות
IWifiChip.setMultiStaPrimaryConnection()
). אם יש תמיכה בנדידה בשני הממשקים, ההחלטות בחיבור אחד לא יכולות להתנגש עם ההחלטות בחיבור השני בו-זמנית. לדוגמה, ממשק אחד לא יכול לנדוד אל ה-BSSID של החיבור השני.צריכה להיות תמיכה ב-APF (ובמשימות אופלוארד אחרות כמו ARP ו-NS) לפחות בממשק הראשי (הגדרה באמצעות
IWifiChip.setMultiStaPrimaryConnection()
).הנתונים הסטטיסטיים של שכבת הקישור חייבים לפעול על בסיס כל ממשק.
בהמשך מפורטות הטמעות מומלצות של צ'יפים של Wi-Fi בתרחישי בו-זמניות שונים:
צ'יפ ה-Wi-Fi חייב לאפשר למסגרת לבצע קריאה ל-
IWifiChip.setMultiStaUseCase()
עם אחת מהקבועות הבאות כדי לציין את הפונקציה הנוכחית:DUAL_STA_TRANSIENT_PREFER_PRIMARY
: מציין את הפונקציה Make-Before-Break. צריך לתת עדיפות לאיכות החיבור הראשי על פני החיבור המשני.DUAL_STA_NON_TRANSIENT_UNBIASED
: מציין את הפונקציה חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית או את הפונקציה חיבור מוגבל וחיבור לאינטרנט בו-זמנית. צריך לתת עדיפות שווה לאיכות של שתי החיבורים.
מכיוון ש-STA כפולים בו-זמנית יכולים להוביל למצבי פעולה של MCC, SCC ו-DBS, ההטמעה של הספק חייבת לבחור את תצורת הרדיו הטובה ביותר כשהמסגרת קוראת ל-
IWifiChip.setMultiStaUseCase()
כדי לציין את הפונקציה. אלה ההנחיות הכלליות:- אם יש אפשרות, עדיף להשתמש ב-DBS של 2x2+2x2.
- אם אפשר, כדאי להימנע משימוש ב-DBS מסוג 1x1+1x1 בגלל ההשפעה הרבה על איכות החיבור. במקום זאת, מומלץ להשתמש בחשבון ניהול.
- מחזור העבודה של ה-MCC חייב להיות ניתן להגדרה על ידי הנהג או הקושחה של הפונקציות השונות. המסגרת לא מגדירה את מחזור העבודה של חשבון הניהול ישירות, אלא שולחת שאילתה לגבי המידע הזה באמצעות
StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent
. אם אתם משתמשים ב-MCC, מומלץ להשתמש במחזור העבודה הבא בין החיבור הראשי לחיבור המשני:
DUAL_STA_TRANSIENT_PREFER_PRIMARY
: 70% ראשי, 30% משני.DUAL_STA_NON_TRANSIENT_UNBIASED
: 50% ראשי, 50% משני.