पीयर-टू-पीयर कनेक्टिविटी के लिए वाई-फ़ाई नेटवर्क के अनुरोध का एपीआई

Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन वाले डिवाइसों पर, पीयर टू पीयर एपीआई का इस्तेमाल किया जा सकता है. इससे Chromecast और Google Home हार्डवेयर जैसे सेकंडरी डिवाइसों के लिए बूटस्ट्रैप कॉन्फ़िगरेशन किया जा सकता है. इस सुविधा की मदद से, आपका ऐप्लिकेशन उपयोगकर्ता को उस ऐक्सेस पॉइंट को बदलने के लिए सूचना दे सकता है जिससे डिवाइस कनेक्ट है. इसके लिए, WifiNetworkSpecifier का इस्तेमाल करके, अनुरोध किए गए नेटवर्क की प्रॉपर्टी के बारे में बताया जाता है.

इस एपीआई का इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. 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() को लागू किया जाता है.

किसी दूसरे डिवाइस से कनेक्ट करने का अनुरोध करने पर, उसी डिवाइस पर एक डायलॉग बॉक्स लॉन्च होता है. इस बॉक्स में, डिवाइस का उपयोगकर्ता कनेक्शन के अनुरोध को स्वीकार कर सकता है.

उपयोगकर्ता की मंज़ूरी के बिना

जब कोई उपयोगकर्ता, किसी ऐप्लिकेशन के अनुरोध पर किसी नेटवर्क से कनेक्ट करने की अनुमति देता है, तो डिवाइस उस अनुमति को सेव कर लेता है. अगर ऐप्लिकेशन, उस ऐक्सेस पॉइंट से फिर से कनेक्ट करने का अनुरोध करता है, तो डिवाइस उपयोगकर्ता की मंज़ूरी लेने की प्रोसेस को छोड़ देता है. साथ ही, नेटवर्क से अपने-आप कनेक्ट हो जाता है. अगर उपयोगकर्ता, एपीआई से अनुरोध किए गए नेटवर्क से कनेक्ट होने के दौरान नेटवर्क की जानकारी मिटाने का विकल्प चुनता है, तो ऐप्लिकेशन और नेटवर्क के उस कॉम्बिनेशन के लिए सेव की गई मंज़ूरी हटा दी जाती है. साथ ही, ऐप्लिकेशन से किए जाने वाले किसी भी अनुरोध को उपयोगकर्ता को फिर से मंज़ूरी देनी होगी. अगर ऐप्लिकेशन, एसएसआईडी या बीएसएसआईडी पैटर्न जैसे सामान्य अनुरोध करता है, तो उपयोगकर्ता को अनुरोध स्वीकार करना होगा.

कोड सैंपल

यहां दिए गए कोड के सैंपल में, "test" एसएसआईडी प्रीफ़िक्स और "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);