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

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

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

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

הטמעה

כדי להטמיע את התכונה 'הפעלה בו-זמנית של Wi-Fi STA/STA', המכשירים צריכים לתמוך בתכונות הבאות:

  • הקושחה או שבב ה-Wi-Fi צריכים לתמוך בשני חיבורי STA בו-זמנית. הקושחה צריכה לתמוך בכל השילובים של ערוצים ופסים בשני החיבורים. כדי להימנע מבעיות בביצועים, מומלץ להשתמש בשבב Wi-Fi עם יכולת DBS‏ 2x2+2x2.

  • המכשיר חייב לתמוך בממשקי ה-API הבאים בהטמעה של AIDL או HIDL של IWifiChip.

    • IWifiChip.setMultiStaPrimaryConnection(String ifName)
    • IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
  • לשילוב של ממשק ה-Wi-Fi של HAL צריכים להיות שני ממשקי STA בו-זמניים שמוצגים באמצעות פורמט מפרט כמו [{STA} <= 2, ...]. מידע נוסף זמין במאמר בנושא ריבוי ממשקים בו-זמני ב-Wi-Fi.

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

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

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

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

Make-before-break

הפונקציה make-before-break מאפשרת למכשירים להתחבר לרשת Wi-Fi חדשה תוך שמירה על החיבור לרשת ה-Wi-Fi הקיימת. הניתוק מהרשת הישנה מתבצע רק אחרי שהחיבור לרשת ה-Wi-Fi החדשה מצליח ויש גישה לאינטרנט.

תרחיש השימוש make-before-break נועד לפתור את הבעיות הבאות ב-Android 11 ומגרסאות קודמות, שבהן המכשיר צריך להתנתק מרשת ה-Wi-Fi הקיימת לפני שהוא מתחבר לרשת חדשה (break-before-make).

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

  • הרשת הישנה מתנתקת באופן פתאומי, מה שאומר שכל השקעים נסגרים. לרוב, האפליקציות לא מגיבות טוב לאובדן פתאומי של הקישוריות, ולכן יכול להיות שהמשתמש לא יוכל להתחבר לאינטרנט למשך כמה שניות עד שהחיבור החדש יתבסס באופן מלא.

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

תהליך ה-make-before-break משמש רק למעברים אוטומטיים בין רשתות Wi-Fi שמופעלים על ידי מערכת ההפעלה. החלפת רשתות שמתבצעת על ידי המשתמש מתבצעת באמצעות תהליך מדור קודם של ניתוק מלא של הרשת הקודמת לפני החיבור לרשת החדשה. במקרים מסוימים, התהליך של ניתוק לפני יצירת חיבור משמש גם במעברים אוטומטיים שהמערכת מפעילה, למשל, כשעוברים בין שתי רשתות ששתיהן מוגדרות לשימוש בכתובת ה-MAC של היצרן.

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

אימות של שיטת make-before-break

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

adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status

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

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

הפונקציה חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית מאפשרת למכשירים להתחבר לחיבור מקומי בלבד, כמו חיבור למכשיר IoT, בו-זמנית עם הרשת הראשית שמספקת אינטרנט. הפונקציה הזו משפרת את חוויית המשתמש כשמתחברים ישירות למכשירי IoT, כמו מצלמות, וזה אפשרי באמצעות WifiNetworkSpecifier API שנוסף ב-Android 10.

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

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

מידע נוסף על השינויים בפונקציה של חיבור מקומי בלבד וחיבור לאינטרנט בו-זמנית ב-Android 12 זמין במאמר בנושא Wi-Fi Network Request API for peer-to-peer connectivity.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. יוצרים מזהה רשת Wi-Fi באמצעות WifiNetworkSpecifier.Builder. בוחרים את הטווח של המציין באמצעות השיטה 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 ייחודית שניתנת לתכנות על ידי המסגרת.
  • אפשר ליצור ולמחוק את ממשק ה-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: מציין את הפונקציה concurrent local-only and internet connection או את הפונקציה concurrent restricted and internet connection. צריך לתת עדיפות שווה לאיכות של שני החיבורים.
  • מכיוון ש-STA כפול בו-זמני יכול להוביל למצבי פעולה של MCC,‏ SCC ו-DBS, הטמעת הספק צריכה לבחור את תצורת הרדיו הטובה ביותר כשהמסגרת קוראת ל-IWifiChip.setMultiStaUseCase() כדי לציין את הפונקציה. אלה הנחיות כלליות:

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

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