API پیشنهاد Wi-Fi برای اتصال به اینترنت

دستگاه‌های دارای Android 10 (سطح API 29) و بالاتر به برنامه شما اجازه می‌دهند اعتبار شبکه را برای اتصال خودکار دستگاه به نقطه دسترسی Wi-Fi اضافه کند. می‌توانید با استفاده از WifiNetworkSuggestion پیشنهادهایی برای اتصال به شبکه ارائه دهید. پلتفرم در نهایت بر اساس ورودی برنامه شما و سایرین انتخاب می‌کند که کدام نقطه دسترسی را بپذیرد.

در Android 11 (سطح API 30) و بالاتر:

  • ارائه یک PasspointConfiguration توسط API پیشنهاد پشتیبانی می شود. قبل از Android 11، تهیه PasspointConfiguration نیاز به استفاده از addOrUpdatePasspointConfiguration() API دارد.
  • این چارچوب الزامات امنیتی را بر روی پیشنهادات سازمانی مبتنی بر TLS (EAP-TLS، EAP-TTLS، و EAP-PEAP) اعمال می کند. پیشنهادات به چنین شبکه‌هایی باید یک Root CA certificate و یک server domain name تنظیم کنند.
  • این چارچوب الزامات مالکیت را برای پیشنهادات سازمانی مبتنی بر EAP-SIM اعمال می کند (EAP-SIM، EAP-AKA، EAP-AKA-PRIME). چنین پیشنهادهایی فقط توسط برنامه هایی مجاز است که توسط شرکت مخابراتی امضا شده باشند.
  • برای پیشنهاداتی که توسط یک برنامه دارای امضای شرکت مخابراتی ارائه می‌شود، چارچوب به‌طور خودکار یک شناسه حامل مطابق با امضای شرکت مخابراتی برنامه به آن‌ها اختصاص می‌دهد. اگر سیم کارت مربوطه از دستگاه حذف شود، چنین پیشنهادهایی به طور خودکار غیرفعال می شوند.

در Android 12 (سطح API 31) و بالاتر:

  • حریم خصوصی اضافی را می توان از طریق تصادفی سازی غیر مداوم MAC فعال کرد، که به صورت دوره ای آدرس MAC تصادفی شده را مجدداً تصادفی می کند. از setMacRandomizationSetting برای تعیین سطح تصادفی سازی شبکه خود استفاده کنید.

  • isPasspointTermsAndConditionsSupported() : شرایط و ضوابط یک ویژگی Passpoint است که به استقرار شبکه اجازه می‌دهد تا پورتال‌های محصور ناامنی را که از شبکه‌های باز استفاده می‌کنند، با شبکه ایمن Passpoint جایگزین کنند. زمانی که شرایط و ضوابط برای پذیرش الزامی است، یک اعلان به کاربر نمایش داده می شود. برنامه‌هایی که شبکه‌های Passpoint را پیشنهاد می‌کنند که با شرایط و ضوابط بسته شده‌اند، باید ابتدا با این API تماس بگیرند تا مطمئن شوند که دستگاه از این قابلیت پشتیبانی می‌کند. اگر دستگاه از این قابلیت پشتیبانی نمی‌کند، نمی‌تواند به این شبکه متصل شود و باید یک شبکه جایگزین یا قدیمی پیشنهاد شود.

  • isDecoratedIdentitySupported() : هنگام احراز هویت در شبکه هایی با تزئین پیشوند، پیشوند هویت تزئین شده به اپراتورهای شبکه اجازه می دهد شناسه دسترسی شبکه (NAI) را برای انجام مسیریابی صریح از طریق چندین پراکسی در داخل یک شبکه AAA به روز کنند (برای اطلاعات بیشتر در این مورد به RFC 7542 مراجعه کنید). .

    Android 12 این ویژگی را برای مطابقت با مشخصات WBA برای برنامه‌های افزودنی PPS-MO پیاده‌سازی می‌کند. برنامه‌هایی که شبکه‌های Passpoint را پیشنهاد می‌کنند که به هویت تزئینی نیاز دارند، ابتدا باید با این API تماس بگیرند تا مطمئن شوند که دستگاه از این قابلیت پشتیبانی می‌کند. اگر دستگاه از این قابلیت پشتیبانی نمی‌کند، هویت تزئین نمی‌شود و ممکن است احراز هویت در شبکه با شکست مواجه شود.

برای ایجاد یک پیشنهاد Passpoint، برنامه‌ها باید از کلاس‌های PasspointConfiguration ، Credential و HomeSp استفاده کنند. این کلاس‌ها نمایه Passpoint را توصیف می‌کنند که در مشخصات Wi-Fi Alliance Passpoint تعریف شده است.

نمونه کد زیر نحوه ارائه اعتبار برای یک شبکه باز، یک شبکه WPA2، یک شبکه WPA3 و یک شبکه Passpoint را نشان می دهد:

کاتلین

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

بلافاصله پس از اینکه اپلیکیشن برای اولین بار پیشنهادی ارائه کرد، به کاربر اطلاع داده می شود. نوع اعلان به نسخه اندرویدی که روی دستگاه اجرا می شود بستگی دارد:

  • در اندروید 11 (سطح API 30) و بالاتر، اگر برنامه در پیش‌زمینه اجرا شود، کاربر یک دیالوگ و اگر برنامه در پس‌زمینه اجرا شود، یک اعلان می‌بیند.
  • در اندروید 10 (سطح API 29)، کاربر بدون توجه به اینکه برنامه در پیش زمینه یا پس زمینه اجرا می شود، یک اعلان را مشاهده می کند.

هنگامی که پلت فرم به یکی از پیشنهادات شبکه متصل می شود، تنظیمات متنی را نشان می دهد که اتصال شبکه را به برنامه پیشنهاد دهنده مربوطه نسبت می دهد.

مدیریت قطع ارتباط کاربر

اگر کاربر از انتخابگر Wi-Fi برای قطع ارتباط صریح از یکی از پیشنهادات شبکه در هنگام اتصال به آن استفاده کند، در این صورت آن شبکه زمانی که هنوز در محدوده است نادیده گرفته می شود. در طول این مدت، آن شبکه برای اتصال خودکار در نظر گرفته نمی‌شود، حتی اگر برنامه پیشنهاد شبکه مربوط به شبکه را حذف کرده و دوباره اضافه کند. اگر کاربر از انتخابگر Wi-Fi برای اتصال صریح به شبکه ای که قبلاً قطع شده است استفاده کند، آن شبکه بلافاصله برای اتصال خودکار در نظر گرفته می شود.

تغییر وضعیت تأیید برای برنامه

کاربری که اعلان پیشنهاد شبکه را رد می کند، مجوز CHANGE_WIFI_STATE را از برنامه حذف می کند. کاربر می‌تواند بعداً با رفتن به منوی کنترل Wi-Fi ( تنظیمات > برنامه‌ها و اعلان‌ها > دسترسی ویژه برنامه > کنترل Wi-Fi > App name ) این تأیید را صادر کند.