ইন্টারনেট সংযোগের জন্য Wi-Fi সাজেশন API

অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) এবং এর চেয়ে উন্নত সংস্করণে চালিত ডিভাইসগুলো আপনার অ্যাপকে একটি ওয়াই-ফাই অ্যাক্সেস পয়েন্টে স্বয়ংক্রিয়ভাবে সংযোগ করার জন্য নেটওয়ার্ক ক্রেডেনশিয়াল যোগ করার সুযোগ দেয়। আপনি WifiNetworkSuggestion ব্যবহার করে কোন নেটওয়ার্কে সংযোগ করবেন তার জন্য পরামর্শ দিতে পারেন। প্ল্যাটফর্মটি শেষ পর্যন্ত আপনার এবং অন্যান্য অ্যাপের দেওয়া তথ্যের উপর ভিত্তি করে কোন অ্যাক্সেস পয়েন্টটি গ্রহণ করবে তা বেছে নেয়।

অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) এবং তার পরবর্তী সংস্করণগুলোতে:

  • সাজেশন এপিআই (suggestion API) দ্বারা একটি PasspointConfiguration প্রোভিশনিং করা সমর্থিত। অ্যান্ড্রয়েড ১১-এর আগে, একটি PasspointConfiguration প্রোভিশনিং করার জন্য addOrUpdatePasspointConfiguration() এপিআই ব্যবহার করতে হতো।
  • এই ফ্রেমওয়ার্কটি TLS-ভিত্তিক এন্টারপ্রাইজ প্রস্তাবনাগুলোর (EAP-TLS, EAP-TTLS, এবং EAP-PEAP) উপর নিরাপত্তা সংক্রান্ত আবশ্যকতা আরোপ করে; এই ধরনের নেটওয়ার্কের প্রস্তাবনাগুলোতে অবশ্যই একটি Root CA certificate এবং একটি server domain name নির্ধারণ করতে হবে।
  • এই ফ্রেমওয়ার্কটি EAP-SIM ভিত্তিক এন্টারপ্রাইজ সাজেশনের (EAP-SIM, EAP-AKA, EAP-AKA-PRIME) জন্য মালিকানার আবশ্যকতা আরোপ করে; এই ধরনের সাজেশন শুধুমাত্র ক্যারিয়ার-স্বাক্ষরিত অ্যাপগুলোই অনুমোদন করতে পারে।
  • কোনো ক্যারিয়ার-স্বাক্ষরিত অ্যাপ দ্বারা প্রদত্ত সাজেশনের জন্য, ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে অ্যাপটির ক্যারিয়ার সাইনিং অনুসারে সেগুলোকে একটি ক্যারিয়ার আইডি বরাদ্দ করে। ডিভাইস থেকে সংশ্লিষ্ট সিমটি সরিয়ে ফেলা হলে এই ধরনের সাজেশনগুলো স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় হয়ে যায়।

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং তার পরবর্তী সংস্করণগুলোতে:

  • নন-পার্সিস্টেন্ট ম্যাক র‍্যান্ডমাইজেশনের মাধ্যমে অতিরিক্ত গোপনীয়তা সক্রিয় করা যেতে পারে, যা পর্যায়ক্রমে র‍্যান্ডমাইজড ম্যাক অ্যাড্রেসটিকে পুনরায় র‍্যান্ডমাইজ করে। আপনার নেটওয়ার্কের জন্য র‍্যান্ডমাইজেশনের মাত্রা নির্দিষ্ট করতে setMacRandomizationSetting ব্যবহার করুন।

  • isPasspointTermsAndConditionsSupported() : শর্তাবলী হলো পাসপয়েন্টের একটি ফিচার, যা নেটওয়ার্ক ডেপ্লয়মেন্টকে অনিরাপদ ক্যাপটিভ পোর্টাল (যা ওপেন নেটওয়ার্ক ব্যবহার করে) একটি নিরাপদ পাসপয়েন্ট নেটওয়ার্ক দিয়ে প্রতিস্থাপন করার সুযোগ দেয়। যখন শর্তাবলী গ্রহণ করার প্রয়োজন হয়, তখন ব্যবহারকারীকে একটি নোটিফিকেশন দেখানো হয়। যে অ্যাপগুলো শর্তাবলী দ্বারা নিয়ন্ত্রিত পাসপয়েন্ট নেটওয়ার্কের পরামর্শ দেয়, তাদের অবশ্যই প্রথমে এই API-টি কল করে নিশ্চিত করতে হবে যে ডিভাইসটি এই সক্ষমতা সমর্থন করে কিনা। যদি ডিভাইসটি এই সক্ষমতা সমর্থন না করে, তবে এটি এই নেটওয়ার্কে সংযোগ করতে পারবে না এবং একটি বিকল্প বা লিগ্যাসি নেটওয়ার্কের পরামর্শ দিতে হবে।

  • isDecoratedIdentitySupported() : প্রিফিক্স ডেকোরেশন সহ নেটওয়ার্কগুলিতে প্রমাণীকরণের সময়, ডেকোরেটেড আইডেন্টিটি প্রিফিক্স নেটওয়ার্ক অপারেটরদের একটি AAA নেটওয়ার্কের অভ্যন্তরে একাধিক প্রক্সির মাধ্যমে সুস্পষ্ট রাউটিং সম্পাদন করার জন্য নেটওয়ার্ক অ্যাক্সেস আইডেন্টিফায়ার (NAI) আপডেট করার অনুমতি দেয় (এই বিষয়ে আরও জানতে RFC 7542 দেখুন)।

    অ্যান্ড্রয়েড ১২, PPS-MO এক্সটেনশনের জন্য WBA স্পেসিফিকেশনের সাথে সামঞ্জস্য রাখতে এই ফিচারটি প্রয়োগ করেছে। যেসব অ্যাপ এমন পাসপয়েন্ট নেটওয়ার্কের পরামর্শ দেয় যার জন্য ডেকোরেটেড আইডেন্টিটি প্রয়োজন, তাদের অবশ্যই প্রথমে এই API-টি কল করে নিশ্চিত করতে হবে যে ডিভাইসটি এই সক্ষমতা সমর্থন করে কি না। যদি ডিভাইসটি এই সক্ষমতা সমর্থন না করে, তবে আইডেন্টিটি ডেকোরেটেড হবে না এবং নেটওয়ার্কে অথেনটিকেশন ব্যর্থ হতে পারে।

একটি পাসপয়েন্ট সাজেশন তৈরি করতে, অ্যাপগুলিকে অবশ্যই PasspointConfiguration , Credential এবং HomeSp ক্লাসগুলি ব্যবহার করতে হবে। এই ক্লাসগুলি পাসপয়েন্ট প্রোফাইলের বর্ণনা দেয়, যা ওয়াই-ফাই অ্যালায়েন্স পাসপয়েন্ট স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে।

নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে একটি ওপেন, একটি WPA2, একটি WPA3 নেটওয়ার্ক এবং একটি পাসপয়েন্ট নেটওয়ার্কের জন্য ক্রেডেনশিয়াল প্রদান করতে হয়:

কোটলিন

val suggestion1 = WifiNetworkSuggestion.Builder()
        .setSsid("test111111")
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestion2 = WifiNetworkSuggestion.Builder()
        .setSsid("test222222")
        .setWpa2Passphrase("test123456")
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestion3 = WifiNetworkSuggestion.Builder()
        .setSsid("test333333")
        .setWpa3Passphrase("test6789")
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration
val suggestion4 = WifiNetworkSuggestion.Builder()
        .setPasspointConfig(passpointConfig)
        .setIsAppInteractionRequired(true) // Optional (Needs location permission)
        .build();

val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4);

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager;

val status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
    // do error handling here
}

// Optional (Wait for post connection broadcast to one of your suggestions)
val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

val broadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
            return;
        }
        // do post connect processing here
    }
};
context.registerReceiver(broadcastReceiver, intentFilter);

জাভা

final WifiNetworkSuggestion suggestion1 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test111111")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final WifiNetworkSuggestion suggestion2 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test222222")
  .setWpa2Passphrase("test123456")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final WifiNetworkSuggestion suggestion3 =
  new WifiNetworkSuggestion.Builder()
  .setSsid("test333333")
  .setWpa3Passphrase("test6789")
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final PasspointConfiguration passpointConfig = new PasspointConfiguration();
// configure passpointConfig to include a valid Passpoint configuration

final WifiNetworkSuggestion suggestion4 =
  new WifiNetworkSuggestion.Builder()
  .setPasspointConfig(passpointConfig)
  .setIsAppInteractionRequired(true) // Optional (Needs location permission)
  .build();

final List<WifiNetworkSuggestion> suggestionsList =
  new ArrayList<WifiNetworkSuggestion> {{
    add(suggestion1);
    add(suggestion2);
    add(suggestion3);
    add(suggestion4);
  }};

final WifiManager wifiManager =
  (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// do error handling here…
}

// Optional (Wait for post connection broadcast to one of your suggestions)
final IntentFilter intentFilter =
  new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (!intent.getAction().equals(
      WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
      return;
    }
    // do post connect processing here...
  }
};
context.registerReceiver(broadcastReceiver, intentFilter);

অ্যাপটি প্রথমবার কোনো সাজেশন দেওয়ার সাথে সাথেই ব্যবহারকারীকে জানানো হয়। নোটিফিকেশনের ধরনটি ডিভাইসে চলমান অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে:

  • অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) এবং এর পরবর্তী সংস্করণগুলোতে, অ্যাপটি ফোরগ্রাউন্ডে চললে ব্যবহারকারী একটি ডায়ালগ দেখতে পান এবং ব্যাকগ্রাউন্ডে চললে একটি নোটিফিকেশন দেখতে পান।
  • অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯)-এ, অ্যাপটি ফোরগ্রাউন্ডে বা ব্যাকগ্রাউন্ডে যেখানেই চলুক না কেন, ব্যবহারকারী একটি নোটিফিকেশন দেখতে পান।

যখন প্ল্যাটফর্মটি নেটওয়ার্কের জন্য দেওয়া কোনো একটি পরামর্শের সাথে সংযুক্ত হয়, তখন সেটিংসে এমন একটি লেখা প্রদর্শিত হয় যা নেটওয়ার্ক সংযোগটিকে সংশ্লিষ্ট পরামর্শকারী অ্যাপের সাথে যুক্ত করে।

ব্যবহারকারীর সংযোগ বিচ্ছিন্ন হওয়া পরিচালনা করা

যদি ব্যবহারকারী ওয়াই-ফাই পিকার ব্যবহার করে কোনো একটি প্রস্তাবিত নেটওয়ার্কে সংযুক্ত থাকা অবস্থায় সেটিকে স্পষ্টভাবে সংযোগ বিচ্ছিন্ন করেন, তাহলে সেই নেটওয়ার্কটি সীমার মধ্যে থাকা অবস্থায় উপেক্ষা করা হবে। এই সময়কালে, অ্যাপটি সেই নেটওয়ার্কের জন্য প্রস্তাবিত নেটওয়ার্কটি সরিয়ে আবার যোগ করলেও, সেটিকে স্বয়ংক্রিয় সংযোগের জন্য বিবেচনা করা হবে না। যদি ব্যবহারকারী ওয়াই-ফাই পিকার ব্যবহার করে পূর্বে সংযোগ বিচ্ছিন্ন হওয়া কোনো নেটওয়ার্কে স্পষ্টভাবে সংযুক্ত হন, তাহলে সেই নেটওয়ার্কটিকে অবিলম্বে স্বয়ংক্রিয় সংযোগের জন্য বিবেচনা করা হবে।

অ্যাপের অনুমোদনের স্থিতি পরিবর্তন করা

ব্যবহারকারী নেটওয়ার্ক সাজেশনের নোটিফিকেশন প্রত্যাখ্যান করলে অ্যাপটি থেকে CHANGE_WIFI_STATE পারমিশনটি মুছে যায়। ব্যবহারকারী পরবর্তীতে ওয়াই-ফাই কন্ট্রোল মেনুতে ( সেটিংস > অ্যাপস ও নোটিফিকেশন > বিশেষ অ্যাপ অ্যাক্সেস > ওয়াই-ফাই কন্ট্রোল > App name ) গিয়ে এই অনুমোদনটি দিতে পারেন।