ממשק API לבקשת רשת Wi-Fi לקישוריות עמית-לעמית

במכשירים עם Android 10 (API ברמה 29) ומעלה, אפשר להשתמש ב-API חדש של עמית לעמית כדי לאתחל את התצורה של מכשירים משניים כמו Chromecast וציוד של Google Home. התכונה הזו מאפשרת לאפליקציה להציג למשתמש בקשה לשנות את נקודת הגישה שהמכשיר מחובר אליה באמצעות WifiNetworkSpecifier כדי לתאר מאפיינים של רשת מבוקשת.

כדי להשתמש ב-API הזה:

  1. יוצרים מזהה רשת Wi-Fi באמצעות WifiNetworkSpecifier.Builder.

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

  3. צריך לבחור שילוב של SSID, SSID pattern, BSSID, ושל BSSID pattern כדי להגדיר את מסנן הרשת בכל בקשה, בהתאם לדרישות הבאות:

    • כל בקשה צריכה לכלול לפחות אחד מהפרמטרים הבאים: SSID, SSID pattern, BSSID או BSSID pattern
    • בכל בקשה אפשר להגדיר רק אחד מהערכים SSID או SSID pattern
    • בכל בקשה אפשר להגדיר רק אחד מהערכים BSSID או BSSID pattern
  4. מוסיפים את המזהים לבקשת הרשת יחד עם מופע של NetworkCallback כדי לעקוב אחרי סטטוס הבקשה.

    אם המשתמש מאשר את הבקשה והחיבור לרשת מצליח, הפונקציה NetworkCallback.onAvailable() מופעלת באובייקט של הקריאה החוזרת. אם המשתמש דוחה את הבקשה או אם החיבור לרשת לא מצליח, הפונקציה NetworkCallback.onUnavailable() מופעלת באובייקט הקריאה החוזרת.

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

דילוג על אישור המשתמש

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

קוד לדוגמה

בדוגמת הקוד הבאה אפשר לראות איך מתחברים לרשת פתוחה עם קידומת SSID של "test" ו-OUI של BSSID של "10:03:23":

Kotlin

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

Java

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);