পিয়ার-টু-পিয়ার সংযোগের জন্য Wi-Fi নেটওয়ার্ক অনুরোধ API

অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) এবং এর চেয়ে উন্নত ডিভাইসগুলোতে, আপনি ক্রোমকাস্ট এবং গুগল হোম হার্ডওয়্যারের মতো সেকেন্ডারি ডিভাইসগুলোর কনফিগারেশন বুটস্ট্র্যাপ করতে একটি নতুন পিয়ার-টু-পিয়ার এপিআই ব্যবহার করতে পারেন। এই ফিচারটি আপনার অ্যাপকে, অনুরোধ করা নেটওয়ার্কের বৈশিষ্ট্যগুলো বর্ণনা করার জন্য 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() কল করা হয়।

কোনো পিয়ার ডিভাইসের সাথে সংযোগের অনুরোধ শুরু করলে সেই একই ডিভাইসে একটি ডায়ালগ বক্স চালু হয়, যেখান থেকে সেই ডিভাইসের ব্যবহারকারী সংযোগের অনুরোধটি গ্রহণ করতে পারেন।

ব্যবহারকারীর অনুমোদন এড়িয়ে যাওয়া

ব্যবহারকারী যখন কোনো নির্দিষ্ট অ্যাপের অনুরোধের জবাবে কোনো নেটওয়ার্কে সংযোগ করার অনুমোদন দেন, তখন ডিভাইসটি সেই নির্দিষ্ট অ্যাক্সেস পয়েন্টের জন্য অনুমোদনটি সংরক্ষণ করে। যদি অ্যাপটি আবার সেই অ্যাক্সেস পয়েন্টে সংযোগ করার জন্য একটি নির্দিষ্ট অনুরোধ করে, তবে ডিভাইসটি ব্যবহারকারীর অনুমোদনের ধাপটি এড়িয়ে যায় এবং স্বয়ংক্রিয়ভাবে নেটওয়ার্কে সংযুক্ত হয়ে যায়। যদি ব্যবহারকারী এপিআই (API) দ্বারা অনুরোধ করা কোনো নেটওয়ার্কে সংযুক্ত থাকা অবস্থায় নেটওয়ার্কটি 'ফরগেট' (forget) করার সিদ্ধান্ত নেন, তাহলে অ্যাপ এবং নেটওয়ার্কের সেই সংমিশ্রণের জন্য সংরক্ষিত এই অনুমোদনটি মুছে যায় এবং অ্যাপটির পক্ষ থেকে ভবিষ্যতের যেকোনো অনুরোধের জন্য ব্যবহারকারীকে আবার অনুমোদন দিতে হবে। যদি অ্যাপটি কোনো অনির্দিষ্ট অনুরোধ করে, যেমন এসএসআইডি (SSID) বা বিএসএসআইডি (BSSID) প্যাটার্ন ব্যবহার করে, তাহলে ব্যবহারকারীকে অবশ্যই অনুরোধটি অনুমোদন করতে হবে।

কোডের নমুনা

নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে "test" SSID প্রিফিক্স এবং "10:03:23" BSSID OUI সহ একটি ওপেন নেটওয়ার্কে সংযোগ করতে হয়:

কোটলিন

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)

জাভা

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);