ב-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), כי ה-method 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 שמבוצעים על ידי מערכת ההפעלה. מתגי רשת ביוזמת המשתמש משתמשים בתהליך 'הפסקה לפני ביצוע' מדור קודם, שבו הרשת הקודמת מנותקת לגמרי לפני שהרשת החדשה מחוברת. במקרים מסוימים, תהליך ההפסקה לפני ביצוע הפעולה משמש גם במתגים אוטומטיים שמופעלים על ידי מערכת ההפעלה, למשל, כשעוברים בין שתי רשתות שהוגדרו לשימוש בכתובת ה-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 על ידי הגדרת הערך של
setOemPaid
אוsetOemPrivate
כ-true.ב-
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 ייחודית שניתן לתכנות על ידי ה-framework.
- אפשר ליצור ולמחוק את ממשק ה-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, ולכן בהטמעה של הספק צריך לבחור את הגדרת הרדיו הטובה ביותר כשה-framework קורא ל-
IWifiChip.setMultiStaUseCase()
כדי לציין את הפונקציה. אלה ההנחיות הכלליות:- אם יש אפשרות, עדיף להשתמש ב-DBS של 2x2+2x2.
- אם אפשר, הימנעו משימוש ב-1x1+1x1 DBS בגלל ההשפעה המוגזמת על איכות החיבור. במקום זאת, מומלץ להשתמש בחשבון ניהול.
- מחזור העבודה של ה-MCC חייב להיות ניתן להגדרה על ידי הנהג או הקושחה של הפונקציות השונות. המסגרת לא מגדירה את מחזור העבודה של חשבון הניהול ישירות, אלא שולחת שאילתה לגבי המידע הזה באמצעות
StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent
. אם אתם משתמשים ב-MCC, מומלץ להשתמש במחזורי העבודה הבאים בין החיבור הראשי לחיבור המשני:
DUAL_STA_TRANSIENT_PREFER_PRIMARY
: 70% ראשי, 30% משני.DUAL_STA_NON_TRANSIENT_UNBIASED
: 50% ראשי, 50% משני.