Wi-Fi STA/STA בו-זמנית

ב-Android 12 יש תמיכה ב-Wi-Fi STA/STA בו-זמנית, שמאפשר למכשירים להתחבר לשתי רשתות Wi-Fi בו-זמנית. התכונה האופציונלית הזו מפעילה את הפונקציות הבאות.

  • לעשות לפני הפסקה: המכשיר מתחבר לרשת Wi-Fi חדשה לפני שהוא מתנתק בחיבור הקיים. כך מתקבלים מעברים חלקים יותר במעבר בין רשתות Wi-Fi
  • חיבור מקומי וחיבור לאינטרנט בו-זמנית: המכשיר מתחבר לרשת מקומית בלבד בלי לשבש את החיבור הראשי שמספק המכשיר לאינטרנט.
  • חיבור מוגבל לאינטרנט וחיבור בו-זמנית: המכשיר מתחבר לרשת מוגבלת (זמין רק לאפליקציות מסוימות בעלות הרשאות) בלי לשבש את החיבור הראשי של המכשיר, שמספק גישה לאינטרנט.
  • (Android 13 ואילך) מספר רשתות בו-זמנית עם חיבור לאינטרנט: המכשיר מתחבר לשתי רשתות ששתיהן זמינות לכל האפליקציות, ללא הגבלה, ומספקות קישוריות לאינטרנט.

בדף הזה מתוארים התנהגות המכשירים כשהתכונה הזו מופעלת ופרטי ההטמעה ליצרנים וספקים של מכשירים.

הטמעה

כדי להטמיע בו-זמניות (concurrency) 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 עם מספר ממשקים.

אם הדרישות המוקדמות האלה מתקיימות, מטמיעים את רשת ה-Wi-Fi STA/STA בו-זמנית:

  1. להפעיל פונקציה אחת או יותר בנפרד באמצעות שכבות-על של משאבים בזמן ריצה (מושבתת כברירת מחדל).

    • לעשות לפני ההפסקה: config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
    • חיבור מקומי וחיבור לאינטרנט בו-זמנית: config_wifiMultiStaLocalOnlyConcurrencyEnabled
    • חיבור מוגבל לאינטרנט וחיבור לאינטרנט בו-זמנית: config_wifiMultiStaRestrictedConcurrencyEnabled
    • מספר רשתות בו-זמנית עם חיבור לאינטרנט: config_wifiMultiStaMultiInternetConcurrencyEnabled
  2. לאמת כל הטמעה כפי שמתואר בקטעים המתאימים.

כדי לספק תמיכה טובה יותר ב-Wi-Fi STA/STA בו-זמניות, אנחנו ממליצים ש-frameworks ואפליקציות מותאמות אישית ל-OEM ישתמשו ב-method NetworkCallback#onCapabilitiesChanged() במקום בשיטה WifiManager#getConnectionInfo(), שמחזירה רק WifiInfo לרשת אחת והוצאה משימוש ב-Android 12. למידע נוסף ראו Wi-Fi Network Request API לקישוריות מקצה לקצה.

לעשות לפני ההפסקה

הפונקציה 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 לקישוריות מקצה לקצה (P2P).

אימות החיבור לאינטרנט וחיבור מקומי בלבד

כדי לאמת את הפונקציה הזו, צריך להשתמש בבדיקת MultiStaConcurrencyWifiNetworkSpecifierTest CTS.

חיבור לאינטרנט והגבלה בו-זמנית

הפונקציה חיבור מוגבל וחיבור לאינטרנט בו-זמנית מאפשרת למכשיר להתחבר בו-זמנית לרשת Wi-Fi ראשית של המשתמש ולרשת Wi-Fi מוגבלת שזמינה רק לאפליקציות נבחרות.

אפליקציות יכולות לבדוק אם הפונקציה הזו נתמכת במכשיר באמצעות ה-API של WifiManager#isStaConcurrencyForRestrictedConnectionsSupported().

כדי לאפשר למכשיר להתחבר לרשתות Wi-Fi מוגבלות משניות, מבצעים את השלבים הבאים:

  1. מוסיפים הצעות לרשתות Wi-Fi כשsetOemPaid או setOemPrivate מגדירים את הערך True.

  2. ב-ConnectivityManager, שולחים NetworkRequest עם היכולות המתאימות:

כשהמכשיר מזהה תוצאות סריקה עם רשת שתואמת להצעה הפרטית של ה-OEM (בתשלום) או להצעה הפרטית של ה-OEM, הוא מתחבר אליה באופן אוטומטי כרשת משנית.

אימות החיבור לאינטרנט והגבלה בו-זמנית

כדי לאמת את הפונקציה הזו, צריך להשתמש בבדיקת MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest CTS.

מספר רשתות עם חיבור לאינטרנט בו-זמנית

התכונה מספר רשתות בו-זמנית עם חיבור לאינטרנט זמינה ב-Android מגרסה 13 ואילך, ומאפשרת למכשיר להתחבר בו-זמנית לשתי רשתות (AP), שתיהן לא מוגבלות (לכל האפליקציות יש גישה) ומספקות גישה לאינטרנט.

אפליקציות יכולות לבדוק אם התכונה הזו נתמכת במכשיר באמצעות השיטה WifiManager#isStaConcurrencyForMultiInternetSupported().

אם התכונה נתמכת, אפליקציות שיש להן הרשאות יכולות להפעיל אותה באמצעות השיטה WifiManager#setStaConcurrencyForMultiInternetMode(int mode). לתכונה יש את המצבים הבאים:

כדי לשלוח שאילתה על מצב התכונה הפעילה כרגע, משתמשים ב-method WifiManager#getStaConcurrencyForMultiInternetMode().

כשהתכונה מופעלת, פועלים לפי השלבים הבאים כדי לבקש רשת Wi-Fi נוספת שמספקת אינטרנט.

  1. יצירת מציין של רשת Wi-Fi באמצעות WifiNetworkSpecifier.Builder. בוחרים תדר למציין באמצעות method setBand(). אל תציינו את ה-SSID או BSSID כי הרשת הנוספת של התדר שצוין נבחרת על ידי מסגרת ה-Wi-Fi.

  2. באמצעות ConnectivityManager, יוצרים NetworkRequest עם היכולת NET_CAPABILITY_INTERNET.

  3. מוסיפים את המציין לבקשת הרשת יחד עם מכונה של NetworkCallback כדי לעקוב אחרי סטטוס הבקשה, ושולחים את הבקשה ל-ConnectivityManager. אם רשת שמורה עם התדר המבוקש זמינה בתוצאת הסריקה והחיבור לרשת מתבצע בהצלחה, יופעל NetworkCallback.onAvailable() באובייקט הקריאה החוזרת.

אימות של כמה רשתות בו-זמנית עם חיבור לאינטרנט

כדי לאמת את הפונקציה הזו, צריך להשתמש בבדיקת CTS הבאה:

  • CTS: MultiStaConcurrencyMultiInternetWifiNetworkTest

הנחיות של ספק לגבי צ'יפים של Wi-Fi

הנחיות לספקים של שבבי Wi-Fi תומכים ב-Wi-Fi STA/STA בו-זמנית.

שבב ה-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 חייב לאפשר ל-framework לקרוא ל-IWifiChip.setMultiStaUseCase() עם אחד מהקבועים הבאים כדי לציין את הפונקציה הנוכחית:

    • DUAL_STA_TRANSIENT_PREFER_PRIMARY: מציין את הפונקציה Make-Before-Break. צריך לתת עדיפות לאיכות החיבור הראשי על פני החיבור המשני.
    • DUAL_STA_NON_TRANSIENT_UNBIASED: מציינת את החיבור המקומי וחיבור לאינטרנט בו-זמנית או את הפונקציה בו-זמנית וחיבור לאינטרנט. צריך לתת עדיפות זהה לאיכות של שני החיבורים.
  • STA בו-זמנית יכול להוביל למצבי פעולה של ניהול (MCC), SCC ו-DBS, ולכן בהטמעה של הספק צריך לבחור את הגדרת הרדיו הטובה ביותר כשה-framework שולח קריאה ל-IWifiChip.setMultiStaUseCase() כדי לציין את הפונקציה. אלה ההנחיות הכלליות:

    • אם קיים, עדיף להשתמש ברזולוציה 2x2+2x2 DBS.
    • אם אפשר, הימנעו משימוש ב-1x1+1x1 DBS בגלל ההשפעה המוגזמת על איכות החיבור. במקום זאת, עדיף להשתמש בחשבון ניהול (MCC).
    • אפשר להגדיר את מחזור החיוב של חשבון הניהול (MCC) באמצעות מנהל ההתקן או הקושחה, לפונקציות השונות. ה-framework לא מגדיר את מחזור התפקידים של חשבון הניהול (MCC) באופן ישיר, אבל שולח שאילתה על המידע הזה באמצעות StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent.
    • אם אתם משתמשים בחשבון ניהול (MCC), מומלץ לבצע את מחזורי התפקידים הבאים בין החיבור הראשי והמשני:

      • DUAL_STA_TRANSIENT_PREFER_PRIMARY: 70% יסודיים, 30% משני.
      • DUAL_STA_NON_TRANSIENT_UNBIASED: 50% ראשוני, 50% משני.